четверг, 8 ноября 2012 г.

Группа объектов. А добавим-ка астероидов.


Интересная особенность наследования:
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 будет означать. что астеройд уничтожен игроком. И здесь надо будет его не просто "убирать" со сцены, а красиво взрывать.

Комментариев нет:

Отправить комментарий