Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2011, 12:55   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию Вопрос: Параллельные алгоритмы. Реализация стрельбы.

Мне пришла идея написать текстовую игру. Назову её THE TAXER.
Суть такая - вы сборщик налогогов (буковка Т) будете приходить к злостным неплательщикам (Z - мелкие, B - большие) и пр. Но они не хотят отдавать свои деньги просто так. Они наняли всяких там убийц. Когда вы приходите на уровень (к ним в дом), то вам надо найти этого чувака и дать ему по шапке, но по пути должны быть всякие ловушки и убийцы, а также аптечки, и прочие мелкие атрибутики и мини-игры в виде взлома сейфов на время и пр. В конце вы находите главного чувака, он вам сдается, отдает деньги. За выполнение уровня и всяких там мини-игр вам даются различного вида бонусы, на которые вы можете закупать дополнительные атрибутики для себя.
И всё это я хочу реализовать в консольном окошке размером 80х25 символов. Понимаю что бред, но с графикой я не работал никогда, да и хочется просто пока разобраться с классами и параллельными алгоритмами.

Использую язык С++.

А теперь вопрос: я хочу чтобы например я стрельнул знаком * и выстрел летел себе и летел, независимо от того иду я или стою на месте. Ну вот например если я напишу в общих чертах так.

Код:
...
if(c=='q') player.shoot();
...
Тогда когда я я продолжу движение метод, обрабатывающий выстрел, прекратится. Вот и вопрос, неужели мне патроны тоже в отдельный класс выводить? И как реализовать параллельное моё движение и движение пули?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 05.08.2011, 13:25   #2
DimaTs
Пользователь
 
Регистрация: 14.04.2011
Сообщений: 60
По умолчанию

В VCL для этого можно использовать TTimer, который будет содержать основной цикл игры. В вашем случае можно просто сделать цикл в стиле
Код:
begin
<движение противников>
<проверка нажатия клавиши>
<совершения действия по клавише - создание патрона, движение...>
<движение созданных патронов>
...
end;
для патронов я бы применил однонаправленный список типа
Код:
PBullet = ^TBullet;

TBullet = class
   X,Y: byte;
   TimeToLive: byte; чтоб не летела бесконечно
   Direction: char; направление движения
   procedure Move; двигает на 1 по заданному направлению
   Next: PBullet; следующий элемент списка
end;
Извините ччто код на Delphi, я думаю не будет трудно его подогнать под ваши нужды)
DimaTs вне форума Ответить с цитированием
Старый 05.08.2011, 13:41   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

DimaTs, вот вы про VCL, а ведь MooNDeaR ясно же сказал, что использует С++ - однако я сомневаюсь, что он пишет в билдере(хотя, в Visual Studio тоже есть Timer).
MooNDeaR, я делал(и делаю) так: у меня есть основной цикл ожидания действий, что-то типа(псевдокод)
Код:
while (true) 
{
    if ( keyPressed)
    {
        // обработка клавиш
    }
    // остальные действия, по сути параллельные
}
Как видите, вне зависимости от клавиш, <остальные действия> всё равно выполняются до тех пор, пока не будет выполнен выход из цикла.

Последний раз редактировалось _-Re@l-_; 05.08.2011 в 13:43.
_-Re@l-_ вне форума Ответить с цитированием
Старый 05.08.2011, 13:54   #4
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Извините ччто код на Delphi, я думаю не будет трудно его подогнать под ваши нужды)
Составит. Я паскаль знаю, а вот Delphi только читать умею. Но только в общих чертах, не разбираясь в реализации или принципе работы определенных функций и процедур. Следовательно подобрать аналог в С++ будет сложно.

Цитата:
DimaTs, вот вы про VCL, а ведь MooNDeaR ясно же сказал, что использует С++ - однако я сомневаюсь, что он пишет в билдере(хотя, в Visual Studio тоже есть Timer).
Я использую Visual Studio, но понятия о Timer не имею. Надо будет почитать где-нибудь.

Спасибо, кстати за код. Только в С++ нет keyPressed, там есть kbhit(), но это мелочи. Спасибо большое.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 05.08.2011, 14:17   #5
DimaTs
Пользователь
 
Регистрация: 14.04.2011
Сообщений: 60
По умолчанию

