在开始活动后调用方法

时间:2017-12-03 12:35:33

标签: java android android-activity

我正在制作Android游戏鼹鼠。我有主要的活动,基本上是发射器,当您按下播放按钮时,游戏活动开始。这很好,因为它显示背景图像和所有molehills但我不知道如何调用方法来启动游戏。 我试图从内部onCreate()调用它,但这最终会“玩游戏”本身。 我试图在startActivity(intent)之后调用它但应用程序崩溃了。而且我也试图创建一个游戏类的实例,并在启动活动后调用play()方法,但它也不起作用。一旦游戏活动加载,我不知道如何启动游戏方法。

我希望我解释得很好,谢谢。

public class MainActivity extends AppCompatActivity {
    ImageButton btnStart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Hide TitleBar
        try { this.getSupportActionBar().hide();}
        catch (NullPointerException e){}

        setContentView(R.layout.activity_main);

        btnStart = (ImageButton)findViewById(R.id.btnStart);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), GameView.class);
                startActivity(intent);
            }
        });
    }        

这是game_activity的代码

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Hide TitleBar
    try { this.getSupportActionBar().hide();}
    catch (NullPointerException e){}

    setContentView(R.layout.activity_game_view);

    game();
}

game()方法是典型的游戏循环。

public void game() {

    Random random = new Random();
    int index;

    /*
     * Casting array to store all ImageView on the game
     */
    imgViewArray[0] = (ImageView)findViewById(R.id.img1);
    imgViewArray[1] = (ImageView)findViewById(R.id.img2);
    imgViewArray[2] = (ImageView)findViewById(R.id.img3);
    imgViewArray[3] = (ImageView)findViewById(R.id.img4);
    imgViewArray[4] = (ImageView)findViewById(R.id.img5);
    imgViewArray[5] = (ImageView)findViewById(R.id.img6);
    imgViewArray[6] = (ImageView)findViewById(R.id.img7);
    imgViewArray[7] = (ImageView)findViewById(R.id.img8);
    imgViewArray[8] = (ImageView)findViewById(R.id.img9);
    imgViewArray[9] = (ImageView)findViewById(R.id.img10);

    int j=0;

    while (j < 10) {

        // Get a random image to animate
        index = random.nextInt(10);


        switch(index) {
            case 0: imgViewArray[0].setImageResource(images[6]);
                new java.util.Timer().schedule(
                        new java.util.TimerTask() {
                            @Override
                            public void run() {
                                imgViewArray[0].setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View v) {
                                        imgViewArray[0].setImageResource(images[0]);
                                    }
                                });
                            }
                        },
                        300 // The code executes after 300ms
                );
                break;

2 个答案:

答案 0 :(得分:0)

我认为你应该将game()调用放在onResume()中。

答案 1 :(得分:0)

有很多方法可以解决这个问题:

  1. 使用EventBus
    从主要活动发送开始游戏事件并注册游戏活动中的事件。

    这是我最喜欢的处理问题的方法。这是因为简单并阻止我们紧密耦合代码。使用EventBus的主要问题是如果应用程序中有太多事件,我们将在事件的海洋中迷失。

    怎么做: 首先,创建事件。这只是一个简单的类:

    public class StartGameEvent {
    }
    

    其次,在游戏活动中注册活动:

    public class GameActivity extends Activity {
    
       protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
    
         ...
         EventBus.getDefault().register(this);
       }
    
       protected void onDestroy() {
         super.onDestroy();
         EventBus.getDefault().unregister(this);
       }
    }
    

    第三,订阅活动:

    public class GameActivity extends Activity {
      ...
    
      @Subscribe
      public void onMessageEvent(StartGameEvent event) {
        game();
      }
    }
    

    最后,从主要活动发送事件:

    EventBus.getDefault().post(new StartGameEvent());
    
  2. 使用LocalBroadcastManager
    您需要创建消息并从主要活动中广播:

    Intent intent = new Intent("playEvent");
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
    

    然后,在游戏活动中,您需要注册为接收者:

    @Override
    public void onCreate(Bundle savedInstanceState) {
      // register for the event
      LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver,
       new IntentFilter("playEvent"));
    }
    
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        game();
      }
    };
    
    @Override
    protected void onDestroy() {
      // Unregister here
      LocalBroadcastManager.getInstance(this)
                           .unregisterReceiver(mReceiver);
      super.onDestroy();
    }
    

    我为您的案例稍微修改了How to use LocalBroadcastManager?的代码。

  3. 在游戏活动中使用静态方法
    这是最简单的方法,但非常气馁。因为我们无法确保活动的状态。 在生产代码中使用此功能。这只是为了学习。

    您可以将game()方法设为静态方法,如下所示:

    public class GameActivity extends Activity {
        ...
      public static void game() {
        // game logic.
      }
    }
    

    然后在需要时调用该方法:

    GameActivity.game();