Самостоятельное перемещение робота (начало)
Давайте теперь придадим нашему роботу самостоятельности и заставим его путешествовать по экрану без вмешательства пользователя. Робот не должен выходить за пределы экрана. Если он дошел до края - он должен изменить направление своего движения. Если наш объект движется самостоятельно - у него должна иметься какая-то скорость. Величина этой скорости влияет на изменение координат. Для понятия "скорость" мы реализуем собственный класс Speed.
Создайте класс Speed.java
package ru.mobilab.gamesample;
public class Speed {
private float xv = 1; // составляющая скорости по оси X
private float yv = 1; // составляющая скорости по оси Y
public Speed() {
this.xv = 1;
this.yv = 1;
}
public Speed(float xv, float yv) {
this.xv = xv;
this.yv = yv;
}
public float getXv() {
return xv;
}
public void setXv(float xv) {
this.xv = xv;
}
public float getYv() {
return yv;
}
public void setYv(float yv) {
this.yv = yv;
}
// изменяем направление по оси X
public void toggleXDirection() {
xv = -xv;
}
// изменяем направление по оси Y
public void toggleYDirection() {
yv=-yv;
}
}
Робот имеет горизонтальную и вертикальную составляющую скорости. На каждом шаге цикла к текущей координате робота будим прибавлять соответствующую скорость (на самом деле в физическом смысле правильнее было бы прибавлять величину скорости, умноженную на время прошедшее с прошлой операции перемещения объекта, но мы в целях упрощения не будем так сильно заморачиваться). В конструкторе переменным vx и vy мы присвоили значение 1, то есть на каждом шаге игрового цикла робот будет смещаться на 1 пиксел. Если vx > 0 - робот движется вправо, если vx<0 - влево. Аналогично vy>0-вниз, vy<0 - вверх. В методах toggleXDirection() и toggleYDirection(), которые задают разворот направления движения по соответствующему направлению, мы просто умножаем vx или vy на -1.
Изменять координаты робота нужно на каждом шаге игрового цикла. Откройте файл MainThread.java и добавьте в метод run() строку
this.gamePanel.update();
метод примет вид
public void run() {
Canvas canvas;
Log.d(TAG, "Starting game loop");
while (running) {
canvas = null;
// пытаемся заблокировать canvas
// для изменение картинки на поверхности
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
// обновляем состояние
this.gamePanel.update();
// формируем новый кадр
this.gamePanel.onDraw(canvas); //Вызываем метод для рисования
}
} finally {
// в случае ошибки, плоскость не перешла в
//требуемое состояние
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
Создадим соответствующий метод MainGamePanel. Внутри метода update() мы будем менять состояние всех игровых объектов. Пока у нас только один объект - робот, но скоро их станет больше. Внутри этого метода мы должны проверить, не столкнулся ли робот со стеной. Если столкнулся – надо поменять направление движения. При вычислении столкновений нужно помнить, что координата робота соответствует центру рисунка, поэтому чтобы получить координату правого края мы должны вычесть из координаты x половину ширины рисунка. После проверки на столкновения мы можем прибавить к координатам робота соответствующие приращения скорости, для решения этой задачи напишем метод update в классе Droid. Перейдем к файлу MainGamePanel.java
public void update() {
// проверяем столкновение с правой стеной
if (droid.getX() + droid.getBitmap().getWidth() / 2 >= getWidth()) {
droid.getSpeed().toggleXDirection();
}
// проверяем столкновение с левой стеной
if ( droid.getX() - droid.getBitmap().getWidth() / 2 <= 0) {
droid.getSpeed().toggleXDirection();
}
// проверяем столкновение с нижней стеной
if (droid.getY() + droid.getBitmap().getHeight() / 2 >= getHeight()) {
droid.getSpeed().toggleYDirection();
}
// проверяем столкновение с верхней стеной
if (droid.getY() - droid.getBitmap().getHeight() / 2 <= 0) {
droid.getSpeed().toggleYDirection();
}
// Обновляем координаты робота
droid.update();
}
Методы getWidth() и getHeight() возвращают ширину и высоту рисунка.
Последняя строка метода вызывает метод update объекта droid. Добавим этот метод в класс Droid.
public void update() {
if (!touched) {
x = (int)(x+speed.getXv());
y = (int)(y+speed.getYv());
}
}
Добавим в класс Droid поле
private Speed speed;
В конструкторе создадим объект speed
public Droid(Bitmap bitmap, int x, int y) {
this.bitmap = bitmap;
this.x = x;
this.y = y;
speed=new Speed();
}
и добавим метод getSpeed(), возвращающий объект speed.
public Speed getSpeed() {
return speed;
}
Все. Можно сохранять проект и пробовать его запустить. Если Вы все сделали правильно, робот будет двигаться по экрану, отскакивая от краев. Кстати, робота по-прежнему можно перетаскивать.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.