Интересная особенность наследования:
public class Asteroids extends Entity implements GlobalConstants{ ...... };
Asteroids mAsteroids;
scene.attachChild(mAsteroids);
// метод attachChild принимает аргумент типа Entity,
// и нет перегруженного метода, принимающего аргумент типа Asteroids!
Метод attachChild может принять в качестве аргумента данные типа Entity. Но мы то создали свой расширенный класс на основе этого самого Entity. Так вот оказалось, что в Java можно подсовывать в методы не только типы, под которые методы прописаны, но и расширенные типы на основе тех типов, под которые прописаны соответствующие методы. Запутано объяснил... Представим себе наушники под плеер, у них есть "интерфейс" - штекер диаметром 3,5мм. Наушники шли в комплекте с плеером и они к нему прекрасно подходят. А теперь представим, что на основе электрической схемы плеера мы собрали автомагнитолу. Она делает все тоже самое, что и плеер, но кроме того имеет много дополнительных функций. То есть она является "расширенной" версией простого плеера. И наши наушники прекрасно подходят к магнитоле, потому что у нее есть нужный разъем, который "достался ей по наследству" от плеера. Надеюсь, теперь стало немного понятнее...
Ну а теперь, собственно, код класса Asteroids.
package ru.sapfil.AETest2;
import <.......>
public class Asteroids extends Entity implements GlobalConstants{
// ===========================================================
// Constants
// ===========================================================
private static final int SIZE_OF_ASTEROID = 36;
// ===========================================================
// Fields
// ===========================================================
private final ArrayList mAsteroids = new ArrayList();
private static Random random = new Random();
// ===========================================================
// Constructors
// ===========================================================
Asteroids(ITextureRegion mAsteroidTextureRegion,
VertexBufferObjectManager pVertexBufferObjectManager ){
for (int i = 0; i < 7; i++)
{
mAsteroids.add(new Asteroid(random.nextInt
(CAMERA_WIDTH-SIZE_OF_ASTEROID),(-i*50 ),
mAsteroidTextureRegion, pVertexBufferObjectManager));
this.attachChild(mAsteroids.get(i));
};
Log.d("Sapfil_Log", "some asteroids created and added to scene");
};
// ===========================================================
// Getter & Setter
// Methods for/from SuperClass/Interfaces
// Methods
// ===========================================================
public byte Update (float dt){
for (int i = 0; i < 7; i++) {
switch (mAsteroids.get(i).update(dt)){
case 1: {mAsteroids.get(i).setX
(random.nextInt(CAMERA_WIDTH-SIZE_OF_ASTEROID));
mAsteroids.get(i).setY(-SIZE_OF_ASTEROID); break;}
case 0: {};
default: {};
};
}
return 0;
};};
Для хранения астероидов мы используем ArrayList. Этот вид списка позволяет обращаться к элементам списка по индексу. Хотя, можно было бы использовать что-то другое, например LinkedList. У каждого вида списка свои плюсы и минусы - я в них пока особо не разбирался. Кроме того пользуемся рандомом для генерации горизонтальной координаты для места "рождения" астероида. Функция Update дает команду на обновление каждого асероида и проверяет возвращаемое значение. Если астероид вернул 0, значит с ним все в порядке и делать ничего не надо. В данном случае еще используется код 1, который обозначает, что астероид улетел за пределы экрана и его надо удалить. Но для простоты она переносится наверх, за границу экрана. и Ему дается новая случайная горизонтальная координата. Для полноты картины выложу ка я код класса отдельного астероида. package ru.sapfil.AETest2;
import <.......>
public class Asteroid extends Sprite implements GlobalConstants{
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private float speed = 50;
// ===========================================================
// Constructors
// ===========================================================
public Asteroid(float pX, float pY, ITextureRegion pTextureRegion,
VertexBufferObjectManager pVertexBufferObjectManager) {
super(pX, pY, pTextureRegion, pVertexBufferObjectManager);
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
public byte update(float dt){
this.setY(this.getY() + speed * dt);
if (this.getY() > CAMERA_HEIGHT) // away from the screen
return 1;
else return 0;
};
};
Позже можно добавить другие коды возвращаемых значений. Например, 2 будет означать. что астеройд уничтожен игроком. И здесь надо будет его не просто "убирать" со сцены, а красиво взрывать.
Комментариев нет:
Отправить комментарий