1

问候 Stackoverflowians

我正在开发一个 Android 纸牌游戏应用程序。我已经将整个游戏的动态放入我使用状态设计模式(状态机)实现的 GameClass 中,考虑到处于游戏特定状态的两个玩家中的任何一个都将有不同的可用动作。

例如,当游戏开始时,玩家 A 只能执行 GameClass 共有的 21 个方法中的 5 个。根据打出的动作和卡牌,方法会转换不同的状态,并且在每个不同的状态下,都会有不同的方法可用。

因此,我通过一个名为 CurrentActions 的类解决了不同方法的可用性问题,该类为每个方法设置和获取布尔值。所以,如果我想向玩家展示他在游戏开始时可以选择的动作,我有一系列的 IF(大约 21...)检查是否有任何 Getter 设置为 true,如果它们是我将按钮添加到布局中,一切都像魅力一样。

现在,我最大的问题是我不知道如何显示第一个状态的按钮,然后一旦玩家 A 点击其中一个按钮(方法),清除之前状态中可用的所有按钮,现在显示游戏所处的新状态的新按钮。

有没有办法做到这一点?我已经使用 Layout.removeAllViews() 方法清除所有按钮,但是根据以下状态重新设置所有按钮是我最大的问题。我真的很感激关于这个问题的任何指导。

为了响应您查看一些代码的请求,我在我的 Activity 中添加了处理游戏、布局、按钮和可能操作的代码:

// CurrentActions CA holds the current actions that are available 
//for the current State of the game.
final CurrentActions CA = new CurrentActions();

//JuegoTruco JT is the game itself

    final JuegoTruco JT = new JuegoTruco(CA);

//I've changed the names up to make it understandable
//If Action1 is performable at the current State of the game, set the button up and
//await a posible Click 
    if(CA.performAction1())
    {
        Action1Button = new Button(this);
        Action1Button.setId(13);
        Action1Button.setLayoutParams(paramsActions);
        Action1Button.setText("Action1");
        layoutAcciones.addView(Action1Button);
        Action1Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TOGGLE_ON_CLICK) {
                    mpButton.start();

//Here I change the state of JT, by performing an action and 
//I also give it instance CA, so the State Handler
//can change the available Actions for the following state

                    JT.performAction(otherParameters, CA);
                    layoutActions.removeAllViews();

                }
            }
        });
    }
if(CA.performAction2())
    {
        Action2Button = new Button(this);
        Action2Button.setId(13);
        Action2Button.setLayoutParams(paramsActions);
        Action2Button.setText("Action2");
        layoutAcciones.addView(Action2Buttonn);
        Action2Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TOGGLE_ON_CLICK) {
                    mpButton.start();
                    JT.performAction2(OtherParameters, CA);
                    layoutActions.removeAllViews();

                }
            }
        });
    }

对于游戏中存在的每一个动作,我都会使用其中一个 IF。所以....在我单击一个可用按钮(根据游戏状态)后,有没有办法清除 actionsLayout 并执行一组新的按钮并在每次按下按钮后连续执行此操作(即:状态的每一次变化)?

4

1 回答 1

0

我认为最简单的方法是让 Activity 确定 onCreate() 中的状态并相应地创建有效的按钮(听起来这就是你在做什么)。

现在,无需操作现有视图(随着复杂性的增加这可能会很痛苦),只需重新启动 Activity,使用与以前相同的代码重新创建游戏。

// Move to new state
startActivity(new Intent(MainActivity.this, MainActivity.class));

如果用户按下后退按钮,这可能会导致一些问题,尽管后退仍会显示正确的状态,但这会令人困惑。至少这是我的看法。为了防止这种情况:

@Override
public void onBackPressed() {
    // confirm exit being a dialog, this just mocks the intent of the code
    if (confirmExit()) {
          Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
    }
}

Eyecandy:您可以定义活动之间的过渡,使其看起来更酷。

MainActivity 的 onCreate() 中从左到右转换的示例:

overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

这里是 /res/anim/slide_in_right.xml 和 anim.slide_out_left.xml:

/// in_right
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >

<translate
    android:duration="200"
    android:fromXDelta="100%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />

</set>

// out_left
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false" >

<translate
    android:duration="200"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="-100%"
    android:toYDelta="0%" />

</set>

这个问题当然有很多答案。虽然老实说,我认为这是我能想到的最容易编程、阅读和维护的。

片段:这种方法以后可以通过片段进行改进。这会给你的应用程序带来同样的改进,就像 Ajax 对基于服务器的网站所做的一样(这是我认为最合适的类比)。然而,这超出了本文的范围。只是想提一下。

最后一点,与在活动中添加/删除视图相比,我对解决方案的建议将来迁移到基于片段的痛苦要小得多。

于 2013-09-27T18:26:33.390 回答