Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

27.02.2013, 01:01. Просмотров 799. Ответов 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++;    
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 01:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как заставить свой объект стрелять? (C++):

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться - C++
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...

Cоставить программу звездолет, якобы будет летать корабль и стрелять по астероидам - C++
Ребят всем привет, дали задание составить программу звездолет, якобы будет летать корабль и стрелять по астероидам, в итоге нашел и скачал...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект - C++
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня , так как учусь работать с указателями)...

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? - C++
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это можно использовать??

Как заставить работать do while - C++
Печатает пока 100 строк не будут заполнены, нужно при вводе символа n закончить принятие данных и вывести те, которые ввели. Если не...

как заставить С++ и С# работать вместе? - C++
Здравствуйте! Хотелось бы научится писать проги со совмещение С++ и шарпа... Посоветуйте что-то почитать или хотябы покажите код как...

15
MLPMan
Кандёхаем веселее!
286 / 283 / 35
Регистрация: 02.10.2012
Сообщений: 1,992
27.02.2013, 05:39 #2
Я бы создал объекты для "пуль"(снарядов), и обрабатывал бы их так же, как и корабли.
1
Avazart
Эксперт С++
7232 / 5428 / 303
Регистрация: 10.12.2010
Сообщений: 24,123
Записей в блоге: 17
27.02.2013, 05:45 #3
Цитата Сообщение от MLPMan Посмотреть сообщение
Я бы создал объекты для "пуль"(снарядов), и обрабатывал бы их так же, как и корабли.
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
1
Kuzia domovenok
2030 / 1874 / 168
Регистрация: 25.03.2012
Сообщений: 6,451
Записей в блоге: 1
27.02.2013, 07:16 #4
Цитата Сообщение от Avazart Посмотреть сообщение
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
а какая разница? Без ООП пришлось бы создавать структуры для пуль (снарядов). И обрабатывать также, как корабли.
0
MLPMan
Кандёхаем веселее!
286 / 283 / 35
Регистрация: 02.10.2012
Сообщений: 1,992
27.02.2013, 07:20 #5
Цитата Сообщение от Avazart Посмотреть сообщение
Ну иногда не стоит заморачиваться и пытаться свести все к ООП
Но в этом случае очень удобно, как по мне: например, создаем базовый класс игрового оъекта, наследуем от него все виды врагов, пуль, препятствий... Потом создать массив базовых классов(текущие объекты на экране), и в цикле реализовать всю игровую динамику, в другом цикле - рисование.
Не знаю, ка вы, но я без ООП при написании 2D космической стрелялки голову бы себе сломал.
0
XRuZzz
Антикодер
689 / 595 / 29
Регистрация: 15.09.2012
Сообщений: 2,542
27.02.2013, 10:39 #6
Чего то никто не предложил создать класс Guns например с виртуальным методом shot(), в котором будут обрабатываться действия с пулями и снарядами.

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

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

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

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

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

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

Как заставить свой объект стрелять?
0
SAUtrade
13 / 13 / 1
Регистрация: 21.10.2012
Сообщений: 140
27.02.2013, 12:03  [ТС] #8
Да совсем забыл -- эта игрушка в консоли)) так что вся графика - это символы))
0
MLPMan
Кандёхаем веселее!
286 / 283 / 35
Регистрация: 02.10.2012
Сообщений: 1,992
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;
}
1
XRuZzz
Антикодер
689 / 595 / 29
Регистрация: 15.09.2012
Сообщений: 2,542
27.02.2013, 14:14 #10
по хорошему, надо писать так чтобы логику без труда можно было перенести на графику(2d например).
я бы ещё отделил классы которые зависят от винды от общей логики игры.

а про диаграммы классов на UML слышали? ( если бы нарисовали её, я бы вас быстрее тогда понял)
0
Avazart
Эксперт С++
7232 / 5428 / 303
Регистрация: 10.12.2010
Сообщений: 24,123
Записей в блоге: 17
27.02.2013, 21:10 #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а какая разница? Без ООП пришлось бы создавать структуры для пуль (снарядов). И обрабатывать также, как корабли.
Я имел ввиду именно наследование...
0
MLPMan
Кандёхаем веселее!
286 / 283 / 35
Регистрация: 02.10.2012
Сообщений: 1,992
27.02.2013, 23:18 #12
Цитата Сообщение от XRuZzz Посмотреть сообщение
если бы нарисовали её, я бы вас быстрее тогда понял
Вроде все понятно: X,Y - координаты; SpeedX, SpeedY описывают движение(вектор - знак, скорость - модуль), Move() - перемещает объект на SpeedX и SpeedY.

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

Цитата Сообщение от Avazart Посмотреть сообщение
Я имел ввиду именно наследование...
Если не злоупотреблять, не вижу ничего плохого в наследовании. Например, если в игре не будет штук, которые не двигаются, класс MovableItem не нужен, а его свойства перенести в корневой.
1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,231
27.02.2013, 23:22 #13
Цитата Сообщение от MLPMan Посмотреть сообщение
апример, если в игре не будет штук, которые не двигаются, класс MovableItem не нужен, а его свойства перенести в корневой.
не двигающиеся штуки можно создать из двигающихся и задать скорость 0
1
MLPMan
Кандёхаем веселее!
286 / 283 / 35
Регистрация: 02.10.2012
Сообщений: 1,992
27.02.2013, 23:27 #14
Цитата Сообщение от ValeryS Посмотреть сообщение
не двигающиеся штуки можно создать из двигающихся и задать скорость 0
Ну, тогда класс Movable лишний, если только у недвигающихся не будет каких-нибудь свойств, не присущих двигающимся.
0
XRuZzz
Антикодер
689 / 595 / 29
Регистрация: 15.09.2012
Сообщений: 2,542
28.02.2013, 00:23 #15
Цитата Сообщение от MLPMan Посмотреть сообщение
Вроде все понятно: X,Y - координаты; SpeedX, SpeedY описывают движение(вектор - знак, скорость - модуль), Move() - перемещает объект на SpeedX и SpeedY.
а вы уверены, что хорошая архитектура состоит только из наследования? как вы покажите другие отношения между классами?
1
28.02.2013, 00:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2013, 00:23
Привет! Вот еще темы с ответами:

не знаю как заставить работать - C++
7,9.cpp:7:10: error: invalid use of non-static data member ‘matrix::two’ long two,one; ^ 7,9.cpp:8:15: error: from...

Как заставить работать <algorithm> - C++
Здравствуйте! У меня есть программа которая vector &lt;int&gt; найдет номер максимального элемента! vector &lt;int&gt;::const_iterator MAX =...

Как заставить отобразиться символы?! - C++
Как заставить отобразиться символы в лэйбле?Например, для преобразования целочисленного типа в строку применяется IntToStr.Что использовать...

Как заставить CEdit реагировать на ' ' ? - C++
Cstring x('haha ha'); CEdit Edit; Edit.SetWindowText(x) - не реагирует на Cstring x('haha ha'); Edit.SetWindowText(x) -...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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