|
3D-программирование Вопросы, касающиеся программирования 3D мира |
10.03.2011, 20:20
|
#1
|
AnyKey`щик
Регистрация: 10.03.2011
Сообщений: 6
Написано 2 полезных сообщений (для 2 пользователей)
|
Пауза и свет
Здравствуйте,ув. программисты,недавно начал знакомиться с Blitz3D,а точнее 4 дня как...Так вот,при "расработке своей первой "игры"" , возникла проблема.Не могу сделать меню и паузу. Так же непонятная проблема со светом , почему-то свет не падает на "пол" , в результате чего тот остается темным.
А что бы не писать тут поэму,выкладываю исходник сего "шедевра".Буду очень благодарен , если кто-нибудь сможет помочь мне.Заранее спасибо
Не получилось прикрепить файл,заливаю на rgost.
Исходник
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2011, 20:40
|
#2
|
Разработчик
Регистрация: 02.06.2009
Адрес: Город Герой Ленинград
Сообщений: 392
Написано 33 полезных сообщений (для 74 пользователей)
|
Ответ: Пауза и свет
__________________
Самый первый и самый великий программист - это Бог.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2011, 20:41
|
#3
|
Разработчик
Регистрация: 02.06.2009
Адрес: Город Герой Ленинград
Сообщений: 392
Написано 33 полезных сообщений (для 74 пользователей)
|
Ответ: Пауза и свет
Помню сам на этом материале учился (твоя игра. Верней не совсем твоя)) )
__________________
Самый первый и самый великий программист - это Бог.
|
(Offline)
|
|
10.03.2011, 20:47
|
#4
|
AnyKey`щик
Регистрация: 10.03.2011
Сообщений: 6
Написано 2 полезных сообщений (для 2 пользователей)
|
Ответ: Пауза и свет
Спасибо большое,свет заработал.С меню буду разбираться.
Да,игра действительно не моя) Ну,точнее на половину)За то,за эти 4 дня , как родная мне стала :D
|
(Offline)
|
|
10.03.2011, 21:17
|
#5
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Пауза и свет
Нормально!
Только кубики другого цвета, тона нужно, а то при большой скорости и тряске "вслепую" уже играл.
Потом модель красного сочного яблока прикрепи! (Или разных цветов с разными бонусами)
Модель змейки попробуй анимированую сделать. (Сначала так подумал, чтобы ножками топала, но это уже ящер будет )
Можно ещё Terrain как пол сделать..
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2011, 21:28
|
#6
|
AnyKey`щик
Регистрация: 10.03.2011
Сообщений: 6
Написано 2 полезных сообщений (для 2 пользователей)
|
Ответ: Пауза и свет
Спасибо за совет,уже сам начал думать заменить "змейку" и перетянуть текстуры по новой.Еще куча плюх в разработке.бонусы там всякие и т.п. Хочу еще переделать подсчет жизней из текста в спрайт,или картинку.Как прогрессбар только наоборот,ну короче вы поняли)
|
(Offline)
|
|
10.03.2011, 21:35
|
#7
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Пауза и свет
Динамическая камера (если не будет мешать при обзоре местности)
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2011, 21:57
|
#8
|
AnyKey`щик
Регистрация: 10.03.2011
Сообщений: 6
Написано 2 полезных сообщений (для 2 пользователей)
|
Ответ: Пауза и свет
Это все хорошо,но я так и не нашел пример реализации паузы.Пробовал делать через WaitTimer , но не вышло. Есть идеи?
|
(Offline)
|
|
10.03.2011, 23:17
|
#9
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Пауза и свет
Вот ButtonSystem:
http://rghost.ru/4714246
И некая попытка соединить в твою игру:
http://rghost.ru/4714341
Что нужно доделать:
создать новую кнопку (для GameScr=2) с названием "В Меню"
2St_AnGer, Ага я на Select-Case и сделал..
Проблема в UpdateWorld RenderWorld, написания Text-ов, ну и в конце Flip.
Т.е. чтобы было видно меню и на заднике игра - нужно рендерить в каждом case.
Фишка в чём, что нужно сначала игровую механику просчитать (движения игрока/врагов), потом рендер, в конце меню нарисовать и тексты, а потом Flip.
В общем в примере я затерялся - Update и Render (из-за кнопочек) до расчётов написал. Надо это под конец Case переместить.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо LLI.T.A.L.K.E.R. за это полезное сообщение:
|
|
10.03.2011, 23:18
|
#10
|
Элита
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений (для 2,828 пользователей)
|
Ответ: Пауза и свет
Делать всю игру в структуре Select-Case. Один case отвечает за меню, второй за игровой процесс, третий (допустим) за меню паузы. При нажатии на клавишу паузы уходить в третий case, в котором отрисовка мира продолжается, но действия никакие не происходят. Как то так. Самая простая реализация помоему.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.
Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2
Скачать Doom 2D: Remake v0.3.8a
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.03.2011, 23:43
|
#11
|
AnyKey`щик
Регистрация: 10.03.2011
Сообщений: 6
Написано 2 полезных сообщений (для 2 пользователей)
|
Ответ: Пауза и свет
Спасибо,завтра буду разбираться
|
(Offline)
|
|
11.03.2011, 11:32
|
#12
|
|
Ответ: Пауза и свет
Весьма примитивно и не гибко.
Обычно делают так :
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, в котором обработается созданое событие, в обработке события примет участие и наш созданный выше обработчик.
Смотри сорсы БМакса. Ничего сложного нет. =)
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
11.03.2011, 13:02
|
#13
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Пауза и свет
Спасибо,завтра буду разбираться
|
Если разбираться,то сразу...и ещё..НАжми F1 перед командой если не знаешь что такое..(для етого желательно скачать русскую версию хелпа.)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.03.2011, 15:46
|
#14
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Пауза и свет
Сообщение от Diablo1909
Весьма примитивно и не гибко.
Обычно делают так :
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, в котором обработается созданое событие, в обработке события примет участие и наш созданный выше обработчик.
Смотри сорсы БМакса. Ничего сложного нет. =)
|
Ужас! Вот честно! Не легче ли:
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() для стейтов и будет ещё лучше.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
|
|
11.03.2011, 18:38
|
#15
|
|
Ответ: Пауза и свет
Сообщение от Randomize
Ужас! Вот честно! Не легче ли:
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 основных стэйт-флагов. =)
ЗЫ Во всех нормальных программах управление ядром осуществляется через события.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:02.
|