Java Android非常基础的游戏开发

Java Android非常基础的游戏开发,java,android,Java,Android,有人能帮我写这个简单的代码吗? 为什么圆圈移动不平稳? 怎么了 package chaseme; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android

有人能帮我写这个简单的代码吗? 为什么圆圈移动不平稳? 怎么了

package chaseme;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;

public class ChaseMe extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(new SampleView(this));
}

private class SampleView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
    private Point point;
    private Thread thread;
    private SurfaceHolder holder;
    private Paint _rect;
    private Paint _circle;
    private boolean running;
    private int WIDTH;
    private int HEIGHT;
    private float radius = 20;

    public SampleView(Context context) {
        super(context);

        point = new Point(20, 20);
        _rect = new Paint();
        _rect.setColor(Color.BLACK);

        _circle = new Paint();
        _circle.setColor(Color.BLUE);

        holder = this.getHolder();
        holder.addCallback(this);
        thread = new Thread(this);

    }

    private void updateModel() {
        if(point.x > WIDTH - radius) {
            point.x = 20;
        }
        if(point.y > HEIGHT - radius) {
            point.y = 20;
        }
        point.x++;
        point.y++;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        WIDTH = getWidth();
        HEIGHT = getHeight();
        this.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;

        this.setRunning(false);
        while (retry) {
            try {
                thread.join();
                retry = false;
            } 
            catch (InterruptedException e) {}
        }
    }

    private void setRunning(boolean b) {
        running = b;
    }

    @Override
    public void run() {
        while(running) {
            Canvas c = null;
            updateModel();

            try {
                c = holder.lockCanvas(null);
                // synchronized (holder) {                      
                    render(c);
                // }
            }
            catch(Exception e) {
                Log.e("main", e.getMessage());
            }
            finally {
                if(c!=null) {
                    holder.unlockCanvasAndPost(c);
                }                   
            }               
        }
    }

    private void render(Canvas c) {         
        c.drawRect(0, 0, WIDTH, HEIGHT, _rect);     
        c.drawCircle(point.x, point.y, radius , _circle);

        //c.save();
        //c.restore();
    }
}
}

您不能像当前那样调用point.x++。您需要计算相对于运行时间和屏幕大小的移动

步骤1:在每一帧,通过执行以下操作计算自上一帧以来经过的时间

long now = System.currentTimeMillis();
elapsed = (now - mLastTime);
totalTimeElapsed += elapsed;
然后在你的主循环结束时

mLastTime = now;
第二步。获取屏幕比率:

screenWidth = MyClass.this.getWidth();
screenHeight = MyClass.this.getHeight();
float a = screenWidth;
float b = screenHeight;
screenRatioX = a/WIDTH_OF_YOUR_PHONE;
screenRatioY = b/HEIGTH_OF_YOUR_PHONE;
第三步。例如,如果要从右向左移动圆,现在可以开始制作动画:

spriteX1 = (int) ((spriteX1 + (VELOCITY*screenRatioX*elapsed))+0.5);
spriteX2 = spriteX1 + spriteWidth;
从速度2.0开始,然后从那里开始调整


祝你好运

我认为要使物体平稳移动,应该使用触控事件的手势侦听器功能

下面的链接可能对您有所帮助

一,。http://mobile.tutsplus.com/tutorials/android/android-gesture/
2.http://stackoverflow.com/questions/937313/android-basic-gesture-detection

根据我的意愿对代码进行了测试,运行非常顺利

我建议在真实设备上测试此类项目,模拟器可能会非常不可预测且速度缓慢,这也取决于您的cpu

没什么大不了的,但你可以用

canvas.drawColor(Color.BLACK);

而不是绘制矩形。

如果在“渲染”控制台中打印一些内容,帧速率是否良好?我想知道你的应用程序是否运行得太快,因为你从不要求线程在动画帧之间休眠。我知道问题是什么,是模拟器运行得非常慢,我运行了一个测试来查看fps,它从大约20降到了10。设备只是安卓上的真实世界测试。这也是调试应用程序最快的方法。我使用模拟器只测试我的设备无法测试的内容(分辨率、sdk版本…)。但通常我会在设备上测试我的代码。