purebasic.info

PureBasic forum
Текущее время: Ср авг 15, 2018 11:00 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Ремейк игры Boulder Dash
СообщениеДобавлено: Ср авг 08, 2018 4:01 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Чт ноя 04, 2010 3:01 pm
Сообщений: 70
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Скриншот
Решил создать игру Boulder Dash, изучая программирования на Purebasic и самостоятельно разобраться в механике игры...
Вот что получилось...

Youtube - демонстрация 5 первых уровней

Движок в стиле рогалика
Вручную перенёс оригинальные карты и подогнал под свой движок

Игра ещё не окончена, но уже есть полноценные 2 компании в каждой по 16 уровней

Управление:
Меню:
Стрелки вверх - вниз и выбор ENTER
стрелки влево - вправо выбор уровня (если вы до его дошли)

Игра:
Движение - Стрелки или WASD
Финт - Пробел

Советы:
- Камень можно двигать если за ним нет препятствия.
- Используйте финт чтобы стоя на месте копать или собрать кристалл в выбранную сторону.
- Камни или кристаллы падая на голову - убивают.
- Монстры убивают при касании по горизонтали или вертикали.
- Монстр с крыльями при убийстве даёт кристаллы, многоножка с черепом нет.
- Чтобы убить монстра сбросьте ему на голову камень или кристалл.
- Чтобы прорубить ход в стене, убейте монстра когда он будет находится возле её.
- Если жижу заблокировать и не давать растечься, она превратится в кристаллы.
- Монстры взрываются при касании с жижой.
- При ударе камня о зелёную платформу - он трасформируется в кристалл и наоборот - кристалл в камень.
- Каждые 500 очков приносят дополнительную жизнь.
- Время отображается полоской справа от игрового поля.

Инсталятором ~ 1,7 mb
Архивом ~ 1,5 mb


Последний раз редактировалось Phoenix Пт авг 10, 2018 10:25 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Чт авг 09, 2018 10:51 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Чт ноя 04, 2010 3:01 pm
Сообщений: 70
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
У меня вопрос, как сделать так чтобы мышь не прерывала процесс игры?
Я так понял она там использует своё прерывание и когда она не активна цикл банально прерывается...

Пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
 
Repeat
      Event=WaitWindowEvent()
      Gadget=EventGadget()
      ExamineKeyboard()
      ExamineMouse()
 
      ; .... Основной цикл игры ...
 
ForEver
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 12:59 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 263
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Цитата:
Event = WaitWindowEvent([Timeout])

Timeout - (Тайм-аут в миллисекундах), который заставляет функцию возвращаться, если события не происходят.
Если тайм-аут не указан, он будет бесконечно ждать до тех пор, пока не произойдет событие.

Можно и в отдельный поток поставить - ExamineKeyboard(), ExamineMouse().
:?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 10:31 am 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Чт ноя 04, 2010 3:01 pm
Сообщений: 70
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
repeat, спасибо [Timeout] помог

Ещё заметил что ссылка на архив была не правильная, всё исправил.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 11:55 am 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 134
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
можно еще использовать
WindowEvent():
delay(10);это чтобы проц грузило
возможно такая комбинация равна WaitWindowEvent(10), но в старых пуриках ее нет, появилась в 4 версии.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 12:22 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Чт ноя 04, 2010 3:01 pm
Сообщений: 70
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
balex1978, Я установил Event = WaitWindowEvent(1) и загрузка процессора не изменилась, а мышка без проблем катается...
delay(10) снизил нагрузку ЦП на 10%, теперь только нужно протестировать, не отобразилось ли это на игровом процессе.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 5:14 pm 
Не в сети
док

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 134
Благодарил (а): 1 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
дело в том что delay обычно у винды меньше 10-15 милисек недает хоть 1 став,
а втот Event =WaitWindowEvent(10) 1000 циклов за 12 сек около 13 милисек
WaitWindowEvent(1) уже побыстрей за 5-6 сек,выгодней :o .
Такие комбинации кода делаются когда нужно прорабатывать основной код и в тоже время опрашивать виндовские сообщения.

Бывает так что прежде чем запустится основной цикл нужно перелопатить кучу инфы и часто при запуске прога кажется подвисает, чтобы небыло подвисания проги использую WindowEvent() по несколько раз подряд(либо до 10 раз в секнду, в зависимости от кода), обычно достаточно чтобы неподвисала прога, главное пользователю показывать какието изменения чтоб неподумал что прога тупо висит или ничего неделает, глючная :).
Иногда можно передавать опрос клавы в отдельный обработчик, если пользоваетель чегото хочет изменить(например отменить или поставить на паузу).

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 5:21 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 303
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
В подобных случаях (принятие решения на тему какой таймаут выбрать) уже лет 30 как использую простую стратегию:
счётчик холостых циклов и постепенное увеличение таймаута до экспериментально полученной величины безболезненного возврата к адекватной реакции на активность.
После активности таймаут сбрасываю в ноль ( условно конечно, это может быть и 1 и 5, получая их экспериментально ) и всё начинается с начала.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 7:24 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6350
Благодарил (а): 20 раз.
Поблагодарили: 193 раз.
Пункты репутации: 48
Phoenix писал(а):
У меня вопрос,как сделать так чтобы мышь не прерывала процесс игры?

