Объектно ориентированное программирование. Простая игра
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение
высшего профессионального образования
«Тихоокеанский
Кафедра
ПО ВТ и АС
Объектно-ориентированное программирование.
Курсовая работа.
060620080
Выполнила: студентка группы ПО-62 Разуваева Н.В.
Проверил: Пустынский И.С.
г. Хабаровск, 2008
Оглавление
1. Постановка задачи и описание программы
В качестве курсовой работы по объектно-ориентированному программированию было предложено написать простую игру. Основные требования к программе:
- Наличие не менее десяти различных классов
- Наличие различных типов связей между классами – наследование, агрегация и т.д.
- Взаимодействие между классами в реальном времени.
Описываемая ниже программа представляет собой игру под названием 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 Атрибуты класса
- SDL_Rect box – окружающий объект прямоугольник.
- bool bAnim – логическая переменная, принмающая 1, если объект движущийся и 0, если нет.
- bool bDie – логичекая переменная, принимающая 0, если объект не погиб, и 1 в противном случае.
- int Counter – счетчик для кадр ов.
- int Frame – текущий кадр изображения объекта.
- int xVel – скорость объекта по оси X/
- int yVel – скорость объекта по оси Y/
- SDL_Rect clip[ 8 ] – массив прямоугольников для вычленения изображений из спрайтовой таблицы.
- SDL_Surface* nsSurface – ссылка на объект типа SDL_Surface (встроенный класс библиотеки SDL для работы с графикой), хранящий изображение объекта.
- Game* pGame – ссылка на объект класса Game.
4.1.2 Методы класса
- Object() {} – пустой конструктор.
- void Init(int x, int y, int width, int height) – инициализирует основные атрибуты класса – координаты, высоту и ширину прямоугольника box.
- void Kill() – «убивает» объект.
- 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.
- void Process(Object* pObject) – виртуальная функция, обеспецивающая взаимодействие между объектами.
- virtual bool Move() – виртуальная функция, реализующая передвижение объектов.
- void Blit() – функция, реализующая визуальное отображение объекта.
- 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 Атрибуты класса
- Game* pGame – ссылка на объект класса Game.
- OBJECTLIST Objects – список объктов класса Object.
4.2.2 Методы класса
- void AddObject(Object* pObject) – добавляет объект pObject к списку.
- void BlitObjects() – функция, реализующая отображение всех объектов, хранящихся в списке.
- void ProcessObjects() – функция, реализующая взаимодействие между объектами в списке.
- 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 Атрибуты класса
- 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_Event, позволяющий обрабатывать такие события, как нажатие клавиш, закрытие окна и т.д.
- SDL_Surface* screen – поверхность, представляющая собой собственно окно.
- SDL_Rect camera – объект класса SDL_Rect, позволяющий прокручивать задний фон.
4.3.2 Методы класса
- Game() – конструктор.
- void MoveCam(int y) – функция, передвигающая объект camera, изменяя его координату по оси Y на величину у.
- void FlipScreen() – обновление экрана.
- void ClearScreen() – очистка экрана.
- void DrawStatus() – выводит на экран количество жизней игрока или сообщение о проигрыше, если их число равно 0.
- bool IsGameOver() – возвращает true, если число жизней равно 0.
- 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 Атрибуты класса
- ObjectList* pList – указатель на объект класса ObjectList.
- int Ammo – число улучшенных пуль.
4.4.2 Методы класса
- Player(Game* game, ObjectList* list) – конструктор.
- int GetType() – возвращает тип объекта OBJECTTYPE_PLAYER.
- void Process(Object* pObject) – реализует взаимодействие объекта класса Player с объектами других классов.
- void Show_Am() – выводит информацию о количестве улучшенных пуль на экран.
- bool Move() – функция, реализующая передвижение объекта.
- void handle_input() – обрабатывает внешние события, такие как нажатие клавиш.
- 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 Атрибуты класса
- ObjectList* pList – указатель на объект класса ObjectList.
- int MoveCounter – счётчик передвижений.
- int FireCounter – счётчик огня.
4.5.2 Методы класса
- Enemy(Game* game, ObjectList* list, int x, int y) – конструктор. x и y – координаты объекта.
- int GetType() – возвращает тип объекта OBJECTTYPE_ENEMY.
- 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 Атрибуты класса
- int damg – урон, наносимый боссом.
- int lives – жизни босса.
4.6.2 Методы класса
- Boss(Game* game, ObjectList* list, int x, int y, int l, int d) – конструктор. x и y – координаты объекта, l – количество жизней, d – наносимый урон.
- int GetType() – возвращает тип объекта OBJECTTYPE_BOSS.
- 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 Атрибуты класса
- ObjectList* pList – указатель на объект класса ObjectList.
- bool pl – логическая переменная, определяющая, была ли пуля выпущена игроком или противником.
4.7.2 Методы класса
- void set_sr(bool b) – устанавливает значение pl.
- bool get_sr() – возвращает значение pl.
- Bullet(Game* game, ObjectList* list, int x, int y, int v) – конструктор. x и y – координаты объекта, v – скорость пули.
- int GetType() – возвращает тип объекта OBJECTTYPE_BULLET.
- 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 Атрибуты класса
- int Damage – урон, наносимый боссом.
4.8.2 Методы класса
- int Get_Dm() – возвращает значение переменной damage.
- Sp_Bull(Game* game, ObjectList* list, int x, int y, int v, int d) – конструктор. x и y – координаты объекта, v – скорость пули, d – наносимый урон.
- int GetType() – возвращает тип объекта OBJECTTYPE_SBULL.
- 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 Атрибуты класса
- ObjectList* pList - указатель на объект класса ObjectList.
4.9.2 Методы класса
- Explosion(Game* game, ObjectList* list, int x, int y) – конструктор.
- int GetType() - возвращает тип объекта OBJECTTYPE_EXPLOSION.
- 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 Атрибуты класса
- ObjectList* pList - указатель на объект класса ObjectList.
- int bonus – число, на которое увеличится число жизней при получении бонуса.
4.10.2 Методы класса
- Life(Game* game, ObjectList* list, int x, int y, int b) – конструктор. b – число жизней, который прибавляет бонус.
- int GetType()- возвращает тип объекта OBJECTTYPE_LIFE.
- 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 Атрибуты класса
- ObjectList* pList - указатель на объект класса ObjectList.
4.11.2 Методы класса
- Defence(Game* game, ObjectList* list, int x, int y) – конструктор.
- int GetType() - возвращает тип объекта OBJECTTYPE_EXPLOSION.
- 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->
}
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,
}
}
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()==
{
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,
}
}
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.
{
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==
{
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==
{
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*>(
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->
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)

- Объектно-ориентированные СУБД
- Объектно-ориентированные СУБД
- Объектно – ориентированные языки программирования
- Объектно-ориентированные языки программирования
- Объектно-ориентированный анализ и проектирование программного обеспечения для улучшения качества продуктов методом бенчмаркинга G3:ID
- Объектно-ориентированных СУБД и расширение масштабов применения объектно-ориентированных БД
- Объектом работы являются эксплуатационные скважины для освоения месторождений Западной Сибири
- Объектно-ориентированное программирование
- Объектно-ориентированное программирование
- Объектно-ориентированное программирование
- Объектно-ориентированное программирование
- Объектно-ориентированное программирование VisualC#
- Объектно-ориентированное программирование на VBA в среде Excel
- Объектно-ориентированное программирование на VBA в среде Excel