我正在制作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;
答案 0 :(得分:0)
我认为你应该将game()调用放在onResume()中。
答案 1 :(得分:0)
有很多方法可以解决这个问题:
使用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());
使用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?的代码。
在游戏活动中使用静态方法
这是最简单的方法,但非常气馁。因为我们无法确保活动的状态。 不在生产代码中使用此功能。这只是为了学习。
您可以将game()
方法设为静态方法,如下所示:
public class GameActivity extends Activity {
...
public static void game() {
// game logic.
}
}
然后在需要时调用该方法:
GameActivity.game();