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=16642)

Devilox 13.04.2012 20:29

Внедрение стартого меню
 
Мне необходимо, чтобы когда я запускал игру, загружалось меню, и только потом, после нажатия чего-нибудь, включалась игра...
Я нарыл только, что можно поставить после действий меню Flip, но походу это бред, не работает... Подскажите, как мне это осуществить самым-самым простым способом(чтобы просто разобраться, как это работает)...:dontknow:
P.S. А возможно ли, например, запустить файл с меню, выбрать New Game: автоматически по прописанному адресу открывается файл с игрой, а файл с меню закроется?:dontknow:

Nex 13.04.2012 20:39

Ответ: Внедрение стартого меню
 
Создай переменную (к примеру GameStatus%) в которой будет будет два значения 1-меню, 2 -игра. И потом уже за счет этой переменной рисуй меню/игру. Сделай функцию допустим CreateGame () в которой будет создаваться вся игра и запускай ее если нажали "new game". Игру в цикле обновляй в условии If GameStatus = 2 then UpdateGame () и тд. :)

Кстати маленькая сложность будет если из игры можно будет возвращаться в то же меню. Надо будет заменить кнопку "new game" на "continued", еще раз не "создать" игру/сцену и тд. :)

Devilox 13.04.2012 20:49

Ответ: Внедрение стартого меню
 
Спасибо, попробую разобраться :)

Devilox 13.04.2012 22:00

Ответ: Внедрение стартого меню
 
Вот ещё вопрос: если я жму паузу, все процессы останавливаются, а когда продолжаю, то переменные сохраняются, а объекты, получается, создаются заново, следовательно все собранные аптечки, патроны, убитые враги появляются заново, как этого избежать?

tirarex 13.04.2012 22:53

Ответ: Внедрение стартого меню
 
Цитата:

Сообщение от Devilox (Сообщение 225404)
Вот ещё вопрос: если я жму паузу, все процессы останавливаются, а когда продолжаю, то переменные сохраняются, а объекты, получается, создаются заново, следовательно все собранные аптечки, патроны, убитые враги появляются заново, как этого избежать?

использывать два цикла
пример

репеат

если кейхит(2) тогда меню=1

апдатворлд
рендер итд,,


репеат
тут кнопки
апдатворлд
рендер итд,,
если кейхит(1) меню=0
унтил(меню=0)

унтил(кейхит1)

сори за русский но блитз открывать и искать команды уже лень
а для своего меню я использывал команду типо case
ну а там уже разные меню :ok:

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

это кусок кода моей игры и он находиться прямо в главном цикле

Жека 14.04.2012 08:34

Ответ: Внедрение стартого меню
 
tirarex, Несколько циклов - это извращение, вызванное скорее незнанием другого способа.
И кто тебя научил делать так:
Код:

Select True
 Case game=1

Селект подразумевает делать вот так:
Код:

Select game
 Case 1

А вот как избавиться от множества циклов, оставив один главный:
Код:

;главный цикл
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() - если состояние игры, то рисуем шкалу жизней и прочее, если меню, то само меню и т.д.

Devilox 14.04.2012 09:38

Ответ: Внедрение стартого меню
 
Спасибо, буду разбираться дальше :)

St_AnGer 14.04.2012 09:56

Ответ: Внедрение стартого меню
 
Вводим две переменных (допустим): текстовую/численную 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.

Вот как то так. Грубый набросок, но основную мысль вроде бы донёс

L-ee-X 14.04.2012 10:11

Ответ: Внедрение стартого меню
 
Вот когда то писал меню, можешь посмотреть как устроенно и написать свое :)
Menu

Devilox 14.04.2012 18:58

Ответ: Внедрение стартого меню
 
Ещё небольшой вопрос: как мне добраться до имён дубликатов, чтобы правильно после паузы выгрузить обратно игру?

Жека 15.04.2012 08:57

Ответ: Внедрение стартого меню
 
Что за дубликаты такие? Может экземпляры? И зачем вообще что-то выгружать? В момент паузы у тебя просто игровая логика не просчитывается и всё.

Devilox 15.04.2012 16:21

Извиняюсь, я дико ступил, теперь понял, что ты имел ввиду :)
P.S. блин, я только что заметил, что название темы написал с ошибкой :-D

Не сочтите за назойливость: с паузой я всё понял, а вот со стартовым меню - нет: Blitz не хочет брать в условия Global-ы, как этого избежать?

Nex 15.04.2012 22:25

Ответ: Внедрение стартого меню
 
Цитата:

Blitz не хочет брать в условия Global-ы
зачем?! оО

Devilox 15.04.2012 22:29

Ответ: Внедрение стартого меню
 
Может быть я не догоняю чего-нибудь, я думал, что нужно сделать условие для загрузки объектов, но для всех объектов добавил Global, чтобы они были функциям доступны...:dontknow:

Жека 16.04.2012 07:23

Ответ: Внедрение стартого меню
 
Приведи пример неработающего условия, а то не понятно.
А вообще, объекты у тебя скорей всего будут в типах храниться, а значит им не нужно быть глобальными. Создавай их локально внутри функции загрузки уровня:
Код:

function LoadLevel(level%)
Local obj.ObjType
file = openfile(levelsPath + level)
while not eof(file)
obj = new ObjType
;тут считываем инфу об объекте и назначаем её в obj
wend
closefile(file)
endfunction



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

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