我希望在玩家死亡时进行布局(游戏超过布局)。 我试过这样的话:
View GameOverDialog;
LayoutInflater myInflater = (LayoutInflater)getApplicationContext().getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
GameOverDialog = myInflater.inflate(R.layout.lose, null, false);
rlGame.addView(GameOverDialog);
GameOverDialog.setVisibility(View.GONE);
当玩家死亡时:
private void lose(){
GameOverDialog.setVisibility(View.VISIBLE);
}
我也使用Handler,这样我就可以在玩家死亡时发送消息:
final static int DEATH = 0, LOSE = 1;
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == DEATH) {
//play music
postDelayed(new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.what = LOSE;
handler.sendMessage(msg);
}
}, 1000);
}
if (msg.what == LOSE) {
lose();
}
super.handleMessage(msg);
}
};
但是当Handler调用lose()方法时,应用程序崩溃并且我得到一个NullPointerException。 我希望有人可以帮助我:)。
提前致谢!
Joeri。
修改
全班:
public class Game extends Activity {
final static int DEATH = 0, LOSE = 1;
RelativeLayout rlGame;
GamePanel game_panel;
private int ScreenWidth, ScreenHeight;
View GameOverDialog;
ImageView retry, quit;
TextView textRetry, textQuit;
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == DEATH) {
//play music
postDelayed(new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.what = LOSE;
handler.sendMessage(msg);
}
}, 1000);
}
if (msg.what == LOSE) {
lose();
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
rlGame = (RelativeLayout) findViewById(R.id.rlGame);
DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
final int height = dm.heightPixels;
final int width = dm.widthPixels;
game_panel = new GamePanel(getApplicationContext(), width, height, rlGame);
rlGame.addView(game_panel);
LayoutInflater myInflater = (LayoutInflater)getApplicationContext().getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
GameOverDialog = myInflater.inflate(R.layout.lose, null, false);
rlGame.addView(GameOverDialog);
retry = (ImageView) GameOverDialog.findViewById(R.id.retry);
retry.setOnTouchListener(new TouchButton(retry, textRetry));
quit = (ImageView) GameOverDialog.findViewById(R.id.quit);
quit.setOnTouchListener(new TouchButton(quit, textQuit));
textRetry = (TextView)GameOverDialog.findViewById(R.id.textRetry);
textQuit = (TextView)GameOverDialog.findViewById(R.id.textQuit);
GameOverDialog.setVisibility(View.GONE);
}
@Override
public void onBackPressed() {
}
@Override
protected void onStop() {
super.onStop();
}
private void lose() {
GameOverDialog.setVisibility(View.VISIBLE);
}
}
我也尝试在onBackPressed方法中设置VISIBLE的可见性,这个工作,我不知道为什么,但是在处理程序中出错了我想...
答案 0 :(得分:1)
当您不必使用时,请避免使用getApplicationContext()
:
game_panel = new GamePanel(this, width, height, rlGame);
rlGame.addView(game_panel);
LayoutInflater myInflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
修改强>
根据您的评论(下次,请更新您的问题),似乎在设置变量的onCreate
之前调用handleMessage。所以在初始化字段后设置你的监听器:
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Init field
GameOverDialog = myInflater.inflate(R.layout.lose, null, false);
// Set the handler
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == DEATH) {
//play music
postDelayed(new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.what = LOSE;
handler.sendMessage(msg);
}
}, 1000);
}
if (msg.what == LOSE) {
lose();
}
super.handleMessage(msg);
}
};
...
}