不知道怎么放的AsyncTask code到游戏 [英] Dunno how to put asynctask code into game

查看:129
本文介绍了不知道怎么放的AsyncTask code到游戏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做球onTouchListener的一个简单的游戏。然而,因为它提请每50 milseconds屏幕-.-所以我尝试使用AsyncTask的,但我不知道如何真正用它绘制游戏运行速度很慢。
如果任何人都可以解释写什么或写正确的code,我会很感激。

下面是完整的code:

公共类MainActivity扩展ActionBarActivity实现View.OnTouchListener {

  OurView伏;
位图球;
浮动的x,y;
位图;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    V =新OurView(本);    球= BitmapFactory.de codeResource(getResources(),R.drawable.blueball);
    v.setOnTouchListener(本);
    X = getWindowManager()getDefaultDisplay()的getWidth()/ 2。。
    Y = getWindowManager()getDefaultDisplay()的getHeight()/ 2。。
    的setContentView(五);
}@覆盖
保护无效的onPause(){
    super.onPause();
    v.pause();
}@覆盖
保护无效onResume(){
    super.onResume();
    v.resume();
}@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
    返回false;
}
公共类OurView扩展SurfaceView实现Runnable {    螺纹TR = NULL;
    布尔isItOk = FALSE;
    SurfaceHolder持有人;    公共OurView(上下文的背景下){
        超级(上下文);
        支架= getHolder();
    }
    @覆盖
    公共无效的run(){        而(isItOk)
        {
            如果(!holder.getSurface()。的isValid()){
                继续;
            }
            帆布C = holder.lockCanvas();
            c.drawARGB(255,5,5,10);
            c.drawBitmap(球,X-(ball.getWidth()/ 2),γ-ball.getHeight()/ 2,为空);
            holder.unlockCanvasAndPost(C);
        }    }    公共无效暂停(){
        isItOk = FALSE;        而(真){
            尝试{
                tr.join();
            }赶上(InterruptedException的E){
                e.printStackTrace();
            }
            打破;        }
        TR = NULL;
    }    公共无效简历(){
        isItOk = TRUE;
        TR =新主题(本);
        tr.start();
    }
}

}

 公共类嘿扩展的AsyncTask<太虚,太虚,太虚>实现View.OnTouchListener

{

  @覆盖
在preExecute保护无效(){
    super.on preExecute();}
@覆盖
保护无效doInBackground(虚空...... PARAMS){
    返回null;
}@覆盖
保护无效onPostExecute(虚空结果){
    super.onPostExecute(结果);}
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
    尝试{
        视频下载(50);
    }
    赶上(InterruptedException的E){
        e.printStackTrace();
    }
    开关(event.getAction()){
        案例MotionEvent.ACTION_DOWN:
            ball.x = event.getX();
            ball.y = event.getY();
            打破;
        案例MotionEvent.ACTION_UP:
            ball.x = event.getX();
            ball.y = event.getY();
            打破;
        案例MotionEvent.ACTION_MOVE:
            ball.x = event.getX();
            ball.y = event.getY();
            打破;
    }
    返回true;
}


解决方案

哇,这是AsyncTask的总滥用。不是在每一个AsyncTask的功能上的另一只线程做doInBackground运行。因此,在您onTouch功能,你在睡觉50ms的主线程上的每个触摸向下,向上,和移动。是啊,你的code是要像狗屎运行。如果您想速​​率限制您的绘图,你想要做它在您的表面持有人的线程的运行循环,而不是当处理输入。

I did a simple game of ball and onTouchListener. However, the game runs very slow because it draws every 50 milseconds the screen -.- so I am trying to use AsyncTask but I dunno how to actually draw with it. If anyone could explain what to write or write the correct code I'll be grateful.

Here's the complete code:

public class MainActivity extends ActionBarActivity implements View.OnTouchListener {

OurView v;
Bitmap ball;
float x,y;
Bitmap a;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    v = new OurView(this);

    ball = BitmapFactory.decodeResource(getResources(),R.drawable.blueball);
    v.setOnTouchListener(this);
    x= getWindowManager().getDefaultDisplay().getWidth() / 2;
    y = getWindowManager().getDefaultDisplay().getHeight()/2;
    setContentView(v);


}

@Override
protected void onPause() {
    super.onPause();
    v.pause();


}

@Override
protected void onResume() {
    super.onResume();
    v.resume();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return false;
}


public class OurView extends SurfaceView implements Runnable {

    Thread tr = null;
    boolean isItOk = false;
    SurfaceHolder holder;

    public OurView(Context context) {
        super(context);
        holder = getHolder();
    }


    @Override
    public void run() {

        while(isItOk)
        {
            if(!holder.getSurface().isValid()){
                continue;
            }
            Canvas c = holder.lockCanvas();
            c.drawARGB(255,5,5,10);
            c.drawBitmap(ball,x-(ball.getWidth()/2),y-ball.getHeight()/2,null);
            holder.unlockCanvasAndPost(c);
        }

    }

    public void pause(){
        isItOk = false;

        while(true){
            try{
                tr.join();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            break;

        }
        tr = null;
    }

    public void resume(){
        isItOk = true;
        tr = new Thread(this);
        tr.start();
    }


}

}

public class Hey extends AsyncTask <Void, Void, Void> implements View.OnTouchListener

{

@Override
protected void onPreExecute() {
    super.onPreExecute();



}
@Override
protected Void doInBackground(Void... params) {


    return null;
}

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);

}
@Override
public boolean onTouch(View v, MotionEvent event) {
    try {
        Thread.sleep(50);
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
    switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            ball.x= event.getX();
            ball.y = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            ball.x = event.getX();
            ball.y = event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            ball.x = event.getX();
            ball.y = event.getY();
            break;
    }
    return true;
}

解决方案

Wow, that's a total misuse of AsyncTask. Not every function in an AsyncTask runs on another thread- only doInBackground does. So in your onTouch function, you're sleeping the main thread for 50ms on every touch down, up, and move. Yeah, your code is going to run like shit. If you want to rate limit your drawing, you want to do it in the run loop of your surface holder's thread, not when processing input.

这篇关于不知道怎么放的AsyncTask code到游戏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