А где у вас в игре мышка используется?
Зачем игра захватывает мышь если её не использует? Это плохо.
Мышу не надо забирать у системы, люди иногда во время игры чего то там щелкают в Ворде или где то ещё.
Один цикл на WindowedScreen и OpenWindow? Это плохо.
Ну это даже в примерах в справке видно.
Ставить в цикле Delay? Это плохо.
WindowedScreen и просто Screen по умолчанию синхронизированы с работой обновления экрана,
и должны выдавать 60 FPS или сколько там у кого экраны способны выдать.
Кто не полагается на случай (случай с хорошим монитором 100-200 Гц) и важна постоянная скорость, тот это параметр регулирует SetFrameRate(FrameRate)
Мой шаблон для 2D игры, дополненный управлением спрайтом.
Код:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
InitSprite():InitKeyboard():InitSound()
; Параметры экрана
W=1024;800
H=768 ; 600
Answ = MessageRequester("Игра 2D","Full Screen?", #MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2)
        OpenWindow(0, 0, 0, W, H, "Игра 2D", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Select Answ    
  Case #IDNO
     OpenWindowedScreen(WindowID(0), 0, 0, W, H)
  Case #IDYES
    OpenScreen(W,H,32,"Игра 2D")
EndSelect
 
;- Спрайт
CreateSprite(0, 64,64)
StartDrawing(SpriteOutput(0))
Line(0,16,1,32, RGB(255,255,0))
LineXY(0,16,64,32, RGB(255,255,0))
LineXY(0,64-16,64,32, RGB(255,255,0))
FillArea(32,32,RGB(255,255,0),$3AEBAC)
StopDrawing()
 
Define.f  Angle, x, y, DirectionX, DirectionY, Speed = 5
x=W/2
y=H/2
Repeat
  ;- Это относится к оконному режиму
   Repeat
      Event = WindowEvent()
      If  Event = #PB_Event_CloseWindow:Break 2:EndIf
   Until Event = 0
  ;- Это относится к WindowedScreen
    FlipBuffers()
    ClearScreen(RGB(0,255,255))
    ExamineKeyboard()
    StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(30,10,"LEVEL = 1" ,$00CC00)
    LineXY(0, H-70, W, H-70,$0000FF)
    DrawText(30,H-50,"PRESS Escape for EXIT ",$0000ff)
    StopDrawing()
   
    ;- управление спрайт - клавиатура
     If KeyboardPushed(#PB_Key_Left)
       Angle - 2
       DirectionX = Cos(Radian(Angle))
       DirectionY = Sin(Radian(Angle))
       RotateSprite(0, Angle, #PB_Absolute)
    ElseIf KeyboardPushed(#PB_Key_Right)
       Angle + 2
       DirectionX = Cos(Radian(Angle))
       DirectionY = Sin(Radian(Angle))
       RotateSprite(0, Angle, #PB_Absolute)
    EndIf
   
    If KeyboardPushed(#PB_Key_Up)
       x + DirectionX * Speed
       y + DirectionY * Speed
    ElseIf KeyboardPushed(#PB_Key_Down)
       x - DirectionX * Speed
       y - DirectionY * Speed
    EndIf
    DisplayTransparentSprite(0,x,y)
   
Until KeyboardReleased(#PB_Key_Escape)


_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 8:23 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Чт ноя 04, 2010 3:01 pm
Сообщений: 70
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Мышь нужна всего лишь чтобы была возможность перетащить окошко...
Я так понял вынесение
Код:
1
2
3
4
5
6
 
   Repeat
      Event = WindowEvent()
      If  Event = #PB_Event_CloseWindow:Break 2:EndIf
   Until Event = 0
 


в отдельный цикл решило проблему...

Спасибо...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Ремейк игры Boulder Dash
СообщениеДобавлено: Пт авг 10, 2018 9:23 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6350
Благодарил (а): 20 раз.
Поблагодарили: 193 раз.
Пункты репутации: 48
Phoenix писал(а):
Мышь нужна всего лишь чтобы была возможность перетащить окошко...

Просто не используйте InitMouse() и ExamineMouse()
Перетаскивание окна фишка системная, работать будет.
Цикл с кодом
Код:
1
2
3
4
Repeat
      Event = WindowEvent()
      If  Event = #PB_Event_CloseWindow:Break 2:EndIf
   Until Event = 0


исключительно для Выхода из программы "крестиком".
Если у вас только ESC, то этот цикл вообще можно сократить до такого:
Код:
1
Repeat:Until WindowEvent() = 0


_________________
read-only


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB