Игры "ghost's city"
Автор: JuliaLenny • Февраль 10, 2018 • Курсовая работа • 52,057 Слов (209 Страниц) • 586 Просмотры
Страница 1 из 209
- МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
- федеральное государственное автономное образовательное учреждение
высшего профессионального образования
- «Санкт-Петербургский государственный университет
аэрокосмического приборостроения»
- КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
- КУРСОВАЯ РАБОТА
- ЗАЩИЩЕНА С ОЦЕНКОЙ
- РУКОВОДИТЕЛЬ
- доцент, канд. техн. наук
|
|
|
| - Л.Н. Бариков
|
- должность, уч. степень, звание
|
| - подпись, дата
|
| - инициалы, фамилия
|
- ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
К КУРСОВОЙ РАБОТЕ
|
- Игра «Ghost’s city»
|
- по дисциплине: Основы программирования
|
|
|
- РАБОТУ ВЫПОЛНИЛ
- СТУДЕНТ ГР.
| - 4642
|
|
|
| - Ю.Л.Ляпина
|
|
|
| - подпись, дата
|
| - инициалы, фамилия
|
- Санкт-Петербург
- 2017
- СОДЕРЖАНИЕ
- Введение……………………………………………………………………………………………3
- 1.Постановка задачи……………………………………………………………………………….4
- 2.Спецификация……………………………………………………………………………………5
- 2.1 Спецификация…………………………………………………………………………...6
- 3.Текст программы…………………………………………………………………………………7
- Аннотация…………………………………………………………………………………...8
- Содержание………………………………………………………………………………….9
- 3.1 Текст программы……………………………………………………………………….10
- 3.2 Результаты тестирования………………………………………………………………53
- 4.Описание программы……………………………………………………………………………54
- Аннотация……………………………………………………………………………...…...55
- Содержание……………………………………………………………………………...….56
- 4.1 Общие сведения…………………………………………………………………...…...57
- 4.2 Функциональное назначение……………………………………………………...…..57
- 4.3 Описание логической структуры………………………………………………....…...57
- 4.4 Спецификация подпрограмм……………………………………………………...…..57
- 4.5 Используемые технические средства…………………………………………….…...61
- 4.6 Вызов и загрузка……………………………………………………………………..…61
- 5. Описание применения……………………………………………………………………….….62
- Аннотация……………………………………………………………………………….….63
- Содержание…………………………………………………………………………………64
- 5.1 Назначение программы………………………………………………………………...65
- 5.2 Условия применения……………………………………………………………...……65
- 5.3 Описание задачи………………………………………………………………………...65
- 5.4 Основные характеристики занимаемой памяти……………………………………....65
- Заключение……………………………………………………………………………………….....66
- Список используемых источников………………………………………………………………..67
- Введение
- Данная курсовая работа способствует закреплению учебного материала, изученного по курсу «Основы программирования».
- Программа представляет собой приложение «Ghost’s city», используется в качестве игры для одного человека.
- Цель курсового проекта — выработать навыки общеизвестных алгоритмов для решения конкретных задач, закрепить знания по программированию на языке С++.
- Курсовая работа поможет приобрести навыки по оформлению документации на программные средства.
- 1.Постановка задачи
- Используя технологию объектно-ориентированного программирования и кроссплатформенную мультимедийную библиотеку SFML, написать программу «Ghost’s city».
- Используя клавиатуру программу может использовать только 1 человек.
- Программу «Ghost’s city» создать на языке С++, в среде программирования MS Visual Studio 2013.
- МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
- федеральное государственное автономное образовательное учреждение
высшего профессионального образования
- «Санкт-Петербургский государственный университет
аэрокосмического приборостроения»
- КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
- ПРОГРАММА
|
- Игра «Ghost’s city»
|
- Спецификация
|
- 44.4642.17-01
|
|
- РАБОТУ ВЫПОЛНИЛ
- СТУДЕНТ ГР.
| - 4642
|
|
|
| - Ю.Л.Ляпина
|
|
|
| - подпись, дата
|
| - инициалы, фамилия
|
- Санкт-Петербург
- 2017
- 2.1 Спецификация
- Обозначение
| - Наименование
| - Применение
|
- 44.4642.17-01
| - Документация
- Программа «Ghost’s city»
- Спецификация
|
|
- 44.4642.17-12
| - Документация
- Программа «Ghost’s city»
- Текст программы
|
|
- 44.4642.17-13
| - Документация
- Программа «Ghost’s city»
- Описание программы
|
|
- 44.4642.17-31
| - Документация
- Программа «Ghost’s city»
- Описание применения
|
|
- МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
- федеральное государственное автономное образовательное учреждение
высшего профессионального образования
- «Санкт-Петербургский государственный университет
аэрокосмического приборостроения»
- КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
- ПРОГРАММА
|
- Игра «Ghost’s city»
|
- Текст программы
|
- 44.4642.17-12
|
|
- РАБОТУ ВЫПОЛНИЛ
- СТУДЕНТ ГР.
| - 4642
|
|
|
| - Ю.Л.Ляпина
|
|
|
| - подпись, дата
|
| - инициалы, фамилия
|
- Санкт-Петербург
- 2017
- Аннотация
- В документе приводится текст программы игры «Ghost’s city», написанной на языке С++, так же результаты тестирования.
- Содержание
- 3.1 Текст программы
- 3.2 Результаты тестирования
- 3.1 Текст программы
- bullet.cpp
- #include "bullet.h"
- #include "wall.h"
- Bullet::Bullet()
- {
- m_type = GameObjectType_Bullet;
- m_ownerType = GameObjectType_None;
- setTextureRect(kBulletImage);
- }
- void Bullet::render(sf::RenderWindow* rw)
- {
- GameObject::render(rw);
- }
- void Bullet::intersect(GameObject* object)
- {
- // удаляет себя
- setHealth(0);
- // наносит урон
- object->doDamage(1);
- }
- bullet.h
- #pragma once
- #include "gameObject.h"
- #include "level.h"
- class Bullet
- : public GameObject
- {
- public:
- Bullet();
- virtual void render(sf::RenderWindow* rw);
- virtual void intersect(GameObject* object);
- void setOwnerType(GameObjectType ownerType) { m_ownerType = ownerType; }
- GameObjectType getOwnerType() { return m_ownerType; }
- private:
- GameObjectType m_ownerType;
- };
- direction.h
- #pragma once
- enum Direction
- {
- Direction_Left,
- Direction_Up,
- Direction_Right,
- Direction_Down,
- Direction_MAX
- };
- enemy.cpp
- #include "enemy.h"
- #include "ghostEnemy.h"
- #include "utils.h"
- /////////////////////////////////////
- // Class Enemy
- Enemy::Enemy()
- {
- m_type = GameObjectType_Enemy;
- m_spawnTime = kEnemyEmergenceTime; //spawn - место появления spawner - моб, враг
- m_spawnTimer = GetRandomFloat(0.0, m_spawnTime);
- m_physical = false;
- }
- void Enemy::update(float dt)
- {
- GameObject::update(dt);
- m_spawnTimer += dt;
- if (m_spawnTimer > m_spawnTime)
- {
- m_spawnTimer = 0.0f;
- int enemiesOnLevel = m_game->getObjectsCount(GameObjectType_GhostEnemy);
- int enemiesStorageLeft = kEnemiesLevel - enemiesOnLevel - m_game->getDiedEnemiesCount();
- if (enemiesStorageLeft > 0 && enemiesOnLevel < kEnemiesLevelInOneMoment)
- m_game->createObject(GameObjectType_GhostEnemy, getX(), getY());
- }
- }
- enemy.h
- #pragma once
- #include "gameObject.h"
- #include "level.h"
- class Enemy
- : public GameObject
- {
- public:
- Enemy();
- virtual void update(float dt);
- private:
- float m_spawnTimer;
- float m_spawnTime;
- };
- game.cpp
- #include "game.h"
- #include
- #include
- #include
- #include
- #include "level.h"
- #include "wall.h"
- #include
- #include "bullet.h"
- #include "ghostPlayer.h"
- #include "ghostEnemy.h"
- #include "enemy.h"
- sf::Texture* g_atlas00 = 0;
- Game::Game()
- {
- m_isGameActive = true;
- m_clockLastFrame = 0;
- for (int i = 0; i < kObjectsCountMax; i++)
- m_objects[i] = 0;
- m_player = 0;
- m_diedEnemiesCount = 0;
- m_renderWindow = 0;
- }
- Game::~Game()
- {
- if (g_atlas00)
- delete g_atlas00;
- if (m_renderWindow)
- delete m_renderWindow;
- }
- void Game::setupSystem()
- {
- srand(time(0));
- m_renderWindow = new sf::RenderWindow(
- sf::VideoMode(kPixels * kScreenColumns, kPixels * kScreenRows, 32),
- "Ghost's City",
- sf::Style::Titlebar | sf::Style::Close);
- g_atlas00 = new sf::Texture();
- g_atlas00->loadFromFile("atlas00.png");
- }
- void Game::initialize()
- {
- shutdown();
- m_diedEnemiesCount = 0;
- // загрузка уровня
- for (int r = 0; r < kLevelRows; r++)
- {
- for (int c = 0; c < kLevelColumns; c++)
- {
- unsigned char cellSymbol = kLevelData0[r][c];
- switch (cellSymbol)
- {
- case CellSymbol_BrickWall:
- {
- Wall* wall = (Wall*)createObject(GameObjectType_Wall, c, r);
- wall->setTextureRect(kBrickWallImage);
- break;
- }
- case CellSymbol_SteelWall:
- {
- Wall* wall = (Wall*)createObject(GameObjectType_Wall, c, r);
- wall->setTextureRect(kSteelWallImage);
- wall->setInvulnerable(true);
- break;
- }
-
- case CellSymbol_Player:
- {
- GhostPlayer* player = (GhostPlayer*)createObject(GameObjectType_GhostPlayer, c + 0.5, r + 0.5);
- player->setSpriteColor(sf::Color(255, 255, 255));
- player->setKeys('A', 'D', 'W', 'S', VK_SPACE);
- m_player = player;
- break;
- }
- case CellSymbol_Enemy:
- {
- createObject(GameObjectType_Enemy, c, r);
- break;
- }
- }
- }
- }
- }
- bool Game::loop()
- {
- if (!m_renderWindow->isOpen())
- return false;
- // время обновления
- clock_t clockNow = clock();
- clock_t deltaClock = clockNow - m_clockLastFrame;
- float deltaTime = float(deltaClock) / CLOCKS_PER_SEC;
- m_clockLastFrame = clockNow;
- sf::Event event;
- while (m_renderWindow->pollEvent(event))
- {
- if (event.type == sf::Event::Closed)
- m_renderWindow->close();
- }
- render();
- update(deltaTime);
- return m_isGameActive;
- }
- void Game::shutdown()
- {
- for (int i = 0; i < kObjectsCountMax; i++)
- if (m_objects[i] != 0)
- {
- delete m_objects[i];
- m_objects[i] = 0;
- }
- }
- void Game::render()
- {
- // начало кадра
- m_renderWindow->clear(sf::Color(20, 20, 20));
- // прорисовка всех обектов
- int objectsCount = 0;
- for (int i = 0; i < kObjectsCountMax; i++)
- if (m_objects[i] != 0)
- {
- m_objects[i]->render(m_renderWindow);
- objectsCount++;
- }
- m_renderWindow->display();
- }
- void Game::update(float dt)
- {
- for (int i = 0; i < kObjectsCountMax; i++)
- if (m_objects[i] != 0)
- {
- m_objects[i]->update(dt);
- if (m_objects[i]->getHealth() <= 0 && m_objects[i]->getDestroyAfterDeath())
- destroyObject(m_objects[i]);
- }
- // удаление игрока
- if (m_player && m_player->getHealth() <= 0)
- {
- destroyObject(m_player);
- m_player = NULL;
- initialize();
- }
- // удаление всех врагов
- if (m_diedEnemiesCount == kEnemiesLevel) {
- m_renderWindow->clear(sf::Color(176, 196, 222));
-
- m_renderWindow->display();
-
- }
- }
- GameObject* Game::checkIntersects(float x, float y, float width, float height, GameObject* exceptObject)
- {
- int r00 = int(y);
- int c00 = int(x);
- int r01 = r00 + height - 1;
- int c01 = c00 + width - 1;
- for (int i = 0; i < kObjectsCountMax; i++)
- if (m_objects[i] != 0 && m_objects[i]->getPhysical() && m_objects[i] != exceptObject)
- {
- int r10 = int(m_objects[i]->getY());
- int c10 = int(m_objects[i]->getX());
- int r11 = r10 + m_objects[i]->getHeight() - 1;
- int c11 = c10 + m_objects[i]->getWidth() - 1;
- if (r00 <= r11 && r01 >= r10 && c00 <= c11 && c01 >= c10)
- return m_objects[i];
- }
- return 0;
- }
- bool Game::moveObjectTo(GameObject* object, float x, float y)
- {
- int r0 = int(y);
- int c0 = int(x);
- int r1 = r0 + object->getHeight() - 1;
- int c1 = c0 + object->getWidth() - 1;
- if (r0 < 0 || c0 < 0 || r1 >= kLevelRows || c1 >= kLevelColumns)
- return false;
- bool canMoveToCell = false;
- GameObject* otherObject = checkIntersects(x, y, object->getWidth(), object->getHeight(), object);
- if (otherObject)
- object->intersect(otherObject);
- else
- canMoveToCell = true;
- if (canMoveToCell)
- {
- object->setX(x);
- object->setY(y);
- }
- return canMoveToCell;
- }
- int Game::getObjectsCount(GameObjectType type)
- {
- int totalCount = 0;
- for (int i = 0; i < kObjectsCountMax; i++)
- {
- if (m_objects[i] == 0)
- continue;
- if (m_objects[i]->getType() == type)
- totalCount++;
- }
- return totalCount;
- }
- GameObject* Game::createObject(GameObjectType type, float x, float y)
- {
- // нахождение свободного указател и осоздание объекта
- for (int i = 0; i < kObjectsCountMax; i++)
- {
- if (m_objects[i] == 0)
- {
- GameObject* object = 0;
- switch (type)
- {
- case GameObjectType_Wall: object = new Wall(); break;
- case GameObjectType_Bullet: object = new Bullet(); break;
- case GameObjectType_GhostPlayer: object = new GhostPlayer(); break;
- case GameObjectType_GhostEnemy: object = new GhostEnemy(); break;
- case GameObjectType_Enemy: object = new Enemy(); break;
- }
- if (object == 0)
- return 0;
- object->setGame(this);
- if (moveObjectTo(object, x, y) == false)
- {
- delete object;
- return 0;
- }
- m_objects[i] = object;
- return object;
- }
- }
- return 0;
- }
- void Game::destroyObject(GameObject* object)
- {
- for (int i = 0; i < kObjectsCountMax; i++)
- {
- if (m_objects[i] == object)
- {
- delete m_objects[i];
- m_objects[i] = 0;
- return;
- }
- }
- }
- void Game::increaseDiedEnemiesCount()
- {
- m_diedEnemiesCount++;
- }
- game.h
- #pragma once
- #include
- #include
- #include "gameObject.h"
- #include "gameObjectType.h"
- const int kObjectsCountMax = 1024;
- // предварительное объявление класса
- class GameObject;
- class Game
- {
- public:
- Game();
- ~Game();
- void setupSystem();
- void initialize();
- bool loop();
- void shutdown();
- GameObject* createObject(GameObjectType type, float x, float y);
- void destroyObject(GameObject* object);
- GameObject* checkIntersects(float x, float y, float width, float height, GameObject* exceptObject);
- bool moveObjectTo(GameObject* object, float x, float y);
- int getObjectsCount(GameObjectType type);
- int getDiedEnemiesCount() { return m_diedEnemiesCount; }
- void increaseDiedEnemiesCount();
- private:
- void render();
- void update(float dt);
- private:
- bool m_isGameActive;
- clock_t m_clockLastFrame;
- sf::RenderWindow* m_renderWindow;
- GameObject* m_objects[kObjectsCountMax];
- GameObject* m_player;
- int m_diedEnemiesCount;
- };
- gameObject.cpp
- #include "gameObject.h"
- #include "level.h"
- GameObject::GameObject()
- {
- m_game = 0;
- m_type = GameObjectType_None;
- m_x = 0.0;
- m_y = 0.0;
- m_xSpeed = 0.0;
- m_ySpeed = 0.0;
- m_width = 1;
- m_height = 1;
- m_health = 1;
- m_destroyAfterDeath = true;
- m_invulnerable = false;
- m_physical = true;
- m_direction = Direction_Up;
- m_sprite = new sf::Sprite();
- m_sprite->setTexture(*g_atlas00);
- setTextureRect(sf::IntRect());
- }
- GameObject::~GameObject()
- {
- if (m_sprite)
- delete m_sprite;
- }
- void GameObject::render(sf::RenderWindow* rw)
- {
- if (m_sprite)
- {
- int row = int(m_y);
- int column = int(m_x);
- m_sprite->setPosition(column * kPixels, row * kPixels);
- rw->draw(*m_sprite);
- }
- }
- void GameObject::update(float dt)
- {
- int oldRow = int(m_y);
- int oldColumn = int(m_x);
- float newY = m_y + m_ySpeed * dt;
- float newX = m_x + m_xSpeed * dt;
- int newRow = int(newY);
- int newColumn = int(newX);
- if (oldColumn != newColumn)
- m_game->moveObjectTo(this, newX, m_y);
- else
- m_x = newX;
- if (oldRow != newRow)
- m_game->moveObjectTo(this, m_x, newY);
- else
- m_y = newY;
- }
- void GameObject::intersect(GameObject* object)
- {
- }
- void GameObject::doDamage(int damage)
- {
- if (getInvulnerable())
- return;
- if (m_health > damage)
- m_health -= damage;
- else
- m_health = 0;
- }
- gameObject.h
- #pragma once
- #include "direction.h"
- #include "game.h"
- #include "gameObjectType.h"
- // педварительное объявление класса
- class Game;
- class GameObject
- {
- public:
- GameObject();
- virtual ~GameObject();
- virtual void render(sf::RenderWindow* rw);
- virtual void update(float dt);
- virtual void intersect(GameObject* object);
- GameObjectType getType() { return m_type; }
- void setGame(Game* game) { m_game = game; }
- void setX(float x) { m_x = x; }
- float getX() { return m_x; }
- void setY(float y) { m_y = y; }
- float getY() { return m_y; }
- void setXSpeed(float xSpeed) { m_xSpeed = xSpeed; }
- float getXSpeed() { return m_xSpeed; }
- void setYSpeed(float ySpeed) { m_ySpeed = ySpeed; }
- float getYSpeed() { return m_ySpeed; }
- void setWidth(int width) { m_width = width; }
- int getWidth() { return m_width; }
- void setHeight(int height) { m_height = height; }
- int getHeight() { return m_height; }
- void setHealth(int health) { m_health = health; }
- int getHealth() { return m_health; }
- void setDestroyAfterDeath(bool destroyAfterDeath) { m_destroyAfterDeath = destroyAfterDeath; }
- bool getDestroyAfterDeath() { return m_destroyAfterDeath; }
- void setInvulnerable(bool invulnerable) { m_invulnerable = invulnerable; }
- bool getInvulnerable() { return m_invulnerable; }
- void setPhysical(bool physical) { m_physical = physical; }
- bool getPhysical() { return m_physical; }
- void setDirection(Direction direction) { m_direction = direction; }
- Direction getDirection() { return m_direction; }
- void doDamage(int damage);
- void setSpriteColor(sf::Color color) { m_sprite->setColor(color); }
- void setTextureRect(sf::IntRect rect) { m_sprite->setTextureRect(rect); }
- protected:
- Game* m_game;
- GameObjectType m_type;
- float m_x;
- float m_y;
- float m_xSpeed;
- float m_ySpeed;
- int m_width;
- int m_height;
- int m_health;
- bool m_destroyAfterDeath;
- bool m_invulnerable;
- bool m_physical;
- Direction m_direction;
- sf::Sprite* m_sprite;
- };
- gameObjectType.h
- #pragma once
- enum GameObjectType
- {
- GameObjectType_None,
- GameObjectType_Ghost,
- GameObjectType_GhostPlayer,
- GameObjectType_GhostEnemy,
- GameObjectType_Wall,
- GameObjectType_Bullet,
- GameObjectType_Enemy,
- };
- ghost.cpp
- #include "ghost.h"
- #include "bullet.h"
- Ghost::Ghost()
- {
- m_type = GameObjectType_Ghost;
- m_width = kGhostSize;
- m_height = kGhostSize;
- m_speed = 0;
- m_recoveryTime = 0.0;
- }
- void Ghost::update(float dt)
- {
- GameObject::update(dt);
- if (m_recoveryTime > 0)
- m_recoveryTime -= dt;
- }
- void Ghost::render(sf::RenderWindow* rw)
- {
- sf::IntRect texRect = kGhostImage;
- texRect.left += m_width * kPixels * m_direction;
- setTextureRect(texRect);
- GameObject::render(rw);
- }
- void Ghost::move(Direction direction)
- {
- setDirection(direction);
- setXSpeed(0);
- setYSpeed(0);
- switch (m_direction)
- {
- case Direction_Left: setXSpeed(-m_speed); break;
- case Direction_Right: setXSpeed(m_speed); break;
- case Direction_Up: setYSpeed(-m_speed); break;
- case Direction_Down: setYSpeed(m_speed); break;
- }
- }
- void Ghost::fire()
- {
- if (m_recoveryTime > 0)
- return;
- m_recoveryTime = kGhostRecoveryTime;
- float x = 0.0;
- float y = 0.0;
- float xSpeed = 0.0;
- float ySpeed = 0.0;
- calculateFrontCellPosition(&x, &y);
- switch (m_direction)
- {
- case Direction_Left: xSpeed = -kBulletSpeed; break;
- case Direction_Right: xSpeed = kBulletSpeed; break;
- case Direction_Up: ySpeed = -kBulletSpeed; break;
- case Direction_Down: ySpeed = kBulletSpeed; break;
- }
- Bullet* bullet = (Bullet*)m_game->createObject(GameObjectType_Bullet, x, y);
- if (bullet)
- {
- bullet->setOwnerType(m_type);
- bullet->setXSpeed(xSpeed);
- bullet->setYSpeed(ySpeed);
- }
- }
- void Ghost::calculateFrontCellPosition(float* x, float* y)
- {
- switch (m_direction)
- {
- case Direction_Left:
- (*x) = int(getX()) - 0.01;
- (*y) = int(getY()) + (getHeight() / 2.0);
- break;
- case Direction_Right:
- (*x) = int(getX()) + getWidth() + 0.01;
- (*y) = int(getY()) + (getHeight() / 2.0);
- break;
- case Direction_Up:
- (*y) = int(getY()) - 0.01;
- (*x) = int(getX()) + (getWidth() / 2.0);
- break;
- case Direction_Down:
- (*y) = int(getY()) + getHeight() + 0.01;
- (*x) = int(getX()) + (getWidth() / 2.0);
- break;
- }
- }
- ghost.h
- #pragma once
- #include "gameObject.h"
- #include "level.h"
- class Ghost
- : public GameObject
- {
- public:
- Ghost();
- virtual void update(float dt);
- virtual void render(sf::RenderWindow* rw);
- void move(Direction direction);
- void fire();
- protected:
- void calculateFrontCellPosition(float* x, float* y);
- protected:
- float m_recoveryTime;
- float m_speed;
- };
- ghostEnemy.cpp
- #include "ghostEnemy.h"
- #include "utils.h"
- #include "wall.h"
- #include "bullet.h"
- GhostEnemy::GhostEnemy()
- {
- m_type = GameObjectType_GhostEnemy;
- m_analizeTime = kEnemyAIAnalizeTime;
- m_analizeTimer = GetRandomFloat(0.0, m_analizeTime);
- m_lastAnalizeX = 0.0;
- m_lastAnalizeY = 0.0;
- m_health = kEnemyHealth;
- m_speed = kEnemySpeed;
- setSpriteColor(sf::Color(0, 165, 226));
- }
- GhostEnemy::~GhostEnemy()
- {
- m_game->increaseDiedEnemiesCount();
- }
- void GhostEnemy::update(float dt)
- {
- Ghost::update(dt);
- m_analizeTimer += dt;
- if (m_analizeTimer >= m_analizeTime)
- {
- m_analizeTimer = 0;
- analize();
- }
- }
- void GhostEnemy::analize()
- {
- float x = 0.0;
- float y = 0.0;
- calculateFrontCellPosition(&x, &y);
- float xDelta = 0.0;
- float yDelta = 0.0;
- switch (m_direction)
- {
- case Direction_Left: xDelta = -1.0; break;
- case Direction_Right: xDelta = 1.0; break;
- case Direction_Up: yDelta = -1.0; break;
- case Direction_Down: yDelta = 1.0; break;
- }
- // находит ближайшего врага и расстояние к нему
- GameObject* object = 0;
- int distance = 0;
- do
- {
- object = m_game->checkIntersects(x, y, 1, 1, 0);
- x += xDelta;
- y += yDelta;
- ++distance;
- } while (object == 0);
- // защита от пуль
- if (object->getType() == GameObjectType_Bullet)
- {
- if (((Bullet*)object)->getOwnerType() == GameObjectType_GhostPlayer)
- fire();
- return;
- }
- // атака
- if (object->getType() == GameObjectType_GhostPlayer)
- {
- fire();
- return;
- }
- // 20% смена направления
- if (0 == rand() % 5)
- {
- // движение в случайном направлении
- moveRandomDirection();
- return;
- }
- switch (object->getType())
- {
- case GameObjectType_Wall:
- if (((Wall*)object)->getInvulnerable() == false)
- {
- fire();
- return;
- }
- break;
- }
- // смена направления
- if (distance == 1
- || ((int)m_lastAnalizeX == (int)getX() && (int)m_lastAnalizeY == (int)getY()))
- {
- // движение в случайном направлении
- moveRandomDirection();
- return;
- }
- m_lastAnalizeX = getX();
- m_lastAnalizeY = getY();
- }
- void GhostEnemy::moveRandomDirection()
- {
- Direction prevDirection = getDirection();
- Direction newDirection;
- do
- {
- newDirection = (Direction)(rand() % ((int)Direction_MAX));
- } while (prevDirection == newDirection);
- move(newDirection);
- }
- ghostEnemy.h
- #pragma once
- #include "ghost.h"
- class GhostEnemy
- : public Ghost
- {
- public:
- GhostEnemy();
- ~GhostEnemy();
- void update(float dt);
- protected:
- void analize();
- void moveRandomDirection();
- protected:
- float m_analizeTimer;
- float m_analizeTime;
- float m_lastAnalizeX;
- float m_lastAnalizeY;
- };
- ghostPlayer.cpp
- #include "ghostPlayer.h"
- #include "utils.h"
- GhostPlayer::GhostPlayer()
- {
- m_type = GameObjectType_GhostPlayer;
- m_keyLeft = 0;
- m_keyRight = 0;
- m_keyUp = 0;
- m_keyDown = 0;
- m_keyFire = 0;
- m_health = kPlayerHealth;
- m_speed = kPlayerSpeed;
- m_destroyAfterDeath = false;
- }
- void GhostPlayer::update(float dt)
- {
- Ghost::update(dt);
- if (IsKeyDown(m_keyLeft))
- move(Direction_Left);
- else
- if (IsKeyDown(m_keyRight))
- move(Direction_Right);
- else
- if (IsKeyDown(m_keyUp))
- move(Direction_Up);
- else
- if (IsKeyDown(m_keyDown))
- move(Direction_Down);
- else
- {
- setXSpeed(0);
- setYSpeed(0);
- }
- if (IsKeyDown(m_keyFire))
- fire();
- }
- void GhostPlayer::setKeys(int keyLeft, int keyRight, int keyUp, int keyDown, int keyFire)
- {
- m_keyLeft = keyLeft;
- m_keyRight = keyRight;
- m_keyUp = keyUp;
- m_keyDown = keyDown;
- m_keyFire = keyFire;
- }
- ghostPlayer.h
- #pragma once
- #include "ghost.h"
- class GhostPlayer
- : public Ghost
- {
- public:
- GhostPlayer();
- void update(float dt);
- void setKeys(int keyLeft, int keyRight, int keyUp, int keyDown, int keyFire);
- protected:
- int m_keyLeft;
- int m_keyRight;
- int m_keyUp;
- int m_keyDown;
- int m_keyFire;
- };
- level.h
- #include
- #include "direction.h"
- // внешнее
- extern sf::Texture* g_atlas00;
- // данные уровеня
- const int kScreenRows = 40;
- const int kScreenColumns = 80;
- const int kLevelRows = kScreenRows;
- const int kLevelColumns = 70;
- const int kPixels = 15;
- const unsigned char CellSymbol_Player = '1';
- const unsigned char CellSymbol_Ghost = 'T';
- const unsigned char CellSymbol_BrickWall = '#';
- const unsigned char CellSymbol_SteelWall = '@';
- const unsigned char CellSymbol_Enemy = 'S';
- const unsigned char kLevelData0[kLevelRows][kLevelColumns + 1] =
- {
- "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
- "@S @@ S @",
- "@ @@ @",
- "@ @@ @",
- "@ S @@@@ @",
- "@ @ @",
- "@ @ @",
- "@@@@@@@@@@@@@@@@ @ @",
- "@ @ @ @",
- "@ @ @ @",
- "@ @ @@@@@@ @",
- "@ @ @",
- "@ @@@@@ @",
- "@ @ @",
- "@ @ @",
- "@ @ @@@@@@@@@@@@@@@@@@@@@",
- "@ S @ @ @",
- "@ @ @ @",
- "@ @ @ @ @",
- "@@@@@@@@@@@@@@@@ @ @ @ @",
- "@ @ @ @",
- "@ @ @ @",
- "@ @@@@@@ @@@@ @",
- "@ @ @@ @",
- "@ @ @",
- "@ @ S @",
- "@@@@@@@@@@@@@@@@@@ @@ @",
- "@ @ @@ @",
- "@ 1 @ @@ @",
- "@ @ @@ @@@ @",
- "@ @@ @@@ @",
- "@ @@ @ @",
- "@ @@ @ @",
- "@ @@ @ @",
- "@ @ @@ @ @",
- "@ @ @@ @ @",
- "@ @ @@ @ @",
- "@ @ @ @ @",
- "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
- };
- const sf::IntRect kBrickWallImage = sf::IntRect(0, 3 * kPixels, kPixels, kPixels);
- const sf::IntRect kSteelWallImage = sf::IntRect(kPixels, 3 * kPixels, kPixels, kPixels);
- // данные призрака
- const float kGhostRecoveryTime = 0.5; //FireCooldown воссстановление
- const int kGhostSize = 3; //размер призрака
- const sf::IntRect kGhostImage = sf::IntRect(0, 0, kGhostSize*kPixels, kGhostSize*kPixels);
- // данные игрока
- const int kPlayerHealth = 16; //здоровье
- const int kPlayerSpeed = 10; //скорость
- // данные врага
- const int kEnemiesLevel = 10; //количество врагов
- const int kEnemiesLevelInOneMoment = 6; //масимальное кооличество врагов в один момент
- const int kEnemyHealth = 5; //здоровье врага
- const int kEnemySpeed = 5; //скорость врагов
- const float kEnemyEmergenceTime = 10.0; // востанновление
- const float kEnemyAIAnalizeTime = 0.5;
- // данные пули
- const float kBulletSpeed = 30.0;
- const sf::IntRect kBulletImage = sf::IntRect(0, 4 * kPixels, kPixels, kPixels);
- main.cpp
- #define _CRT_SECURE_NO_WARNINGS
- #include "game.h"
- #include
- // Чтобы убрать коносль в релизе
- #ifndef _DEBUG
- # pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
- #endif
- int main()
- {
- Game game;
- game.setupSystem();
- game.initialize();
-
- while (game.loop());
- game.shutdown();
- return 0;
- }
- utils.cpp
- #include "utils.h"
- #include
- bool IsKeyDown(int virtualKeyCode)
- {
- short keyState = GetAsyncKeyState(virtualKeyCode);
- return ((keyState & 0x8000) > 0);
- }
- int GetRandomInt(int min, int max)
- {
- return min + rand() % (max - min + 1);
- }
- float GetRandomFloat(float min, float max)
- {
- return (min + (max - min) * (rand() % 101 / 100.0));
- }
- utils.h
- #pragma once
- bool IsKeyDown(int virtualKeyCode);
- int GetRandomInt(int min, int max);
- float GetRandomFloat(float min, float max);
- wall.cpp
- #include "wall.h"
- Wall::Wall()
- {
- m_type = GameObjectType_Wall;
- }
- void Wall::render(sf::RenderWindow* rw)
- {
- GameObject::render(rw);
- }
- wall.h
- #pragma once
- #include "gameObject.h"
- #include "level.h"
- class Wall
- : public GameObject
- {
- public:
- Wall();
- virtual void render(sf::RenderWindow* rw);
- private:
- };
- 3.2 Результаты тестирования
- Рисунок 1 — Запуск игры «Ghost’s city», призрак не стреляет[pic 1]
- Рисунок 2 — Запуск игры «Ghost’s city», призрак стреляет[pic 2]
- МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
- федеральное государственное автономное образовательное учреждение
высшего профессионального образования
- «Санкт-Петербургский государственный университет
аэрокосмического приборостроения»
- КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
- ПРОГРАММА
|
- Игра «Ghost’s city»
|
- Описание программы
|
- 44.4642.17-13
|
|
- РАБОТУ ВЫПОЛНИЛ
- СТУДЕНТ ГР.
| - 4642
|
|
|
| - Ю.Л.Ляпина
|
|
|
| - подпись, дата
|
| - инициалы, фамилия
|
- Санкт-Петербург
- 2017
- Аннотация
- В документе приведены общие сведения о программе. Приведено общее описание функционирования программы , общие сведения о языке программирования. Описаны входные и выходные данные, логика работы программы, даны сведения об используемых технических средствах.
- Содержание
- 4.1 Общие сведения
- 4.2 Функциональное назначение
- 4.3 Описание логической структуры
- 4.4 Спецификация подпрограммы
- 4.5 Используемые технические средствах
- 4.6 Вызов и загрузка
- 4.1 Общие сведения
- Программа написана на языке С++ совместно с SFML, состоит из игрового окна и окна завершения. Программа «Ghost’s city» - предназначенная для одного пользователя. Суть программы убить всех своих врагов-призраков и выжить самому. От пользователя требуется наличие клавиатуры.
- 4.2 Функциональное назначение
- С помощью данной программы пользователь может хорошо провести время. Может повысить свои навыки ловкости.
- 4.3 Описание логической структуры
- Программа написана на языке С++ совместно с SFML. При открытии программы появляется окно с игровым полем, значит игра уже началась. После проигрыша ( смерть игрока-призрака ) игра автоматически перезапускается, после выигрыша — остается один игрок-призрак и экран начинает мигать синим цветом.
- Управление для пользователя:
- - W - движение вверх
- - A - движение влево
- - S - движение вниз
- - D - движение вправо
- - SPACE ( клавиша «пробел») - выстрел
- 4.4 Спецификация подпрограммы
- 4.4.1 Функция initialize
- Назначение: задание начальных значений для логики игры (используется с классом Game)
- Имя: initialize
- Заголовок: void initialize(); void Game::initialize();
- 4.4.2 Функция loop
- Назначение: вычисление значения fps ( FramesTimeCounter)
- Имя: loop
- Заголовок: bool loop();bool Game::loop();
- 4.4.3 Функция main
- Назначение: главная функция
- Имя: main
- Заголовок: int main()
- 4.4.4 Функция render
- Назначение: осуществление гафического вывода основного цикла игры на экран (используется с классами: Game, Enemy, Ghost, Bullet:, Wall, GameObject)
- Имя: render
- Заголовок: void Wall::render(sf::RenderWindow* rw)
- 4.4.5 Функция update
- Назначение: алгоритм управления (используется с классами: Game, Enemy, GameObject, Ghost, GhostEnemy, GhostPlayer)
- Имя: update
- Заголовок: void update ( float dt);
- 4.4.6 Функция IsKeyDown
- Назначение: проверка нажатия клавиши
- Имя: IsKeyDown
- Заголовок: bool IsKeyDown(int virtualKeyCode)
- 4.4.7 Функция setupSystem
- Назначение: действия насчет единоразовых настроек системы.Задание зерна генератору псевдослучайных чисел.
- Имя: setupSystem
- Заголовок: void setupSystem(); void Game::setupSystem();
- 4.4.8 Функция increaseDiedEnemiesCount
- Назначение:
- Имя: increaseDiedEnemiesCount
- Заголовок: void Game::increaseDiedEnemiesCount();
- 4.4.9 Функция destroyGameObject
- Назначение: удаление игрового объекта
- Имя: destroyGameObject
- Заголовок: void Game::destroyObject(GameObject* object)
- 4.4.10 Функция getObjectsCount
- Назначение: подсчитывает количество объектов
- Имя: getObjectsCount
- Заголовок: int Game::getObjectsCount(GameObjectType type)
- 4.4.11 Функция moveObjectTo
- Назначение: движение объектом
- Имя: moveObjectTo
- Заголовок: bool Game::moveObjectTo(GameObject* object, float x, float y)
- 4.4.12 Функция intersect
- Назначение: информаирование объекта, что он столкнулся с другим объектом. Также при столкновении наносит 1 единицу урона
- Имя: intersect
- Заголовок: void Bullet::intersect(GameObject* object)
- 4.4.13 Функция doDamage
- Назначение: нанесение урона
- Имя: doDamage
- Заголовок: void GameObject::doDamage(int damage)
- 4.4.14 Функция move
- Назначение: движение
- Имя: move
- Заголовок: void Ghost::move(Direction direction)
- 4.4.15 Функция fire
- Назначение: атака
- Имя: fire
- Заголовок: void Ghost::fire()
- 4.4.16 Функция calculateFrontCellPosition
- Назначение: возвращает координаты ячейки перед пистолетом призрака
- Имя: calculateFrontCellPosition
- Заголовок: void Ghost::calculateFrontCellPosition(float* x, float* y)
- 4.4.17 Функция moveRandomDirection
- Назначение: движение в случайном направлении
- Имя: moveRandomDirection
- Заголовок: void GhostEnemy::moveRandomDirection()
- 4.4.18 Функция analize
- Назначение: совершает анализ и выбирает какое действие ему совершить
- Имя: analize
- Заголовок: void GhostEnemy::analize()
- 4.4.19 Функция setKeys
- Назначение: принимает значение нажатой клавиши
- Имя: setKeys
- Заголовок: void GhostPlayer::setKeys(int keyLeft, int keyRight, int keyUp, int keyDown, int keyFire)
- 4.4.20 Функция shutdown
- Назначение: задержка выполнения программы, по окончанию игры
- Имя: shutdown
- Заголовок: void Game::shutdown()
- 4.4.21 Функция GetRandomFloat
- Назначение: дает случайное значение вещественного типа
- Имя: GetRandomFloat
- Заголовок: float GetRandomFloat(float min, float max)
- 4.4.22 Функция GetRandomInt
- Назначение: дает случайное значение целого типа
- Имя: GetRandomInt
- Заголовок: int GetRandomInt(int min, int max)
- 4.5 Используемые технические средствах
- Для адекватного функционировании программы необходимо наличие ПК с ОС windows 7 и выше, необходимо наличие клавиатуры.
- 4.6 Вызов и загрузка
- Вызов и загрузка программы осуществляется в следующей последовательности: нахождение файла программы «Ghost’s city.exe», запуск исполняемого файла, ожидание открытия программы.
- МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
- федеральное государственное автономное образовательное учреждение
высшего профессионального образования
- «Санкт-Петербургский государственный университет
аэрокосмического приборостроения»
- КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
- ПРОГРАММА
|
- Игра «Ghost’s city»
|
- Описание применения
|
- 44.4642.17-31
|
|
- РАБОТУ ВЫПОЛНИЛ
- СТУДЕНТ ГР.
| - 4642
|
|
|
| - Ю.Л.Ляпина
|
|
|
| - подпись, дата
|
| - инициалы, фамилия
|
- Санкт-Петербург
- 2017
- Аннотация
- В документе приводятся назначение программы , ее основные характеристики и область применения. Приводятся общие характеристики входной и выходной информации.
- Содержание
- 5.1 Назначение программы
- 5.2 Условия применения
- 5.3 Описание задачи
- 5.4 Характеристики
- 5.1 Назначение программы
- Программа «Ghost’s city» предназначена для развлекательных целей.
- 5.2 Условия применения
- Программа написана на языке С++ , совмещенная с библиотекой SFML. Для адекватного функционировании программы необходимо наличие ПК с ОС windows 7 и выше, необходимо наличие клавиатуры. Для запуска программы также необходимо: нахождение файла программы «Ghost’s city.exe», запуск исполняемого файла, ожидание открытия программы.
- 5.3 Описание задачи
- Разработать программу, дающую возможность расслабиться и отдохнуть после тяжелого дня в игре «Ghost’s city».
- 5.4 Характеристики
- Файл «Ghost’s city.exe» - 552 КБ
- Файлы классов и библиотек — 105 МБ (из этого обычные С++ библиотеки, без библиотеки SFML, весят 35,8 КБ)
- Изображение (спрайты) — 23 КБ
- ЗАКЛЮЧЕНИЕ
- В данной курсовой работе реализована программа «Ghost’s city».
- В процессе работы над курсовым проектом были закреплены навыки программирования на языке С++ с подключением библиотеки SFML в среде Visual Studio.
- Получены умения по документированию программного обеспечения, согласно принятым государственным стандартам.
- СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
- 1. ГОСТ 19.701-90 Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.
- 2. Курсы создания компьютерных игр на C/C++ [Электронный ресурс]. - Режим доступа: https://pikabu.ru/story/kursyi_sozdaniya_kompyuternyikh_igr_na_cc__chast_10__3848892, свободный.
- 3.Курсы создания компьютерных игр на SFML [Электронный ресурс]. - Режим доступа: http://kychka-pc.ru/category/sfml, свободный
- 4. Практический курс программирования на Си, автор К. Поляков [Электронный ресурс] - Режим доступа: http://kpolyakov.spb.ru/school/c.htm, свободный
Доступно только на Essays.club