Android очень базовая разработка игр

1

Может ли кто-нибудь помочь мне с этим простым кодом? Почему круг не движется плавно? Что с этим не так?

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();
    }
}
}
  • 0
    если вы печатаете некоторые вещи в консоли при рендере, хорошая ли частота кадров? Интересно, не работает ли ваше приложение слишком быстро, так как вы никогда не просите свою нить спать между кадрами анимации.
  • 0
    Ну, я знаю, в чем проблема, это эмулятор работает очень медленно, я запустил тест, чтобы увидеть fps, и он падает примерно с 20 до 10.
Показать ещё 1 комментарий
Теги:

3 ответа

1

Я думаю, что для плавного перемещения объекта вы должны использовать функцию прослушивания жестов на сенсорном событии.

Ниже ссылка может вам помочь.

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

1

Вы не можете просто называть точку. x++, как вы сейчас это делаете. Вам нужно рассчитать движение относительно прошедшего времени и размера экрана.

Шаг 1. В каждом кадре вычислите, сколько времени прошло с момента последнего кадра, выполнив

long now = System.currentTimeMillis();
elapsed = (now - mLastTime);
totalTimeElapsed += elapsed;

а затем в конце вашего основного цикла вы делаете

mLastTime = now;

Шаг 2. Получите соотношение экрана:

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;

Шаг 3. Теперь вы можете начать делать анимации, например, если вы хотите переместить свой круг справа налево:

spriteX1 = (int) ((spriteX1 + (VELOCITY*screenRatioX*elapsed))+0.5);
spriteX2 = spriteX1 + spriteWidth;

Начните со скорости 2,0 или что-то и откорректируйте оттуда.

Удачи!

0

Протестируйте код по моему желанию, и он работает очень гладко.

Я предлагаю протестировать подобные проекты на реальных устройствах, эмулятор может быть очень непредсказуемым и медленным в зависимости от вашего процессора.

Не большое дело, но вы можете очистить свой холст

canvas.drawColor(Color.BLACK);

вместо рисования прямоугольника.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню