Программирование двухмерных игр на 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, чтобы проверить, не произошло ли столкновение между кораблем и астероидами, чтобы уменьшить «показатели здоровья» корабля, и чтобы проверить, не произошло ли столкновение между снарядом и астероидами, чтобы увеличить число очков и разрушить снаряд и астероид.