sfs2x でビンゴゲームを開発しました。案内しか出来ないので参考になれば幸いです。質問を理解したら、コマンドをトリガーするリクエストまたはイベントなしでコマンドを送信したいと考えています。
コマンド クラスを作成します。パッケージ パスは src フォルダーからの相対パスです。
package com.rcras.bingo1;
public class Commands
{
/** User buys bingo cards */
public static final String CMD_BUY_CARDS = "bc";
/** Server sends Bingo */
public static final String CMD_BINGO = "bo";
/** User Calls Bingo */
public static final String CMD_CALL_BINGO = "bingo";
/** Get the time left till next game */
public static final String CMD_GET_TIMER = "get_timer";
/** No bingos left --- Game Over */
public static final String CMD_GAME_OVER= "gaov";
/** Ready to start a game */
public static final String CMD_READY = "ready";
/** Bingo Draw */
public static final String CMD_DRAW = "draw";
/** tell the client app the game is starting */
public static final String CMD_START = "start";
}
使用したすべてのコマンドが含まれているわけではありません。コマンドはサーバー側のタイマー イベントから送信されるため、イベントまたは要求ハンドラーをセットアップする必要はありません。
「ビンゴゲーム」クラスを作成し、拡張機能からそのクラスを呼び出す必要があります。私の目標は、ゲームを同時に実行する部屋をいくつか用意することでした。ConcurrentHashMap を使用してゲームを追跡しました。
import java.util.concurrent.ConcurrentHashMap;
import com.rcras.bingo1.Commands;
public class Bingo1 extends SFSExtension {
List<User> DiamondRoomPlayers;
Timer timer;
private static int min =2;
private static int sec = 60;
/** Current games */
private ConcurrentHashMap<Integer,BingoGame> games = null;
public ConcurrentHashMap<Integer, BingoGame> getGames() {
return games;
}
public void startDiamondGame()
{
Zone thisZone = this.getParentZone();
Room room2 = thisZone.getRoomByName("Diamond");
BingoGame bingoGame = this.getGames().get(room2.getId());
if(bingoGame == null || (bingoGame != null && bingoGame.isStarted() == false))
{
DiamondRoomPlayers=room2.getUserList();
ISFSObject DiamondObj = new SFSObject();
send(Commands.CMD_START, DiamondObj, DiamondRoomPlayers);
BingoGame DiamondRoomGame = new BingoGame(this, room2);
getGames().put(room2.getId(),DiamondRoomGame);
DiamondRoomGame.setId(room2.getId()) ;
DiamondRoomGame.init();
}
}
BingoGame クラスには、抽選をトリガーするタイマーがあります。
public class BingoGame {
public BingoGame(Bingo1 ext, Room room)
{
Draw= new int[75];
setPlayers(room.getUserList());
//players = room.getUserList();
thisRoom = room;
this.extension=ext;
//setters
this.setFirstBingo(true);
this.setStarted(false);
this.setSecondBingo(true);
this.setFirstPrize(1000);
this.setSecondPrize(500);
}
public void init()
{
if(players.size() > 0)
{
StartBingoGame();
}
else
{
System.out.println("NOT ENOUGH PLAYER IN THE" + thisRoom.getName() + " Room!" );
}
}
private void StartBingoGame()
{
timer = new Timer();
timer.schedule(new BingoDrawTask(),
0, //initial delay
1*3000); //draw a number every 3 seconds
setStarted(true); //setter for started variable
}
class BingoDrawTask extends TimerTask {
private int BingoNum;
private boolean isThere = true;
@Override
public void run() {
isThere = true;
Random BingoCall = new Random();
while( isThere == true)
{
BingoNum = BingoCall.nextInt(75) + 1;
System.out.println("Bingo Draw:" + BingoNum);
isThere = CheckDrawArray(BingoNum);
}
Draw[NunbersCalled]=BingoNum;
NunbersCalled = NunbersCalled + 1;
System.out.println(thisRoom.getName() + " Room: Draw Number: " + NunbersCalled);
//this should never happen but it's there for testing
if (NunbersCalled == 75)
{
System.out.println("STOP!!!" );
StopBingoGame();
}
// Empty obj
ISFSObject numObj = new SFSObject();
numObj.putInt("cn", NunbersCalled);
numObj.putInt("dn", BingoNum);
numObj.putUtfString("rn", thisRoom.getName());
/*This command 'pushes' the command to a player list named players
extension.send(Commands.CMD_DRAW, numObj, players);
System.out.println("Send ----" + BingoNum);
}
クライアント側で
イベントリスナーを追加する
sfs.addEventListener(SFSEvent.EXTENSION_RESPONSE, onExtensionResponse);
ハンドラーを追加する
private function onExtensionResponse(evt:SFSEvent):void
{
var obj:SFSObject = evt.params.params as SFSObject;
if(evt.params.cmd == "draw")
{
//Handle draw - mostly handled by BingoCard class
}
}
私はこれを簡潔にしようとしましたが、そうはなりませんでした。プッシュを達成した方法を示すのに十分なコードを提供できたと思いますか? 私の「ビンゴゲーム」で。