|
3D-программирование Вопросы, касающиеся программирования 3D мира |
13.04.2012, 20:29
|
#1
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Внедрение стартого меню
Мне необходимо, чтобы когда я запускал игру, загружалось меню, и только потом, после нажатия чего-нибудь, включалась игра...
Я нарыл только, что можно поставить после действий меню Flip, но походу это бред, не работает... Подскажите, как мне это осуществить самым-самым простым способом(чтобы просто разобраться, как это работает)...
P.S. А возможно ли, например, запустить файл с меню, выбрать New Game: автоматически по прописанному адресу открывается файл с игрой, а файл с меню закроется?
|
(Offline)
|
|
13.04.2012, 20:39
|
#2
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Внедрение стартого меню
Создай переменную (к примеру GameStatus%) в которой будет будет два значения 1-меню, 2 -игра. И потом уже за счет этой переменной рисуй меню/игру. Сделай функцию допустим CreateGame () в которой будет создаваться вся игра и запускай ее если нажали "new game". Игру в цикле обновляй в условии If GameStatus = 2 then UpdateGame () и тд.
Кстати маленькая сложность будет если из игры можно будет возвращаться в то же меню. Надо будет заменить кнопку "new game" на "continued", еще раз не "создать" игру/сцену и тд.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.04.2012, 20:49
|
#3
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Внедрение стартого меню
Спасибо, попробую разобраться
|
(Offline)
|
|
13.04.2012, 22:00
|
#4
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Внедрение стартого меню
Вот ещё вопрос: если я жму паузу, все процессы останавливаются, а когда продолжаю, то переменные сохраняются, а объекты, получается, создаются заново, следовательно все собранные аптечки, патроны, убитые враги появляются заново, как этого избежать?
|
(Offline)
|
|
13.04.2012, 22:53
|
#5
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Внедрение стартого меню
Сообщение от Devilox
Вот ещё вопрос: если я жму паузу, все процессы останавливаются, а когда продолжаю, то переменные сохраняются, а объекты, получается, создаются заново, следовательно все собранные аптечки, патроны, убитые враги появляются заново, как этого избежать?
|
использывать два цикла
пример
репеат
если кейхит(2) тогда меню=1
апдатворлд
рендер итд,,
репеат
тут кнопки
апдатворлд
рендер итд,,
если кейхит(1) меню=0
унтил(меню=0)
унтил(кейхит1)
сори за русский но блитз открывать и искать команды уже лень
а для своего меню я использывал команду типо case
ну а там уже разные меню
Select True
Case game=1
Repeat
If Buttons(3)=1 Then game=3
If Buttons(2)=1 Then exitprog=True
UpdateWorld()
RenderWorld()
DrawImage menu_fonted,0,0
RefreshButton(kn3,552,472,"выход",2)
RefreshButton(kn3,552,192,"загрузить",3)
Flip
Until game=3
Case game=2
update_mesh()
Case game=3
game=3
Repeat
If Buttons(2)=1 Then exitprog=True Buttons(2)=0 game=2
If Buttons(0)=1 Then game=2 Buttons(0)=0
UpdateWorld()
RenderWorld()
RefreshButton(kn2,552,184,"на карту",0)
RefreshButton(kn2,552,224,"выход",2)
Flip
Until game=2
End Select
это кусок кода моей игры и он находиться прямо в главном цикле
|
(Offline)
|
|
14.04.2012, 08:34
|
#6
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Внедрение стартого меню
tirarex, Несколько циклов - это извращение, вызванное скорее незнанием другого способа.
И кто тебя научил делать так:
Селект подразумевает делать вот так:
А вот как избавиться от множества циклов, оставив один главный:
;главный цикл
While(running = True)
GameInputProcess() ;тут опрос кнопок и мыши
GameUpdate() ;тут обновление игровой логики
UpdateWorld() ;блитцевская функция
RenderWorld() ;блитцевская функция
GameDraw() ;тут рисуем 2д
Flip() ;блитцевская функция
Wend
;
Function GameUpdate()
If(gameState = STATE_GAME)
;обновление игрока, противников, игрового поля и прочего
Else If(gameState = STATE_MENU_MAIN)
;анимация выделенного пункта меню, например
;Else ....
EndIf
End Function
Аналогично для функции GameDraw() - если состояние игры, то рисуем шкалу жизней и прочее, если меню, то само меню и т.д.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
|
|
14.04.2012, 09:38
|
#7
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Внедрение стартого меню
Спасибо, буду разбираться дальше
|
(Offline)
|
|
14.04.2012, 09:56
|
#8
|
Элита
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений (для 2,828 пользователей)
|
Ответ: Внедрение стартого меню
Вводим две переменных (допустим): текстовую/численную menu и флаг game. Текстовые переменные удобно использовать что бы не запутаться какой пункт меню за что отвечает.
Вот примерный код основного цикла с меню (как делаю я и мне это кажется вполне удобным и понятным):
...
menu$ = "main;
game% = false;
while (условие выхода из основного цикла)
select menu$
case "main":
; Рисуем и делаем то что нужно в основном меню.
; Допустим по клавише "Enter" мы загружаем игру,
; по клавише "Esc" мы выходим из игрового меню,
; а по клавише "q" выгружаем ресурсы игры из памяти.
if (keyhit(28)) then ;нажатие "Enter"
if (game = false) then
menu = "load";
end if
else if (keyhit(1)) then ;нажатие "Esc"
if (game = true) then
menu = "game";
end if
else if (keyhit(16)) then ;нажатие "q"
if (game = true) then
menu = "unload";
end if
end if
case "load":
; загружаем ресурсы
game = true;
menu = "game"
case "game":
; выполняем все нужные действия игры
if (keyhit(1)) then
menu = "main";
end if
case "unload":
; выгружаем ресурсы игры
game = 0;
menu = "main";
end select
wend
...
Как это работает.
При запуске приложения game = 0, т.е. игра не загружена. Мы попадаем в основное меню ( menu = "main").
Полазили по основному меню, нажали на "Esc" - ничего не произошло, т.к. сейчас game = false.
Захотелось поиграть - нажали клавишу "Enter". По условию попадаем в меню загрузки ( menu = "load"). В этом меню пользователь ничего не делает, игра загружает все ресурсы. После того как загрузились все ресурсы ставим флаг game = true и переходим в игру.
Поигрались, захотели в меню, жмём "Esc", переходим в menu = "main". Теперь если мы нажмём клавишу "Enter" - ничего не произойдёт, т.к. game = true и загружать нам ничего ненадо. Для возврата к игре жмём "Esc", при этом вернёмся в меню menu = "game".
Захотели выгрузить ресурсы игры (допустим хотим начать заново), жмём "q". приложение переходит в menu = "unload", выгружает все нужные (точнее уже ненужные) нам ресурсы, ставит флаг game = false и возвращется в menu = "main". Теперь у нас заработает загрузка игры по нажатию клавиши "Enter" и не будет ничего происходить по нажатию клавиш "Esc" и "q", т.к. флаг game = false.
Вот как то так. Грубый набросок, но основную мысль вроде бы донёс
__________________
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)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.04.2012, 10:11
|
#9
|
Разработчик
Регистрация: 06.06.2011
Адрес: Ирк. обл.
Сообщений: 541
Написано 133 полезных сообщений (для 220 пользователей)
|
Ответ: Внедрение стартого меню
Вот когда то писал меню, можешь посмотреть как устроенно и написать свое
Menu
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.04.2012, 18:58
|
#10
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Внедрение стартого меню
Ещё небольшой вопрос: как мне добраться до имён дубликатов, чтобы правильно после паузы выгрузить обратно игру?
|
(Offline)
|
|
15.04.2012, 08:57
|
#11
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Внедрение стартого меню
Что за дубликаты такие? Может экземпляры? И зачем вообще что-то выгружать? В момент паузы у тебя просто игровая логика не просчитывается и всё.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.04.2012, 16:21
|
#12
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Извиняюсь, я дико ступил, теперь понял, что ты имел ввиду
P.S. блин, я только что заметил, что название темы написал с ошибкой
Не сочтите за назойливость: с паузой я всё понял, а вот со стартовым меню - нет: Blitz не хочет брать в условия Global-ы, как этого избежать?
Последний раз редактировалось SBJoker, 15.04.2012 в 22:51.
|
(Offline)
|
|
15.04.2012, 22:25
|
#13
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Внедрение стартого меню
Blitz не хочет брать в условия Global-ы
|
зачем?! оО
|
(Offline)
|
|
15.04.2012, 22:29
|
#14
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Внедрение стартого меню
Может быть я не догоняю чего-нибудь, я думал, что нужно сделать условие для загрузки объектов, но для всех объектов добавил Global, чтобы они были функциям доступны...
|
(Offline)
|
|
16.04.2012, 07:23
|
#15
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Внедрение стартого меню
Приведи пример неработающего условия, а то не понятно.
А вообще, объекты у тебя скорей всего будут в типах храниться, а значит им не нужно быть глобальными. Создавай их локально внутри функции загрузки уровня:
function LoadLevel(level%)
Local obj.ObjType
file = openfile(levelsPath + level)
while not eof(file)
obj = new ObjType
;тут считываем инфу об объекте и назначаем её в obj
wend
closefile(file)
endfunction
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:29.
|