7

これは私の最初の投稿であり、同様のものが見つからなかったので、質問することにしました.

SDK を練習し、Java を更新/改善するために Android 用のポーカー ゲームを開発しています。テキサス ホールデム ポーカーの手を制御するシンプルなアプリです。

最初は、Java SE のみを使用してクラスを作成しましたが、問題ないように見えます。各クラスには独自の目的があり、コンソールの入出力でテストすると、実際に機能することがわかります:)

先週、私はそれを Android に移植して、グラフィック インターフェースで何が起きているかを確認することにしました。そのため、リソース イメージを取得し、Activity を作成して、私のポーカー パッケージを含めました。

Android に移植する前に、println (または readLine) を配置して、何が起こっているかを確認し、入力を送信できます。ここで、各クラスがゲーム アクティビティと通信して、描画する必要があるものを提供する方法にこだわっています。できれば、ゲーム クラス内に Android の描画コードを挿入したくありません。アクティビティとゲーム クラスの間でメッセージを交換する方法を見つけようとしています。Androidアプリの開発は初めてなので、これを行うためのすべてのメカニズムを知りません。

以下は私の活動のスニペットです:

package my.poker.game;

//import stuff

public class ActivityHand extends Activity
{
private static Vector<Player> Players = new Vector<Player>();
public static final int MAX_PLAYERS = 8;

public static void startEmptyTable()
{
    Players.removeAllElements();
    Players.setSize(MAX_PLAYERS);
}

public static void LeaveTable(int pos)
{
    Players.set(pos, null);
}

public static void SitTable(int pos, Player player)
{
    Players.set(pos, player);
}

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        int cash = 1000;

        startEmptyTable();

        SitTable(0, new Jogador("William", cash));
    SitTable(2, new Jogador("Richard", cash));
    SitTable(4, new Jogador("John", cash));
    SitTable(6, new Jogador("Paul", cash));
    SitTable(8, new Jogador("Albert", cash));

    //Start a Hand.... in future this will be a loop for each Hand
        Hand hand = new Hand(Players);
    }
}

オブジェクト ハンドは、ディーラーを選択し、カードを配り、スモール ブラインドとビッグ ブラインドをコントロールし、ゲーム ループを開始します。

問題は、hand クラスが Activity に Draw を指示し、何を描画するかを含むオブジェクトを渡すにはどうすればよいかということです。

助けてくれてどうもありがとう


編集: ハンドラーを使用して簡単なメッセージを渡すことを実装してみることにしました。Handler at Developersから読み取ったように、Handler オブジェクトがスレッドの MessageQueue に割り当てられているため、これをアクティビティ クラスに入れようとしました (Hand hand = new Hand (...) の前):

Handler handler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {

        Bundle bundle = msg.getData();

        // Do something with message contents
    }
};

そして、何かを描きたいときは、Hand クラス内にこれを置きます。

Handler handler = new Handler();
Message msg = new Message();
Bundle bundle = new Bundle();

bundle.putString("Key", "The Key's Value");
msg.setData(bundle);
handler.sendMessage(msg);

私が理解しているように、両方のハンドラーは同じスレッドからのものであるため、同じ MessageQueue に割り当てられていますか? Hand クラス内でメッセージを送信すると、Activity クラスは handleMessage メソッドでメッセージを受信し、送信したメッセージを処理できるようになりましたが、handleMessage は実行されません。

私は何が欠けていますか?

再度、感謝します

4

4 に答える 4

3

アクティビティでメソッドを呼び出すには、アクティビティをこのクラスに渡します。

例えば:

    public class PokerActivity extends Activity
        {

           @Override
           public void onCreate(Bundle savedInstanceState)
           {
                Hand hand = new Hand(this);
           }

           public void setVisibleHand(Player player)
           {
            <do something in the activity>
           }

        }

    public class Hand
    {
      PokerActivity pokerActivity;
      public Hand(PokerActivity activity)
      {
        this.pokerActivity = activity;
      }

      public void setVisibleHand()
      {
        pokerActivity.setVisibleHand(player1);
      }
    }

さて、これは最善の方法ではないかもしれません。Android では、コンテキストをリークしないように注意する必要があります。そうしないと、メモリに問題が発生する可能性があります。(単純にアクティビティ/コンテキストを渡すのが簡単な方法かもしれませんが、コンテキストをリークする最も簡単な方法でもあります。)

最初にいくつかの簡単なチュートリアルを見て、Android アクティビティがどのように機能するかを理解することをお勧めします。

于 2012-10-17T15:11:19.420 に答える
2

HandlerおよびMessageシステムを使用して、クラス間で通信できます。

Lars Vogel によるこのチュートリアルは、Android のスレッド、ハンドラー、および AsyncTask に役立つはずです - チュートリアル

于 2012-10-17T15:01:16.190 に答える
1

独自のクラスおよびアクティビティ自体と対話するには、別のクラスを作成する必要があります。そのクラスから、アクティビティ コンテキストを使用して Android アクティビティを制御できます。ハンドラーとメッセージを使用するアプローチは適切ですが、ゲーム クラスを変更する必要があります。

于 2012-10-17T15:03:03.353 に答える
-1

View Class を拡張して Hand を描画する必要があるかもしれません。

http://developer.android.com/reference/android/view/View.html

于 2012-10-17T15:20:05.763 に答える