我在Android中制作一款简单的游戏。基本上,我希望它以这种方式运行:当应用程序启动时,将出现一个播放屏幕,当检测到玩家与障碍物之间发生碰撞时,游戏将停止并出现AlertDialog。然后播放器点击按钮"重播"然后会再次出现一个播放屏幕。玩家跳跃需要一个OnTouch方法。 一切似乎工作得很好,除了一件事:OnTouch方法在应用程序启动时运行良好,但在我点击"重播"按钮。问题是出现了一个新的播放屏幕,一切都像我编程一样移动,只有OnTouch方法不起作用。 这是我的MainActivity类和GamePanel类的代码:
MainActivity.class:
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
GamePanel gp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
gp = new GamePanel(this);
gp.setOnTouchListener(this);
setContentView(gp);
gp.start();
}
@Override
public boolean onTouch(View v, MotionEvent event) {;
gp.pl.setUp(true);
gp.pl.setClickup(true);
return true;
}
}
GamePanel.java
public class GamePanel extends SurfaceView implements Runnable{
Thread t;
SurfaceHolder s;
Paint p;
Player pl;
ArrayList<Tube>tubes;
MainActivity activity = new MainActivity();
Context c;
public GamePanel(Context context){
super(context);
s = getHolder();
pl = new Player();
p = new Paint();
tubes = new ArrayList<>();
Tube newTube = new Tube(300, 600,300);
tubes.add(newTube);
addTube();
c = context;
}
public void addTube(){
while(tubes.size()<=4){
Tube LastTube = tubes.get(tubes.size()-1);
Random r = new Random();
float yBelow = r.nextInt(450)+300;
float Gap = r.nextInt(300)+150;
Tube newTube;
if(yBelow<Gap+20){
yBelow = yBelow + (Gap - yBelow) + 150;
newTube = new Tube(LastTube.getxAbove()+200, yBelow, Gap);
}
else {
newTube = new Tube(LastTube.getxAbove()+200, yBelow, Gap);
}
tubes.add(newTube);
}
}
@Override
public void run() {
while (true){
if(!s.getSurface().isValid()){
continue;
}
Canvas c = s.lockCanvas();
pl.move();
for(Tube t: tubes){
t.move();
t.replace();
}
c.drawARGB(255,199,222,100);
p.setColor(Color.YELLOW);
c.drawCircle(pl.getX(),pl.getY(),20,p);
for(Tube t: tubes){
c.drawRect(t.getxAbove(),t.getyAbove(),t.getxAbove()+Tube.getWidth(),t.getyBelow()-t.getGap(),p);
c.drawRect(t.getxBelow(),t.getyBelow(),t.getxBelow()+Tube.getWidth(),c.getHeight(),p);
}
for(Tube t: tubes){
if(t.checkCollision(pl,c)){
restart();
}
}
getHolder().unlockCanvasAndPost(c);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void restart(){
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder box = new AlertDialog.Builder(c);
box.setMessage("You Lost");
box.setCancelable(true);
box.setPositiveButton("Replay", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent i = new Intent(c,MainActivity.class);
c.startActivity(i);
}
});
AlertDialog dialog = box.create();
dialog.show();
}
});
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void start(){
t = new Thread(this);
t.start();
}
}
请帮我修理一下。 Ps:我刚刚发现,在我重新开始游戏后,不仅onTouchListener停止工作,而且当我输了时,AlertDialog也会停止出现。后来出现了一个对话框,告诉我&#34;测试没有响应&#34;,尽管两个&#34;播放器&#34;对象和&#34;管&#34;物体仍然按照程序移动。
答案 0 :(得分:1)
我认为您正在使用disabled =true
根据文件:
系统在新任务的根目录下创建活动并将意图路由到该任务。但是,如果活动的实例已经存在,系统会通过调用onNewIntent()方法将意图路由到现有实例,而不是创建新实例。
所以你有两个选择:
我希望它有所帮助。
答案 1 :(得分:0)
尝试在onResume方法中设置onTouchListener,而不是在onCreate中,因为在销毁Dialog并且控件返回到Activity后调用onResume。