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


Devilox 16.04.2012 17:49

Ответ: Внедрение стартого меню
 
Видимо, не дано мне этого понять...:dontknow:
Избежать использования Global к моделям врагов получилось с помощью Local, а вот игрок и камера...
if game=true
global player=CreateSphere()
........
endif

Я вот про это условие говорил...:dontknow:

St_AnGer 16.04.2012 18:19

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

Сообщение от Devilox (Сообщение 225683)
Видимо, не дано мне этого понять...:dontknow:
Избежать использования Global к моделям врагов получилось с помощью Local, а вот игрок и камера...
if game=true
global player=CreateSphere()
........
endif

Я вот про это условие говорил...:dontknow:

это используется в цикле? Global-переменные можно объявлять только вне циклов и функций! Т.е. до цикла

Код:

...
Global player
Global enemy
global тряляля
...

а уже в цикле/функции:
Код:

...
if game=true
      player=CreateSphere()
      ........
endif
...


Devilox 16.04.2012 21:57

Ответ: Внедрение стартого меню
 
Спасибо, условие поставить получилось, но теперь Blitz не хочет загружать объекты, пишет Entity Does not exist, я сделал, вроде всё так...:dontknow:
Код:

Include "Constants.bb"
Include "Types.bb"
;--begin--;
Graphics3D 640,480,16,1
SetBuffer BackBuffer()
;--begin--;

;--objects--:
Global player
Global cam
Global shot1
Global shot2
Global shot_en1
Global enemy
Global enemy2
Global gun1
Global gun2
Global h_asp
Global pl_am
Global im_am
Global piv_fire
Global health_im
Global el_gun_ammo
Global pl_gun_ammo
Global gun_s1
;--objects--:

Global game%=0
Global update%=0

If game=0

cursor=LoadImage("textures\cursor.jpg")
MaskImage cursor,0,0,0

background=LoadTexture("menu.jpg")
back_box=CreateCube()
PositionEntity back_box,0,0,6
ScaleEntity back_box,7,5,0.1
EntityTexture back_box,background

cam2=CreateCamera()

light=CreateLight(cam2)

piv_ng=CreatePivot()
PositionEntity piv_ng,-2.75,0,4.77
ScaleEntity piv_ng,0.1,0.1,0.1

new_game=LoadMesh("models\menu\new game.3ds")
PositionEntity new_game,-3,0,5
ScaleEntity new_game,0.02,0.02,0.02
RotateEntity new_game,0,180,0
EntityPickMode new_game,2
NameEntity new_game,"ng"
EntityParent new_game,piv_ng


EndIf




If game=1

;--images--;
health_im=LoadImage("textures\health.bmp")
el_gun_ammo=LoadImage("textures\el_gun_ammo.bmp")
pl_gun_ammo=LoadImage("textures\pl_gun_ammo.bmp")
;--images--;

;--sounds--;
gun_s1=LoadSound("sounds\gun1.ogg")
;--sounds--;

;--sprites--;
shot1=LoadSprite("textures\shot1.bmp")
ScaleSprite shot1,3,3
EntityRadius shot1,1
EntityType shot1,TYPE_BULLET
HideEntity shot1

shot2=LoadSprite("textures\shot2.bmp")
ScaleSprite shot2,3,3
EntityRadius shot2,1
EntityType shot2,TYPE_BULLET
HideEntity shot2

shot_en1=LoadSprite("textures\shot3.bmp",2)
ScaleSprite shot_en1,5,5
EntityRadius shot_en1,5
EntityType shot_en1,TYPE_EN_BULLET
HideEntity shot_en1
;--sprites--;

;--main--;
pln=CreatePlane()
PositionEntity pln,0,-1,0
EntityType pln,TYPE_WALL
EntityColor pln,50,100,150

player=CreateSphere()
PositionEntity player,0,10,50
EntityRadius player,4
EntityType player, TYPE_PLAYER
EntityAlpha player,1
ScaleEntity player,1,1,1
TurnEntity player,0,180,0

cam=CreateCamera()
EntityParent cam,player
PositionEntity cam,0,5,0

