Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SAUtrade
13 / 13 / 1
Регистрация: 21.10.2012
Сообщений: 140
#1

Как заставить свой объект стрелять? - C++

27.02.2013, 01:01. Просмотров 768. Ответов 15
Метки нет (Все метки)

Здравствуйте... Пытаюсь написать игру типа Космической дуэли... Застопарился на стрельбе... Точнее как заставить свой объект стрелять... Подскажите как можно организовать данный процесс. Или где можно про это почитать?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
 
using namespace std;
 
class GameObject
{
public:
    int x, y; // Координаты расположения объекта
    int size; // Размер объекта
    char image; //Изображение объекта
 
    GameObject(void);
    GameObject(int x, int y, char img);
    GameObject(int x, int y, int s, char img);
    virtual void Draw();
    ~GameObject(void);
};

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "GameObject.h"
 
 
GameObject::GameObject(void)
{
}
 
GameObject::GameObject(int x, int y, int s, char img)
{
    this-> x = x;
    this-> y = y;
    size = s;
    image = img;
}
 
 
GameObject::GameObject(int x, int y, char img)
{
    this-> x = x;
    this-> y = y;
    image = img;
}
 
void GameObject::Draw()
{
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); //Дескриптор устройства стандартного вывода. 
    COORD coord = {x, y}; //структура для опред позиции на плосости
    SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    SetConsoleCursorPosition(h, coord);
    cout << image;
}
 
GameObject::~GameObject(void)
{
}


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#include "GameObject.h"
 
class Spacecraft : public GameObject
{
    int speedx;
    int speedy;
public:
    Spacecraft(void);
    Spacecraft(int, int, char);
    void Move();
    ~Spacecraft(void);
};

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Spacecraft.h"
 
 
Spacecraft::Spacecraft(void)
{
}
 
Spacecraft::Spacecraft(int x, int y, char img):GameObject(x, y, img)
{
}
 
Spacecraft::~Spacecraft(void)
{
}


C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include "Spacecraft.h"
 
class Player_SC : public Spacecraft
{
public:
    Player_SC(void);
    Player_SC(int, int, char);
    void Draw();
    void Move();
    ~Player_SC(void);
};

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "Player_SC.h"
 
Player_SC::Player_SC(void)
{
}
 
Player_SC::~Player_SC(void)
{
}
 
Player_SC::Player_SC(int x, int y, char img):Spacecraft(x, y, img)
{
}
 
void Player_SC::Draw()
{
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {x, y};
    SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
    SetConsoleCursorPosition(h, coord);
    cout << image;
}
 
void Player_SC::Move()
{
    if(GetAsyncKeyState(VK_UP))
    {
        if(y>0)
        y--;    
    }
    if(GetAsyncKeyState(VK_LEFT))
    {
        if(x>0)
        x--;    
    }
    if(GetAsyncKeyState(VK_RIGHT))
    {
        if(x<79)
        x++;    
    }
    if(GetAsyncKeyState(VK_DOWN))
    {
        if(y<24)
        y++;    
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
27.02.2013, 05:39     Как заставить свой объект стрелять? #2
Я бы создал объекты для "пуль"(снарядов), и обрабатывал бы их так же, как и корабли.
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,055
Записей в блоге: 17
27.02.2013, 05:45     Как заставить свой объект стрелять? #3
Цитата Сообщение от MLPMan Посмотреть сообщение
Я бы создал объекты для "пуль"(снарядов), и обрабатывал бы их так же, как и корабли.
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
27.02.2013, 07:16     Как заставить свой объект стрелять? #4
Цитата Сообщение от Avazart Посмотреть сообщение
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
а какая разница? Без ООП пришлось бы создавать структуры для пуль (снарядов). И обрабатывать также, как корабли.
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
27.02.2013, 07:20     Как заставить свой объект стрелять? #5
Цитата Сообщение от Avazart Посмотреть сообщение
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
Но в этом случае очень удобно, как по мне: например, создаем базовый класс игрового оъекта, наследуем от него все виды врагов, пуль, препятствий... Потом создать массив базовых классов(текущие объекты на экране), и в цикле реализовать всю игровую динамику, в другом цикле - рисование.
Не знаю, ка вы, но я без ООП при написании 2D космической стрелялки голову бы себе сломал.
XRuZzz
Антикодер
631 / 532 / 27
Регистрация: 15.09.2012
Сообщений: 2,482
27.02.2013, 10:39     Как заставить свой объект стрелять? #6
Чего то никто не предложил создать класс Guns например с виртуальным методом shot(), в котором будут обрабатываться действия с пулями и снарядами.

от Guns наследовать классы типа LaserGuns.

Отношения Guns с классом "Пули" - агрегация. Так как пули могут существовать без оружия.

Но если у нас такие сложные пули для которых существует целый класс то для обоймы нужны использовать stack (в классе Guns) из stl.

Эту архитектуру я черпаю из описания предметной области.(которую можно описать на UML например)

а про реализацию такого функционала как выстрел можно почитать тут
Так как выстрел это пересечение луча с полигоном.
лучше прочитать все предшествующее уроки.

а тут всё что я думаю о разработчиках игр
SAUtrade
13 / 13 / 1
Регистрация: 21.10.2012
Сообщений: 140
27.02.2013, 11:56  [ТС]     Как заставить свой объект стрелять? #7
Набросал схемку... В правильном направлении думаю?))

