forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Пауза и свет (http://forum.boolean.name/showthread.php?t=14397)

umnick 10.03.2011 20:20

Пауза и свет
 
Здравствуйте,ув. программисты,недавно начал знакомиться с Blitz3D,а точнее 4 дня как...Так вот,при "расработке своей первой "игры"" , возникла проблема.Не могу сделать меню и паузу.:dontknow: Так же непонятная проблема со светом , почему-то свет не падает на "пол" , в результате чего тот остается темным.:''((
А что бы не писать тут поэму,выкладываю исходник сего "шедевра".Буду очень благодарен , если кто-нибудь сможет помочь мне.Заранее спасибо :)

Не получилось прикрепить файл,заливаю на rgost.

Исходник

Ganociy 10.03.2011 20:40

Ответ: Пауза и свет
 
RotateEntity light,90,0,0
EntityFx plane,1

По поводу меню и паузы:
http://forum.boolean.name/showthread.php?t=13890&page=2
http://forum.boolean.name/showthread...t=%EC%E5%ED%FE
http://forum.boolean.name/showthread...t=%EC%E5%ED%FE

Ganociy 10.03.2011 20:41

Ответ: Пауза и свет
 
Помню сам на этом материале учился (твоя игра. Верней не совсем твоя)) )

umnick 10.03.2011 20:47

Ответ: Пауза и свет
 
Спасибо большое,свет заработал.С меню буду разбираться.
Да,игра действительно не моя) Ну,точнее на половину)За то,за эти 4 дня , как родная мне стала :D

LLI.T.A.L.K.E.R. 10.03.2011 21:17

Ответ: Пауза и свет
 
Нормально!
Только кубики другого цвета, тона нужно, а то при большой скорости и тряске "вслепую" уже играл.
Потом модель красного сочного яблока прикрепи! (Или разных цветов с разными бонусами)
Модель змейки попробуй анимированую сделать. (Сначала так подумал, чтобы ножками топала, но это уже ящер будет :) )

Можно ещё Terrain как пол сделать..

umnick 10.03.2011 21:28

Ответ: Пауза и свет
 
Спасибо за совет,уже сам начал думать заменить "змейку" и перетянуть текстуры по новой.Еще куча плюх в разработке.бонусы там всякие и т.п. Хочу еще переделать подсчет жизней из текста в спрайт,или картинку.Как прогрессбар только наоборот,ну короче вы поняли)

LLI.T.A.L.K.E.R. 10.03.2011 21:35

Ответ: Пауза и свет
 
Динамическая камера (если не будет мешать при обзоре местности)
Код:

PointEntity cam,Player ; после этого места можешь дописать

Zoom#=1+(EntityDistance(cam,Player)-35)*0.1 ; 35 это расстояние по Y от камеры до змейки
CameraZoom cam,Zoom# ; установка зума на переменную Zoom#

Быстрый разворот назад (это так на усмотрение удобней будет или нет):
Код:

If KeyHit(208) TurnEntity Player,0,-180,0

umnick 10.03.2011 21:57

Ответ: Пауза и свет
 
Это все хорошо,но я так и не нашел пример реализации паузы.Пробовал делать через WaitTimer , но не вышло. Есть идеи?

LLI.T.A.L.K.E.R. 10.03.2011 23:17

Ответ: Пауза и свет
 
Вот ButtonSystem:
http://rghost.ru/4714246

И некая попытка соединить в твою игру:
http://rghost.ru/4714341

Что нужно доделать:
создать новую кнопку (для GameScr=2) с названием "В Меню"

2St_AnGer, Ага я на Select-Case и сделал..
Проблема в UpdateWorld RenderWorld, написания Text-ов, ну и в конце Flip.

Т.е. чтобы было видно меню и на заднике игра - нужно рендерить в каждом case.
Фишка в чём, что нужно сначала игровую механику просчитать (движения игрока/врагов), потом рендер, в конце меню нарисовать и тексты, а потом Flip.