enemy=LoadMesh("models\enemies\enemy1.3ds")
PositionEntity enemy,-5,10,-5
ScaleEntity enemy,0.5,0.5,0.5
MoveEntity enemy,-5,10,-5
EntityType enemy, TYPE_ENEMY
EntityRadius enemy, 4

enemy2=LoadMesh("models\enemies\enemy2.3ds")
PositionEntity enemy2,-5,10,-5
ScaleEntity enemy2,0.2,0.2,0.2
MoveEntity enemy2,-5,10,-5

box=CreateCube()
ScaleEntity box,20,20,2
TurnEntity box,0,90,0
PositionEntity box,70,0,80
EntityPickMode box,2
;--main--;

;--models--;
gun1=LoadMesh("models\level1\gun1.3ds")
ScaleEntity gun1,0.05,0.05,0.05
EntityParent gun1,cam
PositionEntity gun1,-1,-3,3
RotateEntity gun1,0,-90,0
HideEntity gun1
EntityOrder gun1,-1

gun2=LoadMesh("models\level1\gun2.3ds")
ScaleEntity gun2,0.05,0.05,0.05
EntityParent gun2,cam
PositionEntity gun2,-2,-7,0
RotateEntity gun2,0,-90,0
HideEntity gun2
EntityOrder gun2,-1

h_asp=LoadMesh("models\level1\health.3ds")
ScaleEntity h_asp,0.25,0.25,0.25
EntityType h_asp, TYPE_HEALTH
HideEntity h_asp
EntityFX h_asp,1

pl_am=LoadMesh("models\level1\pl_am.b3d")
ScaleEntity pl_am,0.1,0.1,0.1
EntityType pl_am, TYPE_PL_AMMO
EntityFX pl_am,1
HideEntity pl_am

im_am=LoadMesh("models\level1\im_am.b3d")
ScaleEntity im_am,0.1,0.1,0.1
EntityType im_am, TYPE_IMP_AMMO
PositionEntity im_am,5,1,5
EntityFX im_am,1
HideEntity im_am
;--models--;

;--pivots--;
piv_fire=CreatePivot()
EntityParent piv_fire,cam
PositionEntity piv_fire,-1.5,-1.5,8
;--pivots--;

;--collisions--;
Collisions TYPE_PLAYER, TYPE_WALL, 2, 3
Collisions TYPE_BULLET, TYPE_WALL, 2, 1
Collisions TYPE_BULLET, TYPE_ENEMY, 1, 1
Collisions TYPE_EN_BULLET, TYPE_PLAYER, 1, 1
;Collisions TYPE_EN_BULLET, TYPE_WALL, 2, 1
;--collisions--;

;--creations--;

CreateFirstAid()
CreateImpulseAmmo()
CreatePlasmaAmmo()
CreateEnemies(enemy)
;--creations--;

EndIf

;-------------------------------------------------------------

While Not KeyHit(1)

;-------------------------------------------------------------


If game=0




If EntityName(new_game)="ng"
        If CameraPick(cam2,MouseX(),MouseY())
                TurnEntity piv_ng,0,2,0
                If MouseHit(1)
                        game=1
                        update=1
                EndIf
        Else
                If EntityYaw(piv_ng)>0
                        TurnEntity piv_ng,0,-2,0
                ElseIf EntityYaw(piv_ng)<0
                        TurnEntity piv_ng,0,2,0
                EndIf
        EndIf
EndIf




EndIf








If update=1


GameInput()
GameUpdate()

EndIf

UpdateWorld()
RenderWorld()

If update=1

GameDraw()

EndIf

DrawImage cursor,MouseX(),MouseY()

Flip

Wend

End


St_AnGer 16.04.2012 22:32

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

Devilox 16.04.2012 22:39

Ответ: Внедрение стартого меню
 
Вложений: 1
Вот, загрузил...
Если загружать без условия, то всё нормально работает, при условии вылетает только на Update-ах, на простую загрузку объектов он не ругается...:dontknow:

Жека 17.04.2012 04:42

Ответ: Внедрение стартого меню
 
Не туда условия ставишь. Грузить надо всё это без условий, а уже в игровом цикле по условию делать то, что это условие предполагает.

St_AnGer 17.04.2012 08:45

Ответ: Внедрение стартого меню
 
Вложений: 1
Вот, чутка изменил твой код. Работает и правильно грузится. Вроде всё понятно, изменения увидишь сразу. От себя добавил только организацию меню. Опять таки грубый набросок, но работает как часы. Принцип понятен я думаю.

Вложение 16653

Внимательно читай что тут тебе написали выше, я реализовал именно это.

Devilox 17.04.2012 17:29

Ответ: Внедрение стартого меню
 
Большое спасибо! Очень помогло! :)
P.S. только Blitz коллизии не считает при попадании пули во врага, с чем это может быть связано?

Halk-DS 18.04.2012 00:07

Ответ: Внедрение стартого меню
 
Лучше пули не связывать с коллизией. А просчитывать ее как то математическим образом, по векторах чтоле.
Но если тебе хочется по проще, юзай команду LinePick. Или еще проще CameraPick - но этот оператор как я сам сегодня только убедился жрет ресурсов компа оч много. Поэтому я б вообще избегал ее применения. Ну разве что где производительность до одного места.

Жека 18.04.2012 05:12

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

Сообщение от Devilox (Сообщение 225771)
Большое спасибо! Очень помогло! :)
P.S. только Blitz коллизии не считает при попадании пули во врага, с чем это может быть связано?

Значит пуля всё-таки не попадает во врага. Кстати, в предыдущей версии твоего кода работало ведь.

Devilox 18.04.2012 08:20

Ответ: Внедрение стартого меню
 
В том-то и дело...:dontknow:

Жека 18.04.2012 13:14

Ответ: Внедрение стартого меню
 
Я посмотрел код который дал тебе St_AnGer. Выяснил, что у тебя не задана константа TYPE_ENEMY, добавь её.

По коду ещё: типы коллизий меняться не должны, так что лучше сделать их константами, чтоб случайно не изменить по ходу игры.
Const TYPE_ENEMY% = 8
и так далее для всех.

Попробуй среду разработки IDEal - http://www.fungamesfactory.com/, в ней необъявленные переменные подсвечиваются красным, если сделаешь опечатку то сразу увидишь (правда из инклудов константы красными показаны, но это мелочь всё равно).

Ещё в главном цикле проверка состояний через Select... Case со строковым значением, а сравнение строк медленнее чем чисел, хоть и удобнее читать, хотя при наличии констант читается тоже удобно:
Код:

Const STATE_MENU_LOAD% = 1
Const STATE_GAME% = 2
......
Global gameState% = STATE_MENU_LOAD
......
Select gameState
  Case STATE_MENU_LOAD
  ;грузим меню

  Case STATE_GAME
  ;идёт игра
End Select


Devilox 19.04.2012 15:52

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

Halk-DS 19.04.2012 17:59

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

Цитата:

Сообщение от Жека (Сообщение 225798)
Попробуй среду разработки IDEal - http://www.fungamesfactory.com/, в ней необъявленные переменные подсвечиваются красным, если сделаешь опечатку то сразу увидишь (правда из инклудов константы красными показаны, но это мелочь всё равно).

Ого. Отличная штука. Не знал про ее существование, только когда то юзал протеан, но не помню уже почему перестал.
По этому поводу возник вопрос. Я например когда печатаю Graphics3d оператор, мне IDE подсвечивает варианты, но это происходит на долю секунд. Я пробую успеть за это время 2-3 раза нажать вниз что б выбрать именно оператор Graphics3d и когда жму Enter, то ничего не происходит, просто курсор опускается вниз на 1 строку. Как правильно воспользоваться, или настроить это всплывающее меню?
п.с. А то что переменные из инклудов не подсвечиваются действительно не очень. Может можно эти переменные из инклуда вставить в главный файл и добавить их в какой то искусственно созданный "Плюсик"(тот что может скрывать весь код функции в 1-ну строку, только сделать то же самое с кучей мешающих Global и Const)

Жека 20.04.2012 06:17

Ответ: Внедрение стартого меню
 
