Программирование двухмерных игр на J2ME - Спрайт

ОГЛАВЛЕНИЕ

Спрайт

Спрайты выполняют роли действующих субъектов в играх. Это могут быть наши герои Марио, утки и снаряды в играх про Марио или космические корабли в игре про звездные войны. Как базовый изобразительный элемент, он может отображать непрерывное действие на экране с помощью нескольких кадров, сохраненных в Изображении. Файл Изображения должен хранить в себе все кадры Спрайта, чтобы затем их отобразить. Все кадры должны иметь заранее заданную одинаковую width (ширину) и height (высоту).

public SpaceShip(Image image, int w, int h) throws java.io.IOException {
       super(image,w ,h);
        WIDTH = w;
        HEIGHT= h;
        setFrameSequence(SEQUENCE);
        defineReferencePixel(WIDTH/2,HEIGHT/2);
        setTransform(this.TRANS_MIRROR_ROT270);
    }

Чтобы инициализировать спрайт “Корабль”, мы вызываем конструктор из базового класса Sprite: super(image, w, h); где w и h – это ширина и высота каждого кадра. Изображение состоит из 8 кадров, поэтому мы устанавливаем последовательность кадров {0,1,2,3,4,5,6,7}, используя метод setFrameSequence.

Затем мы вызываем метод defineReferencePixel, чтобы установить точку отсчета в центре кадра. Эта точка отсчета будет использоваться для установки корабля в заданное положение на экране. И наконец, мы вращаем (поворачиваем) все кадры с помощью метода setTransform.

public void advance(int ticks) {
        if ((ticks%RATE==0))
            nextFrame();
    }

Метод advance меняет кадр корабля, чтобы создать анимации в соответствии с параметром RATE (частота). Постоянно вызывая метод nextFrame(), мы отображаем на экране последовательность кадров от 0 до 8 и затем в обратном порядке до 0: 0,1,2…7,0,1,2…. Следующие методы moveLeft(), moveRight(), moveUp(), moveDown() изменяют положение корабля на экране в зависимости от значений его speedX (скорости по оси x) и speedy (скорости по оси y).

public void moveLeft () {
       if (this.getRefPixelX()>0)
            this.move(-speedX, 0);
    }
public void moveRight (int m) {
        if (this.getRefPixelX() < m)
            this.move(speedX, 0);
    }
public void moveUp () {
        if (this.getRefPixelY()>0)
            this.move(0, -speedY);
    }
public void moveDown (int m) {
        if (this.getRefPixelY()<m)
            this.move(0, speedY);
    }

Когда кораблю дается команда выстрелить снаряд, мы проверяем, прошло время охлаждения или нет, сравнивая текущее время со временем предыдущего выстрела.

public Bullet fire (int ticks) {
        if (ticks- fireTick > SHOOT_RATE) {
           fireTick = ticks;
           bullet.setSpeed(BULLET_SPEED);
           bullet.shot(this.getRefPixelX(), this.getRefPixelY()+HEIGHT/2);
            return bullet;
        }
        else
           return null;
   }

Чтобы проверить, не произошло ли столкновение между спрайтами, изображениями или TitledLayer (о нем будет сказано позже), мы используем метод collidesWith. Мы используем этот метод в GameManager, чтобы проверить, не произошло ли столкновение между кораблем и астероидами, чтобы уменьшить «показатели здоровья» корабля, и чтобы проверить, не произошло ли столкновение между снарядом и астероидами, чтобы увеличить число очков и разрушить снаряд и астероид.