立即响应按钮单击

时间:2014-01-17 16:36:15

标签: android multithreading

我正在制作一个蛇游戏,但它有效,但有一个小虫子真的让我感到烦恼。 当我点击xml中的一个按钮时,蛇会根据按钮改变它的方向。

问题是,如果你已经在线程的run()内部重新进入循环后点击了一个按钮,并进入了onDraw()里面的循环(你可以在代码中看到)它将首先完成run()的循环,然后重新进入并转弯。并且由此产生从点击时间到转动时间的延迟。

转弯就像这样 - 有一个String变量可以“LEFT”,“RIGHT”,“UP”或“DOWN”,根据它移动蛇的方式。当你点击一个按钮时,它会根据你点击的按钮改变变量。

下面是关于它如何使蛇按照方向移动的代码:

public void onDraw(Canvas canvas){
    switch(direction){
    case "RIGHT"
        xLoc=xLoc+PART_SIZE;
    break;
    case "UP"
        yLoc=yLoc-PART_SIZE;
    break;
    case "LEFT"
        xLoc=xLoc-PART_SIZE;
    break;
    case "DOWN"
        yLoc=yLoc+PART_SIZE;
    break;
    }//swich
    int x=xLoc;
    int y=yLoc;
        for(BodyPart bp:WholeBody){
            Rect r=new Rect();
            r.set(0+x, 0+y, PART_SIZE+x, PART_SIZE+y);
            bp.setR(r);
            canvas.drawRect(bp.getR(),bp.getP());
            int xtemp=bp.getX();
            int ytemp=bp.getY();
            bp.setX(x);
            bp.setY(y);
            x=xtemp;
            y=ytemp;
        }//for each 
}//onDraw

xLoc和yLoc是蛇的头部将到达的位置,并且它移动每个身体部位(蛇的每个矩形 - 每个身体部分是一个相等的直肠)身体部位的位置在它之前。

这里是onClick()s:

 left.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(gv.snake.getDir()!="LEFT"&&gv.snake.getDir()!="RIGHT"){
            gv.snake.Left();
            }
        }
    });
    right.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(gv.snake.getDir()!="RIGHT"&&gv.snake.getDir()!="LEFT"){
            gv.snake.Right();   
            }
        }
    });
    up.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(gv.snake.getDir()!="UP"&&gv.snake.getDir()!="DOWN"){
            gv.snake.Up();  
            }
        }
    });
    down.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(gv.snake.getDir()!="DOWN"&&gv.snake.getDir()!="UP"){
            gv.snake.Down();
            }
        }
    });

gv是一个来自gameView类的变量,它有一个来自类snake的变量

这里是setDirection:

public void Left(){
        direction="LEFT";
}
public void Up(){
        direction="UP";
}
public void Right(){
        direction="RIGHT";
}
public void Down(){
        direction="DOWN";
}

这是线程的运行:

public void run() {
        long stepPerSecond=1000/FPS;
        long startTime;
        long sleepTime;
        while(isRunning){
            Canvas c= null;
            startTime=System.currentTimeMillis();

            try{
                c=this.getHolder().lockCanvas();
                synchronized (this.getHolder()) {
                    this.onDraw(c);
                    }
            }
            catch(Exception e){
            }
            finally{
                if(c!=null){
                    this.getHolder().unlockCanvasAndPost(c);
                }

            }
            sleepTime= stepPerSecond-(System.currentTimeMillis()-startTime);
            if(sleepTime>0)
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            else
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }

    }

有些人不会有那种延迟吗?

maby当你点击一个按钮时它将停止run()并在它根据点击更新了方向变量后重做它。

0 个答案:

没有答案