В общем в примере я затерялся - Update и Render (из-за кнопочек) до расчётов написал. Надо это под конец Case переместить.

St_AnGer 10.03.2011 23:18

Ответ: Пауза и свет
 
Делать всю игру в структуре Select-Case. Один case отвечает за меню, второй за игровой процесс, третий (допустим) за меню паузы. При нажатии на клавишу паузы уходить в третий case, в котором отрисовка мира продолжается, но действия никакие не происходят. Как то так. Самая простая реализация помоему.

umnick 10.03.2011 23:43

Ответ: Пауза и свет
 
Спасибо,завтра буду разбираться :cool:

Черный крыс 11.03.2011 11:32

Ответ: Пауза и свет
 
Весьма примитивно и не гибко.
Обычно делают так :
1) Прописывают флаги состояний игры.
2) Формируется хук отрисовки / обновления и он же (хук) регистрируется в системе при запуске приложения.
3) Любое состояние управляется с помощью системы событий.

Все это дело есть в БМаксе. В Б3Д надо делать самому ( хуки и события ).

в конечном итоге управление состояниями сводится к такому виду :

Код:

'Обьявление констант и хуков
Const GAME_MENU:Byte = 0
Const GAME_GAME:Byte = 1
Const GAME_PAUSE:Byte = 2
Const GAME_END:Byte = 125
 
' регистрируем события :
AllocUserEventID(GAME_MENU,"МЕНЮ!")
AllocUserEventID(GAME_GAME,"ИГРА!")
...
 
' Обработчик событий :
Function UpdateState:Object(id:Int,data:Object,context:Object)
    ' Здесь обрабатываются все игровые события
 
    ' Если обработчик ничего не обработал то необходимо :
    Return data
EndFunction
 
' Регистрация обработчика в системе событий
AddHook(EmitEventHook, UpdateState) ' Функция регистрируется в системе событий
 
Function Draw(id:Int)
    ' рисование ( id говорит о том, что надо рисовать )
EndFunction
 
Function Update(id:Int, dt:Float)
    ' Обновление ( id говорит о том, что надо обновлять )
EndFunction
 
' ХУК
Function Hook:Object(id:Int,data:Object,context:Object)
    ' id - содержит текущее состояние программы
    Local dt:Float = UpdateDeltaTime() ' Обновление значения дельты времени
    ...
    по полученным данным обновляем и рисуем все, что надо
 
    Update(id,dt)
 
    Draw(id)
   
    Return data
EndFunction
 
' Регистрируем хук в системе
AddHook(FlipHook,Hook) ' Хук вызовится перед Flip()
...
 
' Цикл
 
Repeat
    Cls()
    Flip(True) ' Запуск всех хуков, после этого произойдет смена буффера
Forever
 
' Управляется так :
 
CreateEvent(GAME_PAUSE, 1, 0, 0, 0, Null).Emit()
' Это озночает что мы послали системе сообщение о смене игрового стейта на
' ИГРА В ПАУЗЕ

Одной строчкой кода мы запускаем хук EmitEventHook, в котором обработается созданое событие, в обработке события примет участие и наш созданный выше обработчик.

Смотри сорсы БМакса. Ничего сложного нет. =)

RegIon 11.03.2011 13:02

Ответ: Пауза и свет
 
Цитата:

Спасибо,завтра буду разбираться :cool:
Если разбираться,то сразу...и ещё..НАжми F1 перед командой если не знаешь что такое..(для етого желательно скачать русскую версию хелпа.)

Randomize 11.03.2011 15:46

Ответ: Пауза и свет
 
Цитата:

Сообщение от Diablo1909 (Сообщение 182307)
Весьма примитивно и не гибко.
Обычно делают так :
1) Прописывают флаги состояний игры.
2) Формируется хук отрисовки / обновления и он же (хук) регистрируется в системе при запуске приложения.
3) Любое состояние управляется с помощью системы событий.

Все это дело есть в БМаксе. В Б3Д надо делать самому ( хуки и события ).

в конечном итоге управление состояниями сводится к такому виду :

Код:

'Обьявление констант и хуков
Const GAME_MENU:Byte = 0
Const GAME_GAME:Byte = 1
Const GAME_PAUSE:Byte = 2
Const GAME_END:Byte = 125
 
' регистрируем события :
AllocUserEventID(GAME_MENU,"МЕНЮ!")
AllocUserEventID(GAME_GAME,"ИГРА!")
 ...

Одной строчкой кода мы запускаем хук EmitEventHook, в котором обработается созданое событие, в обработке события примет участие и наш созданный выше обработчик.

Смотри сорсы БМакса. Ничего сложного нет. =)

Ужас! Вот честно! Не легче ли:
PHP код:

Type TState Abstract
   Global 
Current:TState
   Method Update
() Abstract
   
Method Draw() Abstract
EndType

TState
.Current = New TGameState

Repeat
   TState
.Current.Update()
   
TState.Current.Draw()
   
Flip()
Until Keyhit(Key_Escape)



Type GameState Extends TState
   Field PlayerName
$ = "LoL"   

   
Method Update()
   
EndMethod

   Method Draw
()
    
DrawText("Player name: "+PlayerName,0,0)
   
EndMethod
EndType

Type GameOverState 
Extends TState
   Method Update
()
   
EndMethod

   Method Draw
()
    
DrawText("Nice try, ass hole!",0,0)
   
EndMethod
EndType 

Нужно ещё добавить Init() и Destroy() для стейтов и будет ещё лучше.

Черный крыс 11.03.2011 18:38

Ответ: Пауза и свет
 
Цитата:

Сообщение от Randomize (Сообщение 182324)
Ужас! Вот честно! Не легче ли:
PHP код:

Type TState Abstract
   Global 
Current:TState
   Method Update
() Abstract
   
Method Draw() Abstract
EndType
 
TState
.Current = New TGameState
 
Repeat
   TState
.Current.Update()
   
TState.Current.Draw()
   
Flip()
Until Keyhit(Key_Escape)
 
 
 
Type GameState Extends TState
   Field PlayerName
$ = "LoL"   
 
   
Method Update()
   
EndMethod
 
   Method Draw
()
    
DrawText("Player name: "+PlayerName,0,0)
   
EndMethod
EndType
 
Type GameOverState 
Extends TState
   Method Update
()
   
EndMethod
 
   Method Draw
()
    
DrawText("Nice try, ass hole!",0,0)
   
EndMethod
EndType 

Нужно ещё добавить Init() и Destroy() для стейтов и будет ещё лучше.

Хмм....весьма примитивно и снова не гибко.
На самом деле твой метод ужасен.
Зачем плодить отдельные классы на состояния?
Init() и Destroy() для игрового состояния - это вообще бред.
Во вторых при твоем подходе весьма затруднительно будет комбинировать стейты между собой, а тут все просто : CreateEvent(GAME_WORLD_DRAW_ONLY | GAME_PAUSE).Emit() - дали команду движку что приложение находится в паузе. А движок уже сам допиливает этот флаг ( рисовать но не обновлять мир + рисовать и обновлять меню паузы). флаг GAME_PAUSE - отвечает только за отрисовку потемневшего задника + обновление и отрисовку менюхи, а за застывший задний кадр отвечает впередиидущий флаг состояния. На то она и гибкость - что жестко ничего привязывать не надо.
Если тебя испугал тот громозкий код, то там происходит всего-то - инициализация при запуске программы, зато главный цикл - 3 строчки кода. И мне не надо запоминать и где то хранить переменные стэйтов, а вместо этого просто комбинировать 6-7 основных стэйт-флагов. =)

ЗЫ Во всех нормальных программах управление ядром осуществляется через события.


Часовой пояс GMT +4, время: 18:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot