0

多くのドキュメントはありませんが、サーバー側の拡張機能の記述に関するセクションは次のとおりです。

http://docs2x.smartfoxserver.com/AdvancedTopics/server-side-extensions

そして、ここに機能リストがあります:

http://docs2x.smartfoxserver.com/Overview/sfs2x-features

プッシュまたはキューについての言及はありません。

smartfoxサーバーを使用したビンゴゲームがあり、たとえばボールを呼び出すためにそれを使用しているに違いありません.

これは SFS2x を使用して実行できますか? プッシュ通知と、理想的にはクライアントのグループにプッシュされるアイテムのキューをサポートしていますか? もしそうなら、誰かがソースコードや例を持っていますか?

残念ながら、SFS フォーラムは閉鎖されており、投稿することはできません。

4

2 に答える 2

0

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
        }
    }

私はこれを簡潔にしようとしましたが、そうはなりませんでした。プッシュを達成した方法を示すのに十分なコードを提供できたと思いますか? 私の「ビンゴゲーム」で。

于 2013-07-27T00:05:03.700 に答える
0

プッシュ コネクテッド ゲーム機能のHTML5 サンプル ゲーム ウォークスルーをお試しください

この助けを願っています。

于 2013-07-27T15:17:22.753 に答える