Randomize рекомендовал кому-то эту ИСР IDE, от него я узнал.
Я как только поставил и попробовал писать, понял что что-то не так как везде. Прошарил все настройки, чтобы посмотреть какие есть возможности и чтобы понять как автоподстановку вызвать и настроить мелочи. Вызов автоподстановки - Alt+Space. Выбор выделенной строки из списка подстановки: Tab.
Ещё крутые вещи в IDEal:
- работа с типами, ставишь "\" и он тебе все поля типа показывает в списке подстановки.
- автоподстановка своих функций и типов
Из минусов:
- не работает копировать/вставить через Ctrl+Ins / Shift+Ins, а я привык к ним.

Я отказался от использования инклудов, они мне не нужны (интересно, когда только начинал кодить в блитце использовал их) - парсер кода справляется с большим количеством строк + сворачиваемость функций в линию + навигация через Code Explorer.

Devilox 20.04.2012 15:52

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

Wegox 20.04.2012 16:19

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

Devilox 20.04.2012 16:36

Ответ: Внедрение стартого меню
 
Это-то понятно, я вот пример почитал, переменные сохранять могу:
http://forum.boolean.name/showthread.php?t=1014
Дело в другом: у меня тип с врагами, и нужно сохранить, каких именно я убил, а каких - нет :dontknow:

Wegox 20.04.2012 16:47

Ответ: Внедрение стартого меню
 
Ну, записывай тех которых убил, в тёмную книгу сохранения:pure_magic: я не знаю как ещё объяснить вроде просто всё.
и пусть они больше не загружаются.
И с объектами которые можно подобрать поступай тем же борзом.
А вообще лучше не возвращаться обратно, а то возникает ощущение что где-то я уже это видел, но это ощущение не похоже на дежавю
это скорее говорит о том что игрок ходит по кругу.

Ааа, ну тех которых убил Delete из типа, а их имена записывай, метод вроде тот-же, только с другой стороны
пусть функция проверяет перед стартом кто или что было удалено из файла или откуда там.

При старте проверяй что-то вроде if not б\блабла="бот который" делете б, я не помню как там на блитзе.

Ну да тут смотря чего больше мёртвых ботов или живых, это уже оптимизация, тут думай сам каких сохранять, но в любом случае, сохранять нужно, либо живых либо мёртвых в зависимости от дальнейший загрузки!

Жека 20.04.2012 18:12

Ответ: Внедрение стартого меню
 
Я предлагаю забыть о сохранении состояния уровня, хранить только номер уровня: если игрок не прошёл уровень, то ничего страшного, заново начнет.:)
А потом когда-нибудь доработаешь.

Devilox 20.04.2012 19:41

Ответ: Внедрение стартого меню
 
Думаю, что это неплохая идея, учитывая, что это первый проект :)

reumep 23.04.2012 22:33

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

Сообщение от Жека (Сообщение 226007)
Я предлагаю забыть о сохранении состояния уровня, хранить только номер уровня: если игрок не прошёл уровень, то ничего страшного, заново начнет.:)
А потом когда-нибудь доработаешь.

ну да, проходит игрок суперсложный уровень, с десятой попытки получилось, почти добегает до ворот на следующий уровень... и тут злобный пьяный электрик дядя саша коротит ноль на фазу и выключается свет, а у него нет ИБП. Представь игрока в этой ситуации :-D, будет что-то наподобие этого http://www.youtube.com/watch?v=jQeC5yB8dE8

Жека 24.04.2012 05:30

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

Сообщение от reumep (Сообщение 226286)
ну да, проходит игрок суперсложный уровень, с десятой попытки получилось, почти добегает до ворот на следующий уровень... и тут злобный пьяный электрик дядя саша коротит ноль на фазу и выключается свет, а у него нет ИБП. Представь игрока в этой ситуации :-D, будет что-то наподобие этого http://www.youtube.com/watch?v=jQeC5yB8dE8

Я лишь подсказал Devilox-у оптимальный для него вариант, доступный ему уже сейчас, на мой взгляд.
Когда у него будут нужные умения, то сделает всё что захочет.
Если игрок предрасположен к неадеквату, то он найдёт другую игру без сохранения и психанёт на ней. Короче, у такого почти нет выбора.:)

Devilox 25.04.2012 17:39

Ответ: Внедрение стартого меню
 
Да, вот ещё заключительный вопрос: как мне лучше всего организовать игру:
1)Сделать меню и все уровни в одном файле, загружать всё только после нажатия "New Game", а потом описывать переход по уровням - громоздкий код
2)Загрузить вообще всё сразу, скрыть и потом показывать, когда и что нужно(также в одном файле) - скрывать слишком много, код чуть-чуть поменьше, мне кажется, будет, но, по-моему, всё равно неудобно
3)Загрузить вообще всё, создать отдельные файлы уровней с функциями уже загруженных объектов и подружать когда надо - ну тут вообще не понятно, как тогда удалять функцию CreateBlaBla() со всеми её объектами...способ получился бы хорошим, если уровни можно бы было подгружать как функции и впоследствии удалять их, чтобы не нагружать комп

Halk-DS 25.04.2012 18:57

Ответ: Внедрение стартого меню
 
Я б посоветовал в начале запуска игры загрузить все что касается интерфейса меню. И по возможности загрузить то что будет общим во всех уровнях. Там например интерфейс геймплея, персонажа, может еще что то.

Далее я б написал функции что то вроде этих:
LoadLevel(levelname$) - для загрузки необходимого уровня.
ClearLevel() - При окончании уровня удаляет все данные уровня для того, что б не мешали при загрузке следующего уровня, другими словами уберем шлак. Возможно здесь тоже пригодится параметр levelname$- это уже зависит от тебя и игры.
Initialize(levelname$) - Подготовка переменных (например координаты X,Y,Z игрока на каждом уровне). Настройки камер и прочего что в разных уровнях будет отличатся.

А загадочный levelname$ - путь к файлу с описанием левела. Либо можно по другом:
PHP код:

Function LoadLevel(levelname$)
Select levelname$
Case 
"Level 1"
;Описываем загрузку 1-го уровня.
Case 
"Level 2"
;Тут соответственно 2-го.
Case ...
;
и т.д.
Default
;
Выкидываем ошибкуибо уровня нет.
RuntimeError "Can`t find level: "+levelname$
End select
End 
Function 


reumep 25.04.2012 19:00

Ответ: Внедрение стартого меню
 
Лично я предлагаю тот вариант, который будет удобней для тебя. Если ты будешь потом выкладывать исходники куда-то, то лучше удобночитаемый, красивый код. Если же это проект чисто для себя, то можно писать костыль на костыле, если тебе так удобно. Все равно потом можно будет оптимизировать

Devilox 25.04.2012 22:27

Ответ: Внедрение стартого меню
 
Hulk-DS, объясни, пожалуйста, как мне сделать функцию ClearLevel(), если нужно удалить всех врагов, сделанных типом?

Halk-DS 26.04.2012 01:54

Ответ: Внедрение стартого меню
 
Мало написал. Я не знаю в чем заключается твое непонимание данной проблемы...
Просто очищаешь все что есть только в этом уровне (модели, рисунки текстуры, звуки и т.д.)
Припустим есть у тебя пару типов:
PHP код:

Type Enemy
Field Mesh
Field X
,Y,Z
End Type

Type Inventar
Field ItemImage
Field ItemId
End Type 

Ты в игре наделал кучу типов и теперь нужно вызвать ClearLevel()
Пишем:
PHP код:

Function ClearLevel()
     For 
all.Enemy=Each Enemy
          
;И такМы запустили циклкоторый переберет абсолютно все
          
;ячейки типа EnemyОбрати вниманиеслово "all" всево лишь
          
;указатель на этот типМожешь использовать любое другое слово.
          ;
Как видишь в списке у нас хранится модель по адресуall/mesh
          
;Перед тем как очиистить тип от адресов и переменных нам нужно
          
;Удалить саму модельа потом уже удалять к ней адрес.
          
FreeEntity all/mesh
          
;А теперь можем смело удалять весю ячейку типаПеременные
          
;Удалятся из памяти самиА делать надо так
          Delete all
          
;Цикл будет повторятся столько разсколько у тебя ячеек в списке
          
;И удалит абсолютно все ячейки списка.
     
Next

     
;Остался еще один список Inventarв котором для каждого Итема
     
;Хранится рисунокДелаем почти то же самое:

     For 
LyboeImya.Inventar=Each Inventar
          FreeImage LyboeImya
/ItemImage ;Вместо модели удаляем рисунки.
          
Delete LyboeImya
     Next
End 
Function 

Короче, все что не является переменными нужно удалить отдельно вызовом специального оператора. Ибо вызвав команду Delete - ты не удалишь все модели, ты удалишь только адреса на них. После чего удаление этих самых моделей станет возможным только вызовом:
ClearWorld [entities][,brushes][,textures]

В этом заключалась проблема?

Devilox 26.04.2012 15:12

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

Halk-DS 26.04.2012 15:25

Ответ: Внедрение стартого меню
 
Уже крен знает какой рас пощу эту ссылку. Связанные списки в Blitz3D
Если всю статейку освоишь, то со списками проблем появляться больше не должно.

Алекс_Нос 08.05.2012 11:40

Ответ: Внедрение стартого меню
 
конструкция примерно такого типа :
Init_menu()
Init_input()
Load_menu () <--- (эта функа гоняется пока не сбудется запуск - тогда ретурн из нее)
Init_World ()
все что хочешь загрузить
repeat
Init_input()
...
траляля логика и прочая святотень..
..
until...

Devilox 08.05.2012 12:31

Ответ: Внедрение стартого меню
 
Вложений: 2
Блин, до удаления Create-ов я так и не дошёл, возникла ещё проблема: я решил выстроить код по новой, сделал меню и загрузку уровня из него, но только когда я запускаю уровень, двигать игроком невозможно... С чем это может быть связано?

Алекс_Нос 08.05.2012 12:37

Ответ: Внедрение стартого меню
 
переписать все нафик :dontknow: !!!

Wegox 08.05.2012 13:39

Ответ: Внедрение стартого меню
 
Мне кажется, что здесь, не уместно столько раз
UpdateWorld(), RenderWorld(), Flip
гонять, можно всё упростить, даже не использовать “кассы”. Вот как я вижу эту программу, пример:

PHP код:

Type 
Field 
End Type

Function Type()
End Function

Type 
Field 
End Type

Function Type()
End Function

Function Function()
End Function

Function Function()
End Function

Global 
GameMenu=0,и.т.д.

Graphics3D Лаунчерсамый крутойкакой нарисовать сможешь!:)
SetBuffer BackBuffer() 

camera=CreateCamera() 
light=CreateLight() 

Вся медияменюдолжна загружаться один раздо основного цикла!

;
GameMenu=0  1 можно через банк памяти передавать CreateBank() 
;
Namb=0  100 можно через банк памяти передавать CreateBank() 

While 
Not KeyDown( ? ) 

If 
GameMenu=1
If KeyHit(1Then GameMenu=0
   UpdateGame
()
   
Namb=100
End 
If

UpdateWorld(Namb)
RenderWorld()

If 
GameMenu=0
    Namb
=0
    UpdateMenu
()
If 
вернутся в игру() Or новая игра()  Then GameMenu=1
EndIf 

Flip 
Wend 

Удаляем всё
()

End 

Ну а вообще, там случай, не безнадёжный, для тех кто раньше помогал разобраться не сложно будет, я не могу понять где чё:)

Devilox 08.05.2012 13:43

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

Wegox 09.05.2012 03:52

Ответ: Внедрение стартого меню
 
Вложений: 1
Вот исправленный вариант, так как я это вижу,:P поправил ходьбу немного,:) отключил прыжок, там с коллизией что-то, не понял чё, давно с ней не работал.:crazy:
Ааааа:-D вон чё, коллизии нет потому что HideEntity player лан, исправил.

Devilox 09.05.2012 18:04

Ответ: Внедрение стартого меню
 
Спасибо, сейчас попытаюсь понять, что там было не так :)


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

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