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

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

Восстановить пароль Регистрация
 
SAUtrade
13 / 13 / 1
Регистрация: 21.10.2012
Сообщений: 140
27.02.2013, 01:01     Как заставить свой объект стрелять? #1
Здравствуйте... Пытаюсь написать игру типа Космической дуэли... Застопарился на стрельбе... Точнее как заставить свой объект стрелять... Подскажите как можно организовать данный процесс. Или где можно про это почитать?


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++;    
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 01:01     Как заставить свой объект стрелять?
Посмотрите здесь:

как заставить С++ и С# работать вместе? C++
C++ Как заставить CEdit реагировать на ' ' ?
Как заставить работать <algorithm> C++
C++ В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MLPMan
Кандёхаем веселее!
 Аватар для MLPMan
280 / 275 / 34
Регистрация: 02.10.2012
Сообщений: 1,931
27.02.2013, 05:39     Как заставить свой объект стрелять? #2
Я бы создал объекты для "пуль"(снарядов), и обрабатывал бы их так же, как и корабли.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
27.02.2013, 05:45     Как заставить свой объект стрелять? #3
Цитата Сообщение от MLPMan Посмотреть сообщение
Я бы создал объекты для "пуль"(снарядов), и обрабатывал бы их так же, как и корабли.
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
27.02.2013, 07:16     Как заставить свой объект стрелять? #4
Цитата Сообщение от Avazart Посмотреть сообщение
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
а какая разница? Без ООП пришлось бы создавать структуры для пуль (снарядов). И обрабатывать также, как корабли.
MLPMan
Кандёхаем веселее!
 Аватар для MLPMan
280 / 275 / 34
Регистрация: 02.10.2012
Сообщений: 1,931
27.02.2013, 07:20     Как заставить свой объект стрелять? #5
Цитата Сообщение от Avazart Посмотреть сообщение
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
Но в этом случае очень удобно, как по мне: например, создаем базовый класс игрового оъекта, наследуем от него все виды врагов, пуль, препятствий... Потом создать массив базовых классов(текущие объекты на экране), и в цикле реализовать всю игровую динамику, в другом цикле - рисование.
Не знаю, ка вы, но я без ООП при написании 2D космической стрелялки голову бы себе сломал.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
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
Кандёхаем веселее!
 Аватар для MLPMan
280 / 275 / 34
Регистрация: 02.10.2012
Сообщений: 1,931
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
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
27.02.2013, 14:14     Как заставить свой объект стрелять? #10
по хорошему, надо писать так чтобы логику без труда можно было перенести на графику(2d например).
я бы ещё отделил классы которые зависят от винды от общей логики игры.

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

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

Цитата Сообщение от Avazart Посмотреть сообщение
Я имел ввиду именно наследование...
Если не злоупотреблять, не вижу ничего плохого в наследовании. Например, если в игре не будет штук, которые не двигаются, класс MovableItem не нужен, а его свойства перенести в корневой.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
27.02.2013, 23:22     Как заставить свой объект стрелять? #13
Цитата Сообщение от MLPMan Посмотреть сообщение
апример, если в игре не будет штук, которые не двигаются, класс MovableItem не нужен, а его свойства перенести в корневой.
не двигающиеся штуки можно создать из двигающихся и задать скорость 0
MLPMan
Кандёхаем веселее!
 Аватар для MLPMan
280 / 275 / 34
Регистрация: 02.10.2012
Сообщений: 1,931
27.02.2013, 23:27     Как заставить свой объект стрелять? #14
Цитата Сообщение от ValeryS Посмотреть сообщение
не двигающиеся штуки можно создать из двигающихся и задать скорость 0
Ну, тогда класс Movable лишний, если только у недвигающихся не будет каких-нибудь свойств, не присущих двигающимся.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
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++

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

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

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

Текущее время: 05:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru