Lựa chọn giao thức cho game idle/simulator: Websocket hay HTTP hay cả hai?
Em đang làm một game dạng idle/simulator/defense - thể loại SPRG.
<p>
</p>
<p>
Game mechanic là xếp formation một lượng character cho trước vào grid[row,column] tương ứng. Sau khi có được dữ liệu formation,
</p>
<p>
Lựa chọn đối thủ (có formation) và nhấn Tấn công. (xếp đội hình trước hoặc sau match tùy trường hợp - hoặc vào ranking thấy formation của đối thủ rồi mới tấn công, hoặc đi arena thì random chọn ra 1 đối thủ same ELO để tấn công - lúc này chỉ thấy id đối thủ, người chơi không thấy formation)
</p>
<p>
</p>
<p>
Request để tiến hành tấn công lần lượt theo turn cho đến khi một trong hai bên không còn character nào trong formation.
</p>
<p>
Response là kết quả thắng thua và Queue của mỗi turn (data của attacker và victims)
</p>
<p>
</p>
<p>
Client chỉ diễn hoạt lại Queue này.
</p>
<p>
</p>
<p>
Ý tưởng là vậy, nhìn chung em định làm HTTP vì nghĩ đến việc dễ test bằng dữ liệu thô mà không cần client side.
</p>
<p>
Nhưng rồi em thấy trong game-box nói riêng và ezyfox-server nói chung được thiết kế theo phương thức websocket.
</p>
<p>
Em nghĩ làm websocket cũng được thôi!? Nhưng vậy:
</p>
<ul>
<li>Liệu có test được không? (bằng postman chẳng hạn)
</li>
<li>Liệu có cách nào vừa websocket (mọi hoạt động khác trừ battle) và chỉ HTTP cho battle? (như vậy có rườm rà không?)
</li>
<li>Và còn vấn đề gì không?
</li></ul>
<p>
.
</p>
<p>
Em cảm ơn
</p>
Không serialize được list ở C<h1>client sdk</h1>
Em trả về 1 <code>List</code> ở server. Nhưng khi gọi <code>List roomIdList = data.get(0).toList();</code> ở client thì báo lỗi không cast được. Cụ thể ở hàm <code>toList</code> :
<p>
</p>
<pre>
public List toList()
{
List answer = new List();
foreach (Object item in list)
{
answer.Add((T)item);
}
return answer;
}
</pre>
Làm sao add lobby room vào globalRoomManager khi khởi tạo
Em dùng <code class="markdown-inline">@EzyConfigurationBefore</code> để khởi tạo <code class="markdown-inline">lobbyRoom</code>:
<pre>
@EzyConfigurationBefore
public class MMOVirtualWorldConfig extends EzyLoggable {
@EzySingleton("lobbyRoom")
public NormalRoom lobbyRoom() {
logger.info("Initialize lobby room");
return NormalRoom.builder()
.build();
}
}
</pre>
<p>
</p>
<p>
Trong <code class="markdown-inline">GameService</code> lại có 1 thằng roomManager để quản lý toàn bộ rooms:
</p>
<p>
</p>
<pre>
@Setter
@EzySingleton
public class GameServiceImpl implements GameService {
private final RoomManager roomManager
= new SynchronizedRoomManager();
}
</pre>
<p>
</p>
<p>
Em muốn add thêm lobbyRoom vào roomManager khi khởi tạo nó. Vậy em có nên khởi tạo <code class="markdown-inline">roomManager</code> theo kiểu <code class="markdown-inline">@EzyConfigurationBefore</code> không anh?
</p>
Khi nào dùng SynchronizedPlayerManager vs. DefaultPlayerManager
Em thấy trong code breaking-game anh dùng DefaultPlayerManager để quản lý Player của toàn bộ game. Sao anh không dùng SynchronizedPlayerManager ạ?
EzyWrap khác gì String thường?
<a href="https://github.com/youngmonkeys/game-box/blob/master/src/test/java/com/tvd12/gamebox/testing/MMORoomGroupTest.java#L103" target="_blank" rel="noopener">https://github.com/youngmonkeys/game-box/blob/master/src/test/java/com/tvd12/gamebox/testing/MMORoomGroupTest.java#L103</a>
<p>
</p>
<p>
Trong MMORoomGroupTest em thấy a có dùng EzyWrap. Sao phải dùng nó và khi nào nên dùng nó ạ?
</p>
Cách test MMORoom
Em đang code cái <code class="markdown-inline">MMORoom</code> ở <a href="https://github.com/youngmonkeys/game-box/pull/2">https://github.com/youngmonkeys/game-box/pull/2</a>. Em có 1 số câu hỏi:
<p>
</p>
<ol start="1">
<li>Ở <code class="markdown-inline">NormalRoom</code>, thằng playerManager là raw type, làm sao chuyển nó thành <code class="markdown-inline">PlayerManager</code> ở MMORoom.
</li>
</ol>
<p>
</p>
<ol start="2">
<li>Với vòng lặp vô hạn ở <code class="markdown-inline">MMORoom</code>, mình viết unit test kiểu gì vậy ạ?
</li>
</ol>
<p>
</p>
<ol start="3">
<li>Cái vòng lặp trong <code class="markdown-inline">MMORoom</code> có cần làm gì khác ngoài set cái nearby players không ạ?</li></ol>
Usecases của các loại Room trong game-box
Hiện tại em thấy có 3 loại room trong game-box: <code class="markdown-inline">NormalRoom</code>, <code class="markdown-inline">LocatedRoom</code> và <code class="markdown-inline">MMORoom</code> (đang phát triển). Anh có thể giải thích sự khác nhau và usecases cụ thể của từng loại được không ạ?
<p>
</p>
<p>
Anh có thể giải thích luôn về logic từng loại <code class="markdown-inline">Player</code> và <code class="markdown-inline">PlayerManager</code> được không ạ?
</p>
Các loại PlayerManager trong game-box
<ol>
<li>Cho em hỏi sự khác nhau giữa <code class="markdown-inline">LocatedPlayerManager</code> và <code class="markdown-inline">SimplePlayerManager.</code> Tại sao thằng <code class="markdown-inline">LocatedPlayerManager</code> không extends thằng <code class="markdown-inline">PlayerManager</code>?</li>
<li>Thằng <code class="markdown-inline">MMOPlayerManager</code> nên có logic như nào và extends thằng nào vậy ạ?</li>
</ol>
LocatedRoom khác gì Room
LocatedRoom có thêm chức năng quản lý slots, sao mình không đưa nó vào Room được ạ? MMORoom có nên extends LocatedRoom thay vì Room, vì nó cũng cần quản lý slots?
Warning khi dùng synchronized
Em thấy có warnings ở chỗ <code>synchronized (gameService)</code> và <code>synchronized (room)</code>. Anh giải thích giúp em vì sao có warnings này được không ạ?
<p>
</p>
<img class="alignnone size-large wp-image-438" src="https://stackask.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-02-at-00.23.15-1024x640.png" alt="" /> <img class="alignnone size-large wp-image-439" src="https://stackask.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-02-at-00.23.43-1024x640.png" alt="" />
Vì sao không debug được LocatedRoom và LocatedPlayer
Cho em hỏi thằng LocatedRoom và LocatedPlayer có gì đặc biệt mà debugger nó không nhận 2 biến room và player vậy ạ?
<p>
</p>
<img class="alignnone size-large wp-image-429" src="https://stackask.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-02-at-00.16.56-1024x660.png" alt="" />
Tại sao lại phải có playerManager trong GameService?
Trong hàm <code class="markdown-inline">findAvailableRoom</code> của GameService có gọi <code class="markdown-inline">room.addUser(user, player)</code>. Hàm <code class="markdown-inline">addUser</code> lại gọi <code class="markdown-inline">this.playerManager.addPlayer(player, location)</code>.
<p>
</p>
<p>
Cho em hỏi thằng <code class="markdown-inline">playerManager</code> của <code class="markdown-inline">GameService</code> khác gì <code class="markdown-inline">playerManager</code> của từng room vậy ạ?
</p>
<p>
</p>
<img class="alignnone size-large wp-image-424" src="https://stackask.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-02-at-00.03.55-1024x453.png" alt="" />
<p>
</p>
<p>
</p>
<p>
</p>
<img class="alignnone size-large wp-image-425" src="https://stackask.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-02-at-00.05.39-1024x453.png" alt="" />