Объектно ориентированное программирование. Простая игра

ФЕДЕРАЛЬНОЕ АГЕНТСТВО  ПО ОБРАЗОВАНИЮ

 

Государственное образовательное учреждение

высшего профессионального образования

«Тихоокеанский государственный  университет»

Кафедра 
ПО ВТ и АС

Объектно-ориентированное программирование. 
Курсовая работа. 
060620080

Выполнила: студентка группы ПО-62 Разуваева Н.В.

Проверил: Пустынский И.С.

г. Хабаровск, 2008

Оглавление

 

1. Постановка задачи и описание программы

В качестве курсовой работы по объектно-ориентированному программированию было предложено написать простую игру. Основные требования к программе:

  1. Наличие не менее десяти различных классов
  2. Наличие различных типов связей между классами – наследование, агрегация и т.д.
  3. Взаимодействие между классами в реальном времени.

Описываемая ниже программа представляет собой игру под названием  Space Shooter. В игре космический корабль под управлением игрока отстреливается от космических кораблей противника. Противники делятся на простых врагов, наносящих урон в одну жизнь и погибающих с первого попадания, и боссов, которые обладают большим количеством жизней и наносят больший урон. Так же в игре существуют разрушаемые препятствия.

Передвижение в игре производится клавишами вверх, вниз, влево и  вправо. По нажатию пробела корабль игрока стреляет обычными пулями. По нажатию клавиши Right Alt производится выстрел улучшенными пулями, наносящими больший урон.

Внешний вид игры

Для реализации графической составляющей игры была использована библиотека SDL - Simple DirectMedia Layer. Это библиотека, которая обеспечивает низкоуровневый доступ к буферу видео, аудио выходу, мыши, клавиатуре и т.д. для большого количества операционных систем.

 

2. Список классов

2.1 Класс Object

Русское название класса – Объект. Является базовым классом для всех классов, имеющих визуальное отображение на экране. Объявление класса находится в Object.h, реализация класса находится в Object.cpp.

2.2 Класс ObjectList

Русское название – Список Объектов. Хранит в виде списка все визуально  отображаемые объекты, существующие в данные момент, и помогает реализовать взаимодействие между ними. Объявление класса находится в ObjectList.h, реализация класса находится в ObjectList.cpp.

2.3 Класс Game

Русское название Игра. Служит для  реализации графического интерфейса игры. Хранит в себе параметры окна, изображения для визуальных объектов и т.д. Объявление класса находится в Game.h, реализация класса находится в Game.cpp.

2.4 Класс Player

Русское название класса – Игрок. Класс, представляющий корабль, которым управляет игрок. Наследник класса Object. Объявление класса находится в Player .h, реализация класса находится в Player.cpp.

2.5 Класс Enemy

Русское название класса – Противник. Класс, представляющий собой корабль-противник. Наследник класса Object. Объявление класса находится в Enemy.h, реализация класса находится в Enemy.cpp.

2.6 Класс Boss

Русское название класса – Босс. Класс, представляющий собой усиленный корабль противника. Наследник класса Enemy. Объявление класса находится в Boss.h, реализация класса находится в Boss.cpp.

2.7 Класс Bullet

Русское название класса – Пуля. Наносит урон объектам, находящимся на уровне. Наследник класса Object. Объявление класса находится в Bullet.h, реализация класса находится в Bullet.cpp.

2.8 Класс Sp_Bull

Русское название класса – Улучшенная пуля. Наследник класса Bullet. Обладает повышенным уроном. Объявление класса находится в Sp_Bull.h, реализация класса находится в Sp_Bull.cpp.

2.9 Класс Explosion

Русское название класса – Взрыв. Служит для графического отображения взрывов при столкновении объектов и их уничтожении. Объявление класса находится в Explosion.h, реализация класса находится в Explosion.cpp.

2.10 Класс Life

Русское название класса – Жизнь. Класс, представляющий собой бонус, добавляющий жизни игроку. Объявление класса находится в Life.h, реализация класса находится в Life.cpp.

2.11 Класс Defense

Русское название – Препятствие. Объявление класса находится в Defense.h, реализация класса находится в Defense.cpp. 

3. Диаграмма классов

Диаграмма классов, используемых в курсовой работе

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. Описание классов.

4.1 Класс Object

class Object 

{

protected: 

SDL_Rect clip[ 8 ];

bool   bAnim

bool   bDie

int   Counter

SDL_Surface* nsSurface;

Game* pGame; 

public: 

SDL_Rect box;

int   Frame, xVel, yVel;

Object() {}

void Init(int x, int y, int width, int height);

void Kill() { bDie = true; }

bool Collision(Object* pObject);

virtual int GetType() = 0;

virtual void Process(Object* pObject) = 0;

virtual bool Move() = 0;

void Blit();

virtual ~Object() {}

};

