Программирование двухмерных игр на J2ME - GameManager

ОГЛАВЛЕНИЕ

GameManager

Как подкласс LayerManager , GameManager может управлять группой Слоев, автоматически отображая каждый Слой в назначенном порядке. Метод append (добавить) вызывается для добавления конкретного слоя в LayerManager (средство управления слоями).

private Image shipImage;
    private static final String SHIP_IMAGE    = "/resource/blue_ship.png";
    private static final int    SHIP_WIDTH    = 40;
    private static final int    SHIP_HEIGHT   = 33;
shipImage = Image.createImage( SHIP_IMAGE );
        // создание космического корабля
        ship = new SpaceShip(shipImage, SHIP_WIDTH, SHIP_HEIGHT);
        // задание его местоположения
       ship.setRefPixelPosition(height/2, width/2);
        this.append(ship);

Чтобы реагировать на ввод пользователя, мы запрашиваем состояния кнопок с помощью упоминаемого нами экземпляра GameCanvas, используя метод getKeyStates(). Мы реагируем соответствующим образом на каждое состояние кнопки, перемещая корабль в требуемом направлении.

int keyState = gameCanvas.getKeyStates();
 
// перемещение вправо
if ((keyState & GameCanvas.RIGHT_PRESSED)!= 0){
       ship.moveRight(width);
}

// перемещение влево
if ((keyState & GameCanvas.LEFT_PRESSED)!= 0){
       ship.moveLeft();
}

// перемещение вверх
if ((keyState & GameCanvas.UP_PRESSED) != 0){
        ship.moveUp();
}

// перемещение вниз
if ((keyState & GameCanvas.DOWN_PRESSED) != 0){
        ship.moveDown(height);
}

В GameManager мы также проверяем, произошло ли столкновение между кораблем, снарядом и случайным образом созданным врагом (астероидами). Если столкновение произошло, мы изменяем состояние игры в соответствии с этим столкновением.

private Obstacle checkCollisionWithAsteroids(Sprite t) {

        for (int i =0; i < MAX_OBS;i++) {
            if (obs[i]!=null)
                 if (obs[i].collidesWith(t, true)) {
                 return obs[i];
            }
        }
        return null;
    }

В случае, если мы достигли условия завершения игры, мы отображаем самое большое число набранных очков и останавливаем поток GameCanvas, используя метод stop (остановить):

protected void endGame(Graphics g) {
        GameOver=true;
        gameCanvas.stop();
        Font f = g.getFont();
        int h = f.getHeight()+40;
        int w = f.stringWidth("High score")+40;      
        g.setColor(250,250,250);
        g.drawString("Score " + score,(width-w)/2,(height-h)/2,g.TOP | g.LEFT);
}

Что дальше

Используя данные знания, вы сможете создавать простые игры, например: “отправиться на рыбалку”, “лягушка переходит дорогу”. Мы опишем TitledLayer и звук в следующих статьях. Они, несомненно, улучшат внешний вид игры и впечатление от нее.

 Загрузить исходный код - 3.73 MB