-Re@l-_, а я ясно сказал что МОЖНО использовать таймер, однако в консольке неплохо приживется просто цикл) Который вы в принципе и приводите. И, возможно, стоит сначало всех подвинуть, а потом уже читать клавиши?
MooNDeaR, с указателями и списками вы наверняка знакомы? Либо с динамическими массивами? тТогда пули лучше всего заносить именно туда, это сразу же решит возможную проблему с наличием нескольких пуль на экране
DimaTs вне форума Ответить с цитированием
Старый 05.08.2011, 18:02   #6
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Советую почитать классику. Скажем, исходники Quake 1. ftp://ftp.idsoftware.com/idstuff/source
Есть даже их обзор: http://fabiensanglard.net/quakeSource

Там таймер сделан простым бесконечным циклом; когда набирается достаточный интервал времени - выполняeтся Host_Frame (time), который, помимо прочего, обрабатывает "собранные" нажатия клавиш. Минус такого подхода - 100% загруженность процессора. Но у меня есть наработки по таймеру, быстрому (быстрее стандартных виндовских 65 Гц) и негрузящему процессор. В понедельник выложу, если надо.
ds.Dante вне форума Ответить с цитированием
Старый 05.08.2011, 19:16   #7
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
MooNDeaR, с указателями и списками вы наверняка знакомы? Либо с динамическими массивами? тТогда пули лучше всего заносить именно туда, это сразу же решит возможную проблему с наличием нескольких пуль на экране
Да знаком. Более ли менее. Правда еще не понял, как бы наличие этих пуль реализовать.
Но ничего, время есть, и тем более у игры написано только вступление и сюжет. Пока весь, так называемый "проект" на бумаге.
Цитата:
Сообщение от ds.Dante Посмотреть сообщение
Советую почитать классику. Скажем, исходники Quake 1. ftp://ftp.idsoftware.com/idstuff/source
Есть даже их обзор: http://fabiensanglard.net/quakeSource

Там таймер сделан простым бесконечным циклом; когда набирается достаточный интервал времени - выполняeтся Host_Frame (time), который, помимо прочего, обрабатывает "собранные" нажатия клавиш. Минус такого подхода - 100% загруженность процессора. Но у меня есть наработки по таймеру, быстрому (быстрее стандартных виндовских 65 Гц) и негрузящему процессор. В понедельник выложу, если надо.
Спасибо, почитаю. Выложите, если не трудно, и если код написан на С/С++, Pascal.

Возник еще вопрос, вот например я хочу реализовать маленькую мини игру, в которой надо будет вскрывать сейф. То, по каким правилам он будет вскрываться, еще в доработке, но уже точно ясно что это будет на время. Как бы мне привязать весь процесс обратного отсчета к системному времени?:
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 05.08.2011 в 19:20.
MooNDeaR вне форума Ответить с цитированием
Старый 05.08.2011, 19:25   #8
DimaTs
Пользователь
 
Регистрация: 14.04.2011
Сообщений: 60
По умолчанию

Цитата:
Сообщение от MooNDeaR Посмотреть сообщение
Как бы мне привязать весь процесс обратного отсчета к системному времени?
Быть может, все таки таймер?)

Насчет пуль, имеется список объектов типа пуля, цикл каждый раз по нему пробегает(на самом деле я думаю пуль будет штук 5 максимум) и подвигает пулю в нужном направлении. Когда пулю пора убрать, ее объект просто уничтожается. Кстати если у вас враги планируют стрелять, все пули можно класть в один список.
DimaTs вне форума Ответить с цитированием
Старый 05.08.2011, 19:32   #9
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от DimaTs Посмотреть сообщение
Быть может, все таки таймер?)
Тогда можно пожалуйста в кратце объяснить суть его работы А лучше просто небольшой код, который мне объяснит всё лучше слов.

P.S. С пулями довольно ловко. Только это если врагов немного (а на поле 80х25 много и не запихаешь
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 05.08.2011, 20:36   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Спасибо, кстати за код. Только в С++ нет keyPressed, там есть kbhit(), но это мелочи. Спасибо большое.
Так я ж сказал, что это псевдокод, т.е. просто обобщённый алгоритм.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача из раздела Комбинаторные алгоритмы и алгоритмы на гра-фах в Паскале Klik_1602 Помощь студентам 1 04.01.2011 01:18
[Вопрос] Реализация многопоточности запуска/остановки конкретных программ из списка Человек_Борща Общие вопросы Delphi 8 06.10.2010 08:59
Численные методы. Метод Стрельбы (Делфи) s1z0n Помощь студентам 1 23.04.2010 15:37
краевая задача диф.уравнения методом стрельбы Laplas Помощь студентам 2 26.12.2009 23:56
Задача на оценку эффективности стрельбы Борзов Помощь студентам 3 23.05.2007 06:54