4.1.1 Атрибуты класса

    1. SDL_Rect box – окружающий объект прямоугольник.
    2. bool bAnim – логическая переменная, принмающая 1, если объект движущийся и 0, если нет.
    3. bool bDie – логичекая переменная, принимающая 0, если объект не погиб, и 1 в противном случае.
    4. int Counter – счетчик для кадр ов.
    5. int Frame – текущий кадр изображения объекта.
    6. int xVel – скорость объекта по оси X/
    7. int yVel – скорость объекта по оси Y/
    8. SDL_Rect clip[ 8 ] – массив прямоугольников для вычленения изображений из спрайтовой таблицы.
    9. SDL_Surface* nsSurface – ссылка на объект типа SDL_Surface (встроенный класс библиотеки SDL для работы с графикой), хранящий изображение объекта.
    10. Game* pGame – ссылка на объект класса Game.

4.1.2 Методы класса

    1. Object() {} – пустой конструктор.
    2. void Init(int x, int y, int width, int height) – инициализирует основные атрибуты класса – координаты, высоту и ширину прямоугольника box.
    3. void Kill() – «убивает» объект.
    4. bool Collision(Object* pObject) – проверят не столконулись ли объекты.

virtual int GetType() – виртуальная функция, возвращающая тип объекта. Тип объекта может быть следующим: OBJECTTYPE_PLAYER, OBJECTTYPE_BULLET, OBJECTTYPE_EXPLOSION, OBJECTTYPE_ENEMY, OBJECTTYPE_DEFENCE, OBJECTTYPE_BONUS, OBJECTTYPE_SBULL, OBJECTTYPE_BOSS, OBJECTTYPE_LIFE.

    1. void Process(Object* pObject) – виртуальная функция, обеспецивающая взаимодействие между объектами.
    2. virtual bool Move() – виртуальная функция, реализующая передвижение объектов.
    3. void Blit() – функция, реализующая визуальное отображение объекта.
    4. virtual ~Object() {} – деструктор.

4.2 Класс ObjectList.

class ObjectList 

{

private:

Game* pGame;

public:

OBJECTLIST Objects;

ObjectList(Game* game);

void AddObject(Object* pObject);

void BlitObjects();

void ProcessObjects();

virtual ~ObjectList();

};

Класс использует стандартный класс list, посволяющий работать со списками.

typedef std::list<POBJECT> OBJECTLIST;

4.2.1 Атрибуты класса

    1. Game* pGame – ссылка на объект класса Game.
    2. OBJECTLIST Objects – список объктов класса Object.

4.2.2 Методы класса

    1. void AddObject(Object* pObject) – добавляет объект pObject к списку.
    2. void BlitObjects() – функция, реализующая отображение всех объектов, хранящихся в списке.
    3. void ProcessObjects() – функция, реализующая взаимодействие между объектами в списке.
    4. virtual ~ObjectList() – деструктор класса.

4.3 Класс Game

class Game 

{

public:

SDL_Rect camera;

SDL_Surface* nsPlayer;

SDL_Surface* nsEnemy;

SDL_Surface* nsBullet;

SDL_Surface* nsExplosion;

SDL_Surface* nsLive;

SDL_Surface* nsDefence;

SDL_Surface* nsSpBull;

SDL_Surface* nsGameOver;

SDL_Surface* backgr;

SDL_Surface* nsBoss;

SDL_Surface* nsSb;

SDL_Surface* nsLifeBonus;

int NumLives;

SDL_Event event;

SDL_Surface* screen;

Game();

void MoveCam(int y);

void FlipScreen();

void ClearScreen();

void DrawStatus();

bool IsGameOver() { return (NumLives == 0);}

virtual ~Game();

};

4.3.1 Атрибуты класса

    1. SDL_Surface* nsPlayer – поверхность с изображением игрока.
    2. SDL_Surface* nsEnemy – поверхность с изображением врага.
    3. SDL_Surface* nsBullet – поверхность с изображением пули.
    4. SDL_Surface* nsExplosion – поверхность с изображением взрыва.
    5. SDL_Surface* nsLive – поверхность с изображением жизни для интерфейса.
    6. SDL_Surface* nsDefence – поверхность с изображением препятствия.
    7. SDL_Surface* nsSpBull – поверхность с изображением улучшенной пули.
    8. SDL_Surface* nsGameOver – поверхность с сообщением о проигрыше.
    9. SDL_Surface* backgr – поверхность с изображением заднего фона.
    10. SDL_Surface* nsBoss – поверхность с изображением босса.
    11. SDL_Surface* nsSb – поверхность с изображением улучшенной пули для интерфейса.
    12. SDL_Surface* nsLifeBonus – поверхность с изображением бонуса-жизни.
    13. int NumLives – количество жизней игрока.
    14. SDL_Event event – объект класса SDL_Event, позволяющий обрабатывать такие события, как нажатие клавиш, закрытие окна и т.д.
    15. SDL_Surface* screen – поверхность, представляющая собой собственно окно.
    16. SDL_Rect camera – объект класса SDL_Rect, позволяющий прокручивать задний фон.

4.3.2 Методы класса

    1. Game() – конструктор.
    2. void MoveCam(int y) – функция, передвигающая объект camera, изменяя его координату по оси Y на величину у.
    3. void FlipScreen() – обновление экрана.
    4. void ClearScreen() – очистка экрана.
    5. void DrawStatus() – выводит на экран количество жизней игрока или сообщение о проигрыше, если их число равно 0.
    6. bool IsGameOver() – возвращает true, если число жизней равно 0.
    7. virtual ~Game() – деструктор.

4.4 Класс Player

class Player : public Object 

{

private:

ObjectList* pList;

int Ammo;

public:

Player(Game* game, ObjectList* list);

int GetType()     { return OBJECTTYPE_PLAYER; }

void Process(Object* pObject);

void Show_Am();

bool Move();

void handle_input();

virtual ~Player();

};

4.4.1 Атрибуты класса

    1. ObjectList* pList – указатель на объект класса ObjectList.
    2. int Ammo – число улучшенных пуль.

4.4.2 Методы класса

    1. Player(Game* game, ObjectList* list) – конструктор.
    2. int GetType() – возвращает тип объекта OBJECTTYPE_PLAYER.
    3. void Process(Object* pObject) – реализует взаимодействие объекта класса Player с объектами других классов.
    4. void Show_Am() – выводит информацию о количестве улучшенных пуль на экран.
    5. bool Move() – функция, реализующая передвижение объекта.
    6. void handle_input() – обрабатывает внешние события, такие как нажатие клавиш.
    7. virtual ~Player() – деструктор.

4.5 Класс Enemy

class Enemy : public Object

{

protected:

ObjectList* pList;

int MoveCounter;

int FireCounter;

public:

Enemy(Game* game, ObjectList* list, int x, int y);

int GetType()     { return OBJECTTYPE_ENEMY; }

void Process(Object* pObject);

bool Move();

virtual ~Enemy();

};

4.5.1 Атрибуты класса

    1. ObjectList* pList – указатель на объект класса ObjectList.
    2. int MoveCounter – счётчик передвижений.
    3. int FireCounter – счётчик огня.

4.5.2 Методы класса

    1. Enemy(Game* game, ObjectList* list, int x, int y) – конструктор. x и y – координаты объекта.
    2. int GetType() – возвращает тип объекта OBJECTTYPE_ENEMY.
    3. virtual ~Enemy() – деструктор.

Функции Procces и Move по назначению аналогичны описанным выше и далее в описании методов упоминаться не будут.

4.6 Класс Boss

class Boss : public Enemy

int damg;

int lives;

public: 

Boss(Game* game, ObjectList* list, int x, int y, int l, int d);

int GetType()     { return OBJECTTYPE_BOSS; }

void Process(Object* pObject);

bool Move();

virtual ~Boss();

};

4.6.1 Атрибуты класса

    1. int damg – урон, наносимый боссом.
    2. int lives – жизни босса.

4.6.2 Методы класса

    1. Boss(Game* game, ObjectList* list, int x, int y, int l, int d) – конструктор. x и y – координаты объекта, l – количество жизней, d – наносимый урон.
    2. int GetType() – возвращает тип объекта OBJECTTYPE_BOSS.
    3. virtual ~Boss() – деструктор.

4.7 Класс Bullet

class Bullet : public Object

{

protected:

ObjectList* pList;

bool pl;

public:

void set_sr(bool b) {pl=b;}

bool get_sr() {return pl;}

Bullet(Game* game, ObjectList* list, int x, int y, int v);

int GetType()     { return OBJECTTYPE_BULLET; }

void Process(Object* pObject);

bool Move();

virtual ~Bullet();

};

4.7.1 Атрибуты класса

    1. ObjectList* pList – указатель на объект класса ObjectList.
    2. bool pl – логическая переменная, определяющая, была ли пуля выпущена игроком или противником.

4.7.2 Методы класса

    1. void set_sr(bool b) – устанавливает значение pl.
    2. bool get_sr() – возвращает значение pl.
    3. Bullet(Game* game, ObjectList* list, int x, int y, int v) – конструктор. x и y – координаты объекта, v – скорость пули.
    4. int GetType() – возвращает тип объекта OBJECTTYPE_BULLET.
    5. virtual ~Bullet() – деструктор.

4.8 Класс Sp_Bull

class Sp_Bull : public Bullet

{

int Damage;

public:

int Get_Dm() { return Damage;}

Sp_Bull(Game* game, ObjectList* list, int x, int y, int v, int d);

int GetType() { return OBJECTTYPE_SBULL; }

void Process(Object* pObject);

bool Move();

virtual ~Sp_Bull();

};

4.8.1 Атрибуты класса

    1. int Damage – урон, наносимый боссом.

4.8.2 Методы класса

    1. int Get_Dm() – возвращает значение переменной damage.
    2. Sp_Bull(Game* game, ObjectList* list, int x, int y, int v, int d) – конструктор. x и y – координаты объекта, v – скорость пули, d – наносимый урон.
    3. int GetType() – возвращает тип объекта OBJECTTYPE_SBULL.
    4. virtual ~Sp_Bull() – конструктор.

4.9 Класс Explosion

class Explosion : public Object

{

ObjectList* pList;

public:

Explosion(Game* game, ObjectList* list, int x, int y);

int GetType()     { return OBJECTTYPE_EXPLOSION; }

void Process(Object* pObject);

bool Move();

virtual ~Explosion();

};

4.9.1 Атрибуты класса

    1. ObjectList* pList - указатель на объект класса ObjectList.

4.9.2 Методы класса

    1. Explosion(Game* game, ObjectList* list, int x, int y) – конструктор.
    2. int GetType() - возвращает тип объекта OBJECTTYPE_EXPLOSION.
    3. virtual ~Explosion() – деструктор.

4.10 Класс Life

class Life : public Object

{

ObjectList* pList;

int bonus;

public:

Life(Game* game, ObjectList* list, int x, int y, int b);

int GetType(){ return OBJECTTYPE_LIFE; }

void Process(Object* pObject);

bool Move();

virtual ~Life();

};

4.10.1 Атрибуты класса

    1. ObjectList* pList - указатель на объект класса ObjectList.
    2. int bonus – число, на которое увеличится число жизней при получении бонуса.

4.10.2 Методы класса

    1. Life(Game* game, ObjectList* list, int x, int y, int b) – конструктор. b – число жизней, который прибавляет бонус.
    2. int GetType()- возвращает тип объекта OBJECTTYPE_LIFE.
    3. virtual ~Life() – деструктор.

4.11 Класс Defense

class Defence : public Object

{

ObjectList* pList;

public:

Defence(Game* game, ObjectList* list, int x, int y);

int GetType()     { return OBJECTTYPE_DEFENCE; }

void Process(Object* pObject);

bool Move();

virtual ~Defence();

};

4.11.1 Атрибуты класса

    1. ObjectList* pList - указатель на объект класса ObjectList.

4.11.2 Методы класса

    1. Defence(Game* game, ObjectList* list, int x, int y) – конструктор.
    2. int GetType() - возвращает тип объекта OBJECTTYPE_EXPLOSION.
    3. virtual ~Defence() – деструктор. 

5. Программная реализация классов

5.1 Реализация абстрактного класса  Object.

#include "stdafx.h"

#include "Object.h"

 

void Object::Init(int x, int y, int width, int height)

{

//устанавливаем  размеры прямоугольника, в который  вписывается объект

box.x=x;

box.y=y;

box.w=width;

box.h=height;

}

 

void Object::Blit()

{

if (bAnim==true)

apply_surface( box.x, box.y+480-pGame->camera.y, nsSurface, pGame->screen, &clip[Frame] );

else

apply_surface( box.x, box.y+480-pGame->camera.y, nsSurface, pGame->screen );

}

 

bool Object::Collision(Object* pObject)

{

//метод проверяет,  не пересекаются ли прямогугольники,  в которые

//вписаны объект, чей метод мы вызвали, и переданный  по ссылке объект.

int left, leftB;

    int right, rightB;

    int top, topB;

    int bottom, bottomB;

left = box.x;

    right = box.x + box.w;

    top = box.y;

    bottom = box.y + box.h;

    leftB = pObject->box.x;

    rightB = pObject->box.x + pObject->box.w;

    topB = pObject->box.y;

    bottomB = pObject->box.y +pObject->box.h;

if( bottom <= topB )

        return false;   

    if( top >= bottomB )

        return false;   

    if( right <= leftB )

        return false;   

    if( left >= rightB )

        return false;

    return true;

}

5.2 Реализация класса ObjectList

#include "stdafx.h"

#include "ObjectList.h"

 

ObjectList::ObjectList(Game* game)

{

pGame = game;

}

 

void ObjectList::AddObject(Object* pObject)

{

Objects.push_front(pObject);

}

 

void ObjectList::BlitObjects()

{

Object* pObject;

if(!Objects.empty())

{

for(OBJECTLIST_ITERATOR iterator=Objects.begin(); iterator != Objects.end(); iterator++)

{

pObject=*iterator;

pObject->Blit();

}

}

}

 

 

void ObjectList::ProcessObjects()

{

// Передвигаем объекты  и проверяе, не взаимодействуют  ли они.

if(!Objects.empty())

{

OBJECTLIST_ITERATOR iterator = Objects.begin();

Object* pObject;

while(iterator != Objects.end())

{

pObject=*iterator;

if(!pObject->Move())

{

delete pObject;

iterator = Objects.erase(iterator);

}

else

iterator++;

}

iterator = Objects.begin();

while(iterator != Objects.end())

{

pObject=*iterator;

OBJECTLIST_ITERATOR iterator2 = Objects.begin();

Object* pObject2;

while(iterator2 != Objects.end())

{

pObject2=*iterator2;

if(pObject != NULL && pObject2 != NULL && pObject != pObject2)

pObject->Process(pObject2);

iterator2++;

}

iterator++;

}

}

apply_surface(0,0,pGame->backgr,pGame->screen, &(pGame->camera));

}

 

 

ObjectList::~ObjectList()

{

Object* pObject;

if(!Objects.empty())

{

for(OBJECTLIST_ITERATOR iterator=Objects.begin(); iterator != Objects.end(); iterator++)

{

pObject=*iterator;

delete(pObject);

}

}

Objects.clear();

}

5.3 Реализация класса Game

#include "stdafx.h"

#include "Game.h"

 

Game::Game()

{

//установка размеров экрана

int SCREEN_WIDTH = 640;

    int SCREEN_HEIGHT = 480;

    int SCREEN_BPP = 32;

//установка размера камеры

camera.h=SCREEN_HEIGHT;

camera.w=SCREEN_WIDTH ;

camera.x=0;

camera.y=480;

//подключение всех  возможностей SDL

SDL_Init( SDL_INIT_EVERYTHING );

screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

SDL_WM_SetCaption( "Space shooter", NULL );

//загрузка изображений в поверхности

nsPlayer    = load_image("bmp\\player.bmp");

nsEnemy     = load_image("bmp\\enemy.bmp");

nsBullet    = load_image("bmp\\bullet.bmp");

nsExplosion = load_image("bmp\\explo.bmp");

nsLive      = load_image("bmp\\live.bmp");

nsSb = load_image("bmp\\sbl.bmp");

nsGameOver  = load_image("bmp\\gameover.bmp");

nsDefence = load_image("bmp\\Defence.bmp");

nsBoss = load_image("bmp\\Boss.bmp");

backgr = load_image("bmp\\backgr.png");

nsSpBull = load_image("bmp\\Sp_Bull.bmp");

nsLifeBonus = load_image("bmp\\LB.bmp");

NumLives    = 5;

}

 

void Game::FlipScreen()

{

//функция SDL для обновления экрана

SDL_Flip( screen );

}

 

void Game::MoveCam(int y)

{

//метод передвигает  камеру при передвижении объекта

camera.y+=y;

    if( camera.y < 0 )

    {

        camera.y = 0;   

    }

    if( camera.y > 960 - camera.h )

    {

        camera.y = 960 - camera.h;   

    }   

}

 

void Game::ClearScreen()

{

//функция очистки экрана

SDL_FreeSurface( screen );

}

 

 

void Game::DrawStatus()

{

//вывод сообщения  о проигрыше

if(NumLives <= 0)

apply_surface(113,100, nsGameOver, screen);

else

for(int index=0; index < NumLives; index++)

{

//прорисовка количества жизней

apply_surface(624,index*16,nsLive, screen);

}

}

 

Game::~Game()

{

delete (nsPlayer);

delete (nsEnemy);

delete (nsBullet);

delete (nsExplosion);

delete (nsLive);

delete (nsGameOver);

delete (screen);

delete (backgr);

}

5.4 Реализация класса Player

#include "stdafx.h"

#include "player.h"

 

Player::Player(Game* game, ObjectList* list)

{

//устанавливаем  координаты прямоугольников для  разделения

// таблицы спрайтов

for(int i=0; i<3; i++)

{

clip[ i ].x = i*32;

clip[ i ].y = 0;

clip[ i ].w = 32;

clip[ i ].h = 32;

}

bDie=false;

bAnim=true;

Counter=0;

Frame=0;

Ammo=4;

pGame = game;

pList = list;

Init(304, 400, 32, 32);

xVel=yVel=0;

nsSurface = pGame->nsPlayer;

}

 

void Player::Process(Object* pObject)