Как заставить свой объект стрелять?
SAUtrade
13 / 13 / 1
Регистрация: 21.10.2012
Сообщений: 140
27.02.2013, 12:03  [ТС]     Как заставить свой объект стрелять? #8
Да совсем забыл -- эта игрушка в консоли)) так что вся графика - это символы))
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
27.02.2013, 13:29     Как заставить свой объект стрелять? #9
Цитата Сообщение от SAUtrade Посмотреть сообщение
Да совсем забыл -- эта игрушка в консоли)) так что вся графика - это символы))
В консоли через WinAPI можно рисовать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
//...
int main(int argc, char* argv[])
{
HDC dc = GetDC(GetConsoleWindow());
//HBRUSH b1 = CreateSolidBrush(255);
//SelectObject(dc,b1);
Ellipse(dc,0,0,100,100);
//DeleteObject(b1);
getch();
return 0;
}
XRuZzz
Антикодер
631 / 532 / 27
Регистрация: 15.09.2012
Сообщений: 2,482
27.02.2013, 14:14     Как заставить свой объект стрелять? #10
по хорошему, надо писать так чтобы логику без труда можно было перенести на графику(2d например).
я бы ещё отделил классы которые зависят от винды от общей логики игры.

а про диаграммы классов на UML слышали? ( если бы нарисовали её, я бы вас быстрее тогда понял)
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,055
Записей в блоге: 17
27.02.2013, 21:10     Как заставить свой объект стрелять? #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а какая разница? Без ООП пришлось бы создавать структуры для пуль (снарядов). И обрабатывать также, как корабли.
Я имел ввиду именно наследование...
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
27.02.2013, 23:18     Как заставить свой объект стрелять? #12
Цитата Сообщение от XRuZzz Посмотреть сообщение
если бы нарисовали её, я бы вас быстрее тогда понял
Вроде все понятно: X,Y - координаты; SpeedX, SpeedY описывают движение(вектор - знак, скорость - модуль), Move() - перемещает объект на SpeedX и SpeedY.

SAUtrade,
Как заставить свой объект стрелять?.

Цитата Сообщение от Avazart Посмотреть сообщение
Я имел ввиду именно наследование...
Если не злоупотреблять, не вижу ничего плохого в наследовании. Например, если в игре не будет штук, которые не двигаются, класс MovableItem не нужен, а его свойства перенести в корневой.
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,485
27.02.2013, 23:22     Как заставить свой объект стрелять? #13
Цитата Сообщение от MLPMan Посмотреть сообщение
апример, если в игре не будет штук, которые не двигаются, класс MovableItem не нужен, а его свойства перенести в корневой.
не двигающиеся штуки можно создать из двигающихся и задать скорость 0
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
27.02.2013, 23:27     Как заставить свой объект стрелять? #14
Цитата Сообщение от ValeryS Посмотреть сообщение
не двигающиеся штуки можно создать из двигающихся и задать скорость 0
Ну, тогда класс Movable лишний, если только у недвигающихся не будет каких-нибудь свойств, не присущих двигающимся.
XRuZzz
Антикодер
631 / 532 / 27
Регистрация: 15.09.2012
Сообщений: 2,482
28.02.2013, 00:23     Как заставить свой объект стрелять? #15
Цитата Сообщение от MLPMan Посмотреть сообщение
Вроде все понятно: X,Y - координаты; SpeedX, SpeedY описывают движение(вектор - знак, скорость - модуль), Move() - перемещает объект на SpeedX и SpeedY.
а вы уверены, что хорошая архитектура состоит только из наследования? как вы покажите другие отношения между классами?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2013, 01:10     Как заставить свой объект стрелять?
Еще ссылки по теме:

Как заставить функцию выполняться в потоке C++
Cоставить программу звездолет, якобы будет летать корабль и стрелять по астероидам C++
C++ не знаю как заставить работать
Как заставить работать do while C++
C++ Как заставить массив превратиться в указатель?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MLPMan
Кандёхаем веселее!
282 / 276 / 34
Регистрация: 02.10.2012
Сообщений: 1,939
28.02.2013, 01:10     Как заставить свой объект стрелять? #16
Цитата Сообщение от XRuZzz Посмотреть сообщение
а вы уверены, что хорошая архитектура состоит только из наследования? как вы покажите другие отношения между классами?
Дык я не советую использовать как можно больше ООПшных фишек, главное - построить удобный внутренний интерфейс для написания хорошей проги. А наследование, в данном случае - удобный инструмент.

Например: хотим сделать пулю с ускорением - унаследованый переопределяет метод Move() и изменяет там SpeedX; При реализации "корабля-босса" тоже поможет наследование, он уже будет не такой, как "обычные", но все-таки с базовыми свойствами корабля.
Yandex
Объявления
28.02.2013, 01:10     Как заставить свой объект стрелять?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru