forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Меню (http://forum.boolean.name/showthread.php?t=581)

Fant 08.05.2006 23:53

2Tormoz or Anybody!

Как мне реализовать меню в игре?
Tormoz предложил конечно суперский вариант, но почему-то мне кажется, что я так и делаю, но у меня ничего не выходит из-за ошибки(
(о которой я уже писал)...и ничего не могу с этим поделать!

Fant 09.05.2006 03:10

После адских мучений:

В цикле:

Код:

If gamestate$="mainmenu"
 fnmainmenu()
EndIf
       
If gamestate$="menuGame"
fnMenuGame()
End If

If KeyHit(1)
gamestate$="menuGame"
time#=MilliSecs()-period# 
End If

и сама функция

Код:

Function fnMenuGame()

        Repeat
        Cls
        mhit1= MouseHit(1)
        mhit2= MouseHit(2)
        EnterKey = KeyHit(28)

If gamestate$="mainmenu"
        fnmainmenu()
EndIf

If KeyHit(1)
        ClearWorld()
        Graphics 640,480,16,2
        SetBuffer BackBuffer()
        loadimages()
        gamestate$="mainmenu"
End If

If enterkey
;НУ НЕ ЗНАЮ КАК!!!!!!!!!!!!!!

End If

Flip
Forever

End Function

Если выйти в это меню (черный экран) и нажать enter...ну не знаю я, как завершить этот цикл (exit не катит и не катит repeat until enterkey)? Подскажите как завершить цикл!!! ?

Проблема:
Если из моего меню выйти в главное (нажатием ecs) то при входе в игру, все начнется с этого черного меню, что тоже неправильно, хотя:

Код:

        Case 1;new
        turn=0
        freeimages()
        gamestate$ = "game"
 ;fnDeleteAllObjects()
        fnNewGame()

Это если начали начать новую игру

gamestate$= "game" у меня идет так:

Код:

If gamestate$="mainmenu"
 fnmainmenu()
EndIf
       
If gamestate$="menuGame"
fnMenuGame()
End If

If KeyHit(1)
gamestate$="menuGame"
time#=MilliSecs()-period# 
End If


If gamestate$="game"

и так далее...охватывает If gamestate$="game" весь цикл...до команд UpdateWorld
Next
RenderWorld

Вообщем помогите с завершением цикла!
И почему у меня игра начинается с черного экранчика этой заразной функции?


:bad:

impersonalis 09.05.2006 03:25

Чем плох EXIT?

tormoz 09.05.2006 04:21

Если честно то ошибок столько что легче заново написать с нуля.
Ошибки не синтаксические. а стратегические.
Делай как я тебе написал. иначе утонешь в логике.

выходить из цикла элементарно по переменной:

Код:


While Not menu_stat<>0
 тут твой цикл
 выход - присвоение переменной menu_stat любого значения отличного от нуля
Wend

Select menu_stat
 Case 1
  Go_game()
 Case 2
  Repeat_game()
 Case 3
  Go_graphics()
 ...

End Select


Fant 09.05.2006 10:32

To Imper (можно тебя так называть?) :rolleyes:

Exit - супер) но к сожалению он никак не действует...вообще :blink: я сам выпал...

2Tormoz
Код:

Function fnMenuGame()

While Not menu_stat<>0
        Cls
        mhit1= MouseHit(1)
        mhit2= MouseHit(2)
        EnterKey = KeyHit(28)

If gamestate$="mainmenu"
        fnmainmenu()
EndIf


If KeyHit(1) Then menu_stat=1


Flip
Wend

Select menu_stat

Case 1

ClearWorld()
        Graphics 640,480,16,2
        SetBuffer BackBuffer()
        loadimages()
        gamestate$="mainmenu"
End Select
End Function

При нажатии esc (в этой функции) ругается на updateworld в главном цикле, а так как у меня было раньше до этого select case не ругалось...странно

Зато в моем коде, блин, при нажатии "новая игра" все начиналось с черного экрана...и я не знал как заверщить функцию. (см. пост выше)

Короче хрен редьки не слаще...что так не пашет, что так :bad:

И еще...tormoz...я не проитв твоего кода! Ты мне 100 раз писал, что бы я юзал его! Да я не против, просто я не понял как! А так я бы с радостью! Поэтому думаю, что ты зря писал, что я его "не юзаю" ... я же не баран) Зачем мне делать по-своему неправильно, если ты советуешь правильно) вывод тока 1...я просто не смог реализовать твою...идею!...

tormoz 09.05.2006 16:03

Еще раз: графику задавай заново ТОЛЬКО если в меню менялись настройки разрешения.
И просто очищай весь мир тогда и гото на начало (там где графа инициализируется)

А почему у тебя вылетает на updateworld, да еще и в главном цикле - можно только гадать. Ищи.

jimon 09.05.2006 16:38

давноооо суда не заходил
тут уже гон пошол :)

совет #1 - зделай меню так чтобы оно в любом разрешении выглядело одинаково

совет #2 - меню надо зделать так чтобы оно создавалось в начале игры, а потом если надо просто visible / invisible :)

и все

я конешно щас мудрю с task trees :) но пока ты вникниш что ето такое - пройдет много времени

кстати остальным : task trees очень удобная оказывается вещь - засунул к примеру обновление ai и всего остального по taskам и давай если че то кусок дерева на паузу ставиш, или чет другое делаеш

да и еще приоритеты и чилды класно юзаются :)

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

bool game_run = 1;
while (sys->Main_Cycle() != 0 && game_run == 1)
{
        if (sys->receiver->KeyHit(KEY_ESCAPE)) game_run = 0;

        Physx->StartPhysics();
        Physx->GetPhysicsResults();

        dusty->TaskTree->DoUpdates();

        //reset to receiver
        sys->receiver->Reset();
};


Fant 10.05.2006 00:21

Ну...и смех и слезы...

А ларчик-то просто открывался. Вот как я решил траблу, и все пашет:

Код:

Function fnMenuGame()

Repeat
        Cls
        mhit1= MouseHit(1)
        mhit2= MouseHit(2)
        EnterKey = KeyHit(28)

Delay 2



If gamestate$="mainmenu"
        fnmainmenu()
EndIf

; ВОТ ЭТОГО НЕ ХВАТАЛО В ЦИКЛЕ
If gamestate$="game"
        Exit
EndIf

If KeyHit(1)
        ClearWorld()
        Graphics 640,480,16,2
        SetBuffer BackBuffer()
       
        loadimages()
        gamestate$="mainmenu"
End If

If enterkey=1 Then gamestate$="game"


Flip
Forever
End Function

Но если хорошо извратиться, и поставить бомбу, не дать ей взорваться и выйти в главное меню (2 раза ecs) то будет ошибка
Код:

ScaleEntity (bomb\obj,scale#,scale#,scale#)
Удивительно! Но ведь я через clearWorld все объекты удаляю! Почему такая ошибочка?

Можно пойти на хитрость)
fnDestroyField() если esc нажали, но тогда будет ошибка в удаоении: типа объекта нет, а вы удаляете (как я растолковал это для себя)

Как мне быть в этой ситуации?

tormoz 10.05.2006 02:07

Я тебе уже писал: чисть типы

Fant 10.05.2006 12:46

удаление:
Код:

Function fnDestroyField()

        For cube.cubes = Each cubes
        If cube\obj Then FreeEntity cube\obj:cube\obj=0
 Delete cube
        Next
       
        For bomba.bombs = Each bombs
 If bomba\obj Then FreeEntity bomba\obj:bomba\obj=0
 Delete bomba
        Next
       
        For boom.booms = Each booms
 If boom\obj Then FreeEntity boom\obj:boom\obj=0
 Delete boom
        Next
       
        For en1.enemy1 = Each enemy1
 If en1\obj Then FreeEntity en1\obj:en1\obj=0
 Delete en1
        Next
       
        For en2.enemy2 = Each enemy2
 If en2\obj Then        FreeEntity en2\obj:en2\obj=0
 Delete en2
        Next
       
        For pr1.prise1 = Each prise1
 If pr1\obj Then FreeEntity pr1\obj:pr1\obj=0
 Delete pr1
        Next
       
;        For player.players = Each players
; If player\obj Then FreeEntity player\obj:player\obj=0
; Delete player
;        Next
End Function

Так все удаляется! Чего тут неправильно?

jimon 10.05.2006 16:21

не уверен в потребности en1\obj=0 и тд

Fant 10.05.2006 17:33

Хорошо! Я тоже не очень уверен...так что мне с багом делать?

tormoz 10.05.2006 17:45

Блин.
Найди мой пост про чистку типов и перечитай.
Пишу А С Пушкину что ли ???

Fant 10.05.2006 20:53

Delete Each MyType - очищает весь тип MyType - вои ваш пост


А можно мне простой примерчик по очищению? В хелпе никакого примера по Delete Each MyType не нашел!

ВОт нужен пример по:
Delete Each MyType

Guest 10.05.2006 22:29

Код:

Type TPoint
 Field x#,y#,r,g,b
End Type

kolvo = 100

For k=0 To kolvo
 point.TPoint = New TPoint
 point\x=Rnd(640)
 point\y=Rnd(480)
 point\r=Rand(255)
 point\g=Rand(255)
 point\b=Rand(255)
Next

Graphics 640,480

For point.TPoint = Each TPoint
 Color point\r,point\g,point\b
 Plot point\x,point\y
Next

Flip

;вот тут удаление всех экземпляров типа TPoint происходит
Delete Each TPoint

WaitKey()

End

Так можно удалять только если у тебя в полях типа содержатся переменные, такие как Числа (обычные - твои!) и строки.
Если же эти числа - указатели на объекты, к примеру, на картинку, то прежде чем удалить экземпляр типа, нужно удалить из памяти эту картинку (или любой другой объект, на который указывает переменная). Если звучит как-то непонятно, не расстраивайся, ты до того как связаться с "УДАЛИТЬ_КАЖДЫЙ" всё нормально удалял.
Теперь не знаю чё будет...


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

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