{

Explosion* pExplosion;

if(bDie) return;

if(!pObject)

return;

//если объект, с  которым столкнулся игрок - враг

//то враг погибает, а у игрока отнимается жизнь

if(Collision(pObject))

if(pObject->GetType()==OBJECTTYPE_ENEMY)

{

pGame->NumLives--;

for(int index=0; index<8; index++)

{

pExplosion = new Explosion(pGame, pList, box.x + index*4, box.y + rand()%16);

pList->AddObject(pExplosion);

}

pObject->Kill();

}

return;

}

 

void Player::Show_Am()

{

//выводит число улучшенных пуль

for(int index=0; index < Ammo; index++)

{

apply_surface(640-32*index,464,pGame->nsSb, pGame->screen);

}

}

 

void Player::handle_input()

{

if (bDie) return;

if(Counter < 3) Counter++;

else

{

Counter = 0;

if(Frame < 2) Frame++;

else

Frame = 0;

}

//реакция на нажатие "стрелок" - движение

if( pGame->event.type == SDL_KEYDOWN)

{

switch(pGame->event.key.keysym.sym )

{

case SDLK_LEFT:xVel-=2; break;

case SDLK_RIGHT:xVel+=2; break;

case SDLK_UP:yVel-=2;break;

case SDLK_DOWN:yVel+=2;break;

}

//если это пробел - стрельба

if( pGame->event.key.keysym.sym==SDLK_SPACE)

{

Bullet* pBullet = new Bullet(pGame, pList, box.x + 12, box.y - 8, -3);

pBullet->set_sr(true);

pList->AddObject(pBullet);

}

//если это правый Alt - стрельба улучшенными пулями

if( pGame->event.key.keysym.sym==SDLK_RALT)

{

if(Ammo!=0)

{

Sp_Bull* pSB = new Sp_Bull(pGame, pList, box.x + 12, box.y - 8, -3, 2);

pList->AddObject(pSB);

Ammo--;

}

}

}

if( pGame->event.type == SDL_KEYUP)

{

switch( pGame->event.key.keysym.sym )

{

case SDLK_LEFT:xVel+=2; break;

case SDLK_RIGHT:xVel-=2; break;

case SDLK_UP:yVel+=2;break;

case SDLK_DOWN:yVel-=2;break;

}

}

 

bool Player::Move()

{

//двигает объект  в пределах игрового поля

if(bDie) return false;

box.x+= xVel;

if( (box.x < 0 ) || ( box.x+32 > 640 ))

box.x-= xVel; 

box.y += yVel; 

if( ( box.y < -480 ) || ( box.y+32 > 480 ))

box.y -= yVel;

pGame->MoveCam(yVel);

return true;

}

 

Player::~Player()

{

 

}

5.5 Реализация класса Enemy

#include "stdafx.h"

#include "Enemy.h"

 

Enemy::Enemy(Game* game, ObjectList* list, int x, int y)

{

pGame = game;

pList = list;

for(int i=0; i<3; i++)

{

clip[ i ].x = i*32;

clip[ i ].y = 0;

clip[ i ].w = 32;

clip[ i ].h = 32;

}

Init(x, y, 32, 32);

bDie=false;

bAnim=true;

Counter=0;

Frame=0;

MoveCounter = rand()%20;

FireCounter = rand()%20;

xVel = 2 - rand()%4;

yVel = 2 - rand()%4;

nsSurface = pGame->nsEnemy;

}

 

void Enemy::Process(Object* pObject)

{

if(bDie) return;

}

 

bool Enemy::Move()

{

if(bDie) return false;

FireCounter++;

if(Counter < 3) Counter++;

else

{

Counter = 0;

if(Frame < 2) Frame++;

else

Frame = 0;

}

if(MoveCounter < 20)

{

box.x += xVel;

box.y += yVel;

if(box.x > 608)

{

box.x = 608;

MoveCounter = 20;

}

if(box.y <0)

{

box.y = 0;

MoveCounter = 20;

}

else

if(box.y > 200)

{

box.y = 200;

MoveCounter = 20;

}

 

MoveCounter++;

}

else

{

MoveCounter = 0;

if(FireCounter >= 100)

{

Bullet* pBullet = new Bullet(pGame, pList, box.x+12, box.y+32, 3);

pBullet->set_sr(false);

pList->AddObject(pBullet);

FireCounter = 0;

}

else

{

xVel = 2 - rand()%4;

yVel = 2 - rand()%4;

}

}

return true;

}

 

Enemy::~Enemy()

{

}

5.6 Реализация класса Boss

#include "stdafx.h"

#include "Enemy.h"

 

Boss::Boss(Game* game, ObjectList* list, int x, int y, int l, int d):Enemy(game, list, x,y)

{

clip[ 3 ].x = 96;

clip[ 3 ].y = 0;

clip[ 3 ].w = 32;

clip[ 3 ].h = 32;

damg=d;

lives=l;

nsSurface = pGame->nsBoss;

}

 

void Boss::Process(Object* pObject)

{

if(bDie) return;

if(!pObject)

return;

if(Collision(pObject))

{

switch(pObject->GetType())

{

//если  объект столкнулся с пулей  - отнимается жизнь

case OBJECTTYPE_BULLET:

lives-=1;

break;

// если  объект столкнулся с улучшенной  пулей - отнимается её урон

case OBJECTTYPE_SBULL:

{

Sp_Bull *sb =dynamic_cast<Sp_Bull*>(pObject);

lives-=sb->Get_Dm();

}

break;

default:

break;

}

if (lives<0)

bDie=true;

return;

}

return;

}

 

bool Boss::Move()

{

if(bDie) return false;

FireCounter++;

if(Counter < 3) Counter++;

else

{

Counter = 0;

if(Frame < 2) Frame++;

else

Frame = 0;

}

if(MoveCounter < 20)

{

box.x += xVel;

box.y += yVel;

if(box.x > 608)

{

box.x = 608;

MoveCounter = 20;

}

if(box.y < -480)

{

box.y = -480;

MoveCounter = 20;

}

else

if(box.y > -32)

{

box.y = -32;

MoveCounter = 20;

}

 

MoveCounter++;

}

else

{

MoveCounter = 0;

if(FireCounter >= 100)

{

    Sp_Bull* pSB = new Sp_Bull(pGame, pList, box.x+12, box.y+32, 3, 2);

pList->AddObject(pSB);

FireCounter = 0;

}

else

{

xVel = 2 - rand()%4;

yVel = 2 - rand()%4;

}

}

return true;

}

 

Boss::~Boss()

{

}

5.7 Реализация класса Bullet

#include "stdafx.h"

#include "Bullet.h"

 

Bullet::Bullet(Game* game, ObjectList* list, int x, int y, int v)

{

for(int i=0; i<3; i++)

{

clip[ i ].x = i*8;

clip[ i ].y = 0;

clip[ i ].w = 8;

clip[ i ].h = 8;

}

bDie=false;

bAnim=true;

Counter=0;

Frame=0;

pGame = game;

pList = list;

yVel = v;

Init(x, y, 8, 8);

nsSurface = pGame->nsBullet;

}

 

void Bullet::Process(Object* pObject)

{

if(bDie) return;

if(!pObject)

return;

if(Collision(pObject) && pObject->GetType() != OBJECTTYPE_EXPLOSION)

{

switch(pObject->GetType())

{

//при  столконовении с врагом, враг  погибает только если пуля  была выпущена игроком

case OBJECTTYPE_ENEMY:

if(pl==true)

{

pObject->Kill();

Explosion* pExplosion = new Explosion(pGame, pList, box.x, box.y);

    pList->AddObject(pExplosion);

}

Kill();

break;

//при  столкновении с пулей любого  типа обе пули уничтожаются

case OBJECTTYPE_BULLET:

{

Explosion* pExplosion = new Explosion(pGame, pList, box.x, box.y);

pList->AddObject(pExplosion);

pObject->Kill();

}

break;

case OBJECTTYPE_SBULL:

{

Explosion* pExplosion = new Explosion(pGame, pList, box.x, box.y);

pList->AddObject(pExplosion);

pObject->Kill();

}

break;

//при столкновении с припятствием пуля его постепенно разрушает

case OBJECTTYPE_DEFENCE:

{

Explosion* pExplosion = new Explosion(pGame, pList, box.x, box.y);

pList->AddObject(pExplosion);

if(pObject->Frame < 5)

pObject->Frame++;

else

{

for(int index=0; index<8; index++)

{

pExplosion = new Explosion(pGame, pList, box.x + index*4, box.y + rand()%16);

pList->AddObject(pExplosion);

}

pObject->Kill();

}

}

break;

//при  столкновнии у игрока отнимается жизнь

case OBJECTTYPE_PLAYER:

{

Explosion* pExplosion = new Explosion(pGame, pList, box.x, box.y);

pList->AddObject(pExplosion);

pGame->NumLives--;

if(pGame->NumLives <= 0)

{

pObject->Kill();

for(int index=0; index < 8; index++)

{

pExplosion = new Explosion(pGame, pList, box.x+rand()%32, box.y+rand()%32);

pList->AddObject(pExplosion);

}

}

}

break;

default:

break;

}

Kill();

return;

}

return;

}

 

bool Bullet::Move()

{

if(bDie) return false;

if(Counter < 3) Counter++;

else

{

Counter = 0;

if(Frame < 2) Frame++;

else

Frame = 0;

}

box.y += yVel;

    if(box.y < -480 || box.y > 472)

return false;

return true;

}

 

Bullet::~Bullet()

{

}

5.8 Реализация класса Sp_Bull

#include "stdafx.h"

#include "Sp_Bull.h"

 

Sp_Bull::Sp_Bull(Game* game, ObjectList* list, int x, int y, int v, int d):Bullet(game, list, x, y, v)

{

for(int i=0; i<3; i++)

{

clip[ i ].x = i*16;

clip[ i ].y = 0;

clip[ i ].w = 19;

clip[ i ].h = 8;

}

Damage=d;

Init(x, y, 16, 8);

nsSurface = pGame->nsSpBull;

}

 

void Sp_Bull::Process(Object* pObject)

{

if(bDie) return;

if(!pObject)

return;

if(Collision(pObject) && pObject->GetType() != OBJECTTYPE_EXPLOSION)

{

Explosion* pExplosion = new Explosion(pGame, pList, box.x, box.y);

pList->AddObject(pExplosion);

switch(pObject->GetType())

{

case OBJECTTYPE_ENEMY:

{

if(pl==true)

pObject->Kill();

Kill();

}

break;

case OBJECTTYPE_BULLET:

pObject->Kill();

break;

case OBJECTTYPE_SBULL:

pObject->Kill();

break;

case OBJECTTYPE_DEFENCE:

{

for(int index=0; index<8; index++)

{

pExplosion = new Explosion(pGame, pList, box.x + index*4, box.y + rand()%16);

pList->AddObject(pExplosion);

}

pObject->Kill();

}

break;

case OBJECTTYPE_PLAYER:

pGame->NumLives=pGame->NumLives-Damage;

if(pGame->NumLives <= 0)

{

pObject->Kill();

for(int index=0; index < 8; index++)

{

pExplosion = new Explosion(pGame, pList, box.x+rand()%32, box.y+rand()%32);

pList->AddObject(pExplosion);

}

}

break;

default:

break;

}

Kill();

return;

}

return;

}

 

bool Sp_Bull::Move()

{

if(bDie) return false;

if(Counter < 3) Counter++;

else

{

Counter = 0;

if(Frame < 2) Frame++;

else

Frame = 0;

}

box.y += yVel;

    if(box.y < -480 || box.y > 472)

return false;

return true;

}

 

Sp_Bull::~Sp_Bull()

{

}

5.9 Реализация класса Explosion

#include "stdafx.h"

#include "Explosion.h"

 

Explosion::Explosion(Game* game, ObjectList* list, int x, int y)

{

bDie=false;

bAnim=true;

for(int i=0; i<8; i++)

{

clip[ i ].x = i*32;

clip[ i ].y = 0;

clip[ i ].w = 32;

clip[ i ].h = 32;

}

Counter=0;

Frame=0;

pGame = game;

pList = list;

Init(x-16, y-16, 32, 32);

nsSurface = pGame->nsExplosion;

}

 

void Explosion::Process(Object* pObject)

{

if(bDie) return;

}

 

bool Explosion::Move()

{

if(bDie) return false;

if(Counter < 3) Counter++;

else

{

Counter = 0;

if(Frame < 8)

Frame++;

else

return false;

}

return true;

}

 

Explosion::~Explosion()

{}

5.10 Реализация класса Life

#include "stdafx.h"

#include "Life.h"

 

Life::Life(Game* game, ObjectList* list, int x, int y, int b)

{

pGame = game;

pList = list;

Init(x, y, 24, 24);

bDie=false;

bAnim=false;

Frame=0;

Counter=0;

bonus=b;

nsSurface=pGame->nsLifeBonus;

}

 

void Life::Process(Object* pObject)

{

if(bDie) return;

if(!pObject)

return;

if(Collision(pObject) && (pObject->GetType() == OBJECTTYPE_PLAYER))

{

//если столкнвение  прозошло с игроком, то число  его жизней увеличивается

pGame->NumLives+=bonus;

Kill();

}

return;

}

 

bool Life::Move()

{

if(bDie) return false;

return true;

}

 

Life::~Life()

{

}

5.11 Реализация класса Defence

#include "stdafx.h"

#include "Defence.h"

 

Defence::Defence(Game* game, ObjectList* list, int x, int y)

{

pGame = game;

pList = list;

Init(x, y, 32, 32);

bDie=false;

bAnim=false;

Frame=0;

Counter=0;

nsSurface=pGame->nsDefence;

}

 

void Defence::Process(Object* pObject)

{

if(bDie) return;

if(!pObject)

Объектно ориентированное программирование. Простая игра