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 17.01.2006 23:28

Вот здесь наработки меню.

Пока что работаю над переключением режима экрана

клавишей 1,2,3,4 можно выбрать режим.
Затем жмем клавишу esc и...все работает.

NGIU я решил не использовать, по некоторым причинам

Вопросы

1) Достаточно ли этот метод хорош?
2) если нет, то как сделать лучше (оптимальнее)?

Не стоит думать что это ошибка то, что переключение 3D режимов я пишу в 2d разделе. Просто это только начальная стадия меню. Дальше будет работа в 2d.

Прошу помочь мне в данном вопросе.

Код:

Global a1=320; переменные для режимов графики
Global a2=240
Global a3=32
Global a4=2


Graphics3D a1,a2,a3,a4; то, что переключать надо

fnmainmenu()

;--------------------------------------------------------------------------------------------------------
;Эти строки не важны. Мы не будем их использовать или изменять!!!!!!!!!!!!!
Global mesh_3ds=LoadAnimMesh( "makbot\mak_robotic.3ds" );anim seq 0
Global mesh_x=LoadAnimMesh( "makbot\mak_robotic.x" )        ;anim seq 0
Global pivot=CreatePivot()
;Эти строки не важны. Мы не будем их использовать или изменять!!!!!!!!!!!!!
;--------------------------------------------------------------------------------------------------------

fnLoadscene(); это просто для проверки, что меню "пашет"
;ЦИКЛ!!!!!!!!!!!!!!!
While Not KeyHit(1)



fnfignya(); это просто для проверки, что меню "пашет"
UpdateWorld
RenderWorld
Flip
       
Wend
;ЦИКЛ!!!!!!!!!!!!!!!

End

Function fnmainmenu()
 fon=LoadImage("graphics\mainFont.jpg")
DrawImage fon,0,0


Repeat

If KeyHit (2)=True; если нажали клавишу 1
ClearWorld; очистим мир от зла
a1=640; режим
a2=480
a3=32
a4=2
Graphics3D a1,a2,a3,a4; меняем графу
End If


If KeyHit (3)=True; если нажали клавишу 2
ClearWorld
a1=800
a2=600
a3=32
a4=2
Graphics3D a1,a2,a3,a4; меняем графу
End If

If KeyHit (4)=True; если нажали клавишу 3
ClearWorld
a1=1024
a2=768
a3=32
a4=2
Graphics3D a1,a2,a3,a4; меняем графу
End If



Flip
RenderWorld
Until KeyHit(1)
End Function


;-------------------------------------------------------------------------------------------------------
;Эти функции не важны. Мы не будем их использовать или изменять!!!!!!!!!!!!!
Function fnLoadscene()
LoadAnimSeq mesh_3ds,"makbot\mak_running.3ds"        ;anim seq 1
PositionEntity mesh_3ds,-15,-15,0
LoadAnimSeq mesh_x,"makbot\mak_running.x" ;anim seq 1
PositionEntity mesh_x,+15,-15,0
cam=CreateCamera( pivot )
PositionEntity cam,0,0,-100
lit=CreateLight()
RotateEntity lit,45,45,0
Animate mesh_3ds,2;start ping-pong anims...
Animate mesh_x, 2
trans=10
End Function
Function fnfignya()
If KeyHit(57)
trans=10-trans
EndIf
If KeyDown(28)
If AnimSeq(mesh_3ds)=0 Animate mesh_3ds,1,.5,1,trans
If AnimSeq(mesh_x )=0 Animate mesh_x, 1,.5,1,trans
Else
If AnimSeq(mesh_3ds)=1 Animate mesh_3ds,2,1,0,trans
If AnimSeq(mesh_x )=1 Animate mesh_x ,2,1,0,trans
EndIf
If KeyDown(30) MoveEntity cam,0,0,10
If KeyDown(44) MoveEntity cam,0,0,-10
If KeyDown(203) TurnEntity pivot,0,3,0
If KeyDown(205) TurnEntity pivot,0,-3,0
End Function
;Эти функции не важны. Мы не будем их использовать или изменять!!!!!!!!!!!!!
;--------------------------------------------------------------------------------------------------------


SubZer0 17.01.2006 23:35

есть либа, причем очень хорошая... создать можно гуи как в windows

смотреть тут: http://community.boolean.name/index.php?showtopic=13

Fant 17.01.2006 23:51

Цитата:

Originally posted by SubZer0@Jan 17 2006, 10:35 PM
есть либа, причем очень хорошая... создать можно гуи как в windows

смотреть тут: http://community.boolean.name/index.php?showtopic=13


К сожалению ссылка не работает на либу!

А как моё меню?
Стоит дорабатывать? Изменить что? А ссылка битая!(

SubZer0 18.01.2006 00:11

подправил ссылу...


я наверное неправильно тебя понял... посмотри либу, может тебе такое пригодится... :)

Fant 18.01.2006 00:17

Программа наверное супер! Но у меня example ее не запускается. Говорит, что фукнция ненайдена. Ну да ладно! У меня есть NGui

Но я не черз ГУИ а средствами блиц хочу!

2SubZer0

Ну как мой примерчик? мне очень важно знать мнение того, насколько он плох, и что нужно править? (упоси боже править все)

impersonalis 18.01.2006 01:45

ДА. я бы рекомендовал для игры NGUI.
Хотя, думаю, разобраться в нём будет сложновато (но не проще чем в других версиях ГУИ).

Не совсем корректно выражение:
Цитата:

Но я не черз ГУИ а средствами блиц хочу!
Все перечисленные здесь GUI на сколько мне известно полностью сконструированы на б3д (правда, alphaGUI имеет внешний редактор).
Или подразумевается - ты не хочешь зраниь установки ГУИ в отдельном файле?

Платон 18.01.2006 12:51

Я бы посоветовал сделать все типами.
Тип кнопка
Тип скроллер
Тип флажок
Тип экран

потом описать их, причем функции обновления кнопок и про. гаджетов должны возвращать ИД(идентификационный номер) того гаджета который был активирован.

Все эти гаджеты размещаются в спец. группах - экранах.

Делаешь функцию обновления экрана, параметров которой евляется указатель на экран. Она будет обновлять все гаджеты которые расположены на этом экране.

А сам цикл меню можно при этом организовать так
Код:

MainEvent=MM_MAINSCREEN
;.....................................
;проверка переменной главного события
Select MainEvent
;если произошло событие - нажата кнопка "новая игра" главного экрана
;то обновляем экран с выбором сложности
        Case MM_NEWGAME
 event=UpdateScreen(ScreenChooseGame);обновление экрана выбора сложности
 If event Then
        MainEvent=event
 End If
;Если произошло событие - нажата кнопка "опции" главного экрана
;То обновляем экран опций из которого можно выйти в главный экран
;кнопкой "Назад", при этом произойдет событие MM_MAINSCREEN
;которое вернет нас в главный экран
        Case MM_OPTIONS
 event=UpdateScreen(ScreenOptions);обновление экрана опций
 If event Then
        MainEvent=event
 End If
;Ну а есл мы нажади кнопку "выход", то соответственно выполняется комманда выхода
        Case MM_QUIT
 End
;.........................................
;По умолчанию переменная события стоит на событии обновления главного
;экрана. На главном экране расположены к примеру кнопки "Новая игра"
;"опции" и "выход", соответственно к ним прикреплены соответствующие события
        Case MM_MAINSCREEN
 event=UpdateScreen(ScreenMainScreen)
 If event Then
        MainEvent=event
 End If
End Select

Заранее описав константы событий(ИД гаджетов) можно переходить с одного экрана на другой и т.п.
Вобщем примерно так.
Если что непонятно - спрашивай. :)

Платон 18.01.2006 14:36

Вот, нарыл наконец-то исходник по работе с кнопками.
За орфографические ошибки, если есть, звиняюсь заранее - писал давно, неграмотный был :)
Тут все раскоментированно, думаю понятно будет :))
Код:

Graphics 640,480,16,2
SetBuffer BackBuffer()

SetFont(LoadFont("Arial Cyr",22))

Global MX=0,MY=0,Mdown1=False

Function UpdateMouse()
        MX=MouseX()
        MY=MouseY()
        MDown1=MouseDown(1)
End Function

;тип кнопка
Type TButtons
;позиция начала и позиция конца
        Field x,y,x2,y2
;текст кнопки
        Field Title$
;ИД номер или номер события закрепленного за этой нопкой
        Field id
;группа или экран к которому относится эта кнопка
        Field group
;цвет текста кнопки(нужно для эффектов)
        Field col
;переменная фокуса, нужна чтобы кнопка срабатывала только после отжатия.
;Например нажал на кнопку и передумал - просто неотжимая кнопку убрать
;с нее указатель мыши, и она не сработает.
        Field focuse
End Type

;функция для создания новой кнопки. Тип функции указываем как тип Кнопка, так как мы будем возвращать обьект кнопка с таким типом
;параметры функции:
;номер события или ИД номер
;Текст кнопки
;позиция на экране
;группа(или экран) к которой(ому) будет относиться кнопка
Function NewButton.TButtons(id,Title$,x,y,group=0)
;создаем новый объект кнопка в памяти
        But.TButtons=New TButtons
;инициализируем его поля
        But\id=id
        But\Title=Title
        But\x=x
        But\y=y
        but\group=group
        but\col=0
        but\focuse=False
;позиция конца отсчитывается от позиции начала и зависит от длины текста кнопки
        But\x2=x+StringWidth(title)
        But\y2=y+StringHeight(title)
;возвращаем обьект из функции
;Нужно например для работы с индивидуальной кнопкой
        Return but
End Function

;функция обновления кнопок
;Параметры функции:
;группа (или экран) кнопок которую(ый) надо обновить.
;По умолчанию эта нулевая группа.
Function UpdateButtons(group=0)
;переменная нужная для хранения результата обновления кнопок.
;Нужна для того чтобы результат можно было возвратить в конце функции, не прервав
;обновления кнопок
        Local out=0
;перебираем весь список кнопок
        For But.TButtons=Each TButtons
        ;если у текущей кнопки из списка группа равна указанной в параметрах функции
        ;то обновляем ее
 If but\group=group Then
 ;проверяем позицию указателя мыши и позицию кнопки
 ;Если указатель мыши дальше чем начало кнопки и ближе чем конец кнопки
 ;(вспомним что координаты начинаются с левого верхнего угла)
 ;то указатель находится над кнопкой
        If (MX>But\x) And (MX<but\x2) And (MY>but\y) And (MY<but\y2) Then
        ;далее проверяем, если при этом кнопка мыши нажата(т.е мы нажали на кнопку)
  If Mdown1 Then
  ;активируем флаг кнопки - фокус
  ;раз мы на нее нажали, значит мы сфокусировались :) на этой кнопке и
  ;надо ей это сообщить
          But\Focuse=True
  Else
  ;если кнопку отжали или еще не нажимали, то
  ;увеличиваем "цвет"(но правильнее сказать - интенсивность цвета)
  ;Увеличиваться он будет до тех пор пока любой из цветовых компонент
  ;не достигнет максимального - 255.
          If but\col<155 Then but\col=but\col+5
  ;если на кнопке был установлен фокус (тоесть мы ее уже нажимали)
          If But\focuse Then
          ;записываем ИД номер кнопки в переменную результата
  out=but\id
          ;сбрасываем цвет, иначе после перехода на другой экран
          ;(обновления другой группы кнопок), у этой кнопки останется
          ;цвет активации, и мы это увидим начав обновлять эту кнопку заного
  but\col=0
          End If
  End If
        Else
        ;ну а если мы убрали мышь с кнопки то обнуляем фокус кнопки
        ;тем самым говоря что мы не хотим чтобы кнопка сработала, или просто убрали
  But\Focuse=False
        ;уменьшаем "цвет" кнопки до нуля, создавая эффект плавного гашения
  If but\col>0 Then but\col=but\col-5
        End If
 ;а пока все эти события происходят или не происходят
 ;устанавливаем цвет по умолчанию и прорисовываем текст
 ;кнопки. Сюда можно так же добавить прорисовку картинки кнопки
 ; и проч. мишуры :)
        Color 100+but\col,100+but\col,100
        Text but\x,but\y,but\title
 End If
        Next
;ну и когда бы пробежались по списку, возвращаем из функции результат
;Если бы мы сразу (как только произошла активация кнопки) возвращали результат
;то оператор return вышел ыб из функции не давая возможности нарисоваться и обновиться
; остальным кнопкам, которые находятся дальше по списку
        Return out
End Function

;Функция обновления индивидуальной кнопки, точно такая же как и предыдущая,
;только пробегаться по списку тут мы не будем, ведь у нас уже есть ссылка на нужную кнопку,
;передаваемая через параметры функции. Поэтому рассматривать я ее не буду.
Function UpdateButton(but.TButtons)
        Local out=0
        If MX>But\x And MX<but\x2 And MY>but\y And MY<but\y2 Then
        If Mdown1 Then
  But\Focuse=True
        Else
  If but\col<155 Then but\col=but\col+5
  If But\focuse Then
          but\col=0
          but\focuse=False
          Return True
  End If
        End If
        Else
 but\focuse=False
 If but\col>0 Then but\col=but\col-5
        End If
        Color 100+but\col,100+but\col,100
        Text but\x,but\y,but\title
        Return False
End Function

;ну а эта функция-заглушка, вместо нее может быть что угодно.
Function DrawEnything()
        Color 100,100,100
        Rect 10,10,615,400,0
End Function

;Здесь идуду константы событий или ИД номера кнопок.
Const MM_MAIN=0;главное событие, когда обновляются все кнопки нулевой группы
Const MM_NEWGAME=1;событие обновления экрана "новая игра"
Const MM_OPTIONS=2;событие обновления экрана "опции"
Const MM_ABOUT=3;событие обновления экрана "о программе"
Const MM_QUIT=4;событие выхода из программы
         
;Почему у следующих констант такие странные номера?
;Потому что эти события описаные этими константами относятся к событию вызова экрана опции
;у которого номер события равен 2. И воспользовавшись структурой многоуровнего списка
;( Word все знаем?:) ) я поименовал эти константы как подконстанты. Так удобнее.
Const MM_GRAPHS=21;событие обновления подэкрана графика, экрана опции
Const MM_SOUNDS=22;событие обновления подэкрана звуки, экрана опции
Const MM_CTRLS=23;событие обновления подэкрана управление, экрана опции
;##########################################
;Пришло время создавать наши кнопки
;Думаю из названия понятно какие кнопки к чему относятся
;Обратите внимание на кнопки которым проставлены номера групп (последний параметр)
NewButton(MM_NEWGAME,"Новая игра",60,200)
NewButton(MM_OPTIONS,"Опции",60,220)
        ;эта кнопка не будет обновляться в главном экране
;так как ее группа 2, а главный экран это нулевая группа
;(которую кстате не обязательно указывать так как она по умолчанию)
        NewButton(MM_GRAPHS,"Графика",200,200,2)
        ;эта кнопка тоже
        NewButton(MM_SOUNDS,"Звуки",200,220,2)
        ;и эта кнопка
        NewButton(MM_CTRLS,"Управление",200,240,2)
NewButton(MM_ABOUT,"О программе",60,240)
NewButton(MM_QUIT,"Выход",60,260)

;кнопка назад будет использоватся в нескольких экранах и не относиться
;к конкретной группе кнопок, потому поставим ей группу номер 1, еще никем не использованную.
;А так же сохраняем эту кнопку в переменной, для того чтобы обновлять ее отдельно от остальных кнопок
;ИД номер (или номер события) в таком случае не имеет значения, лишь бы он был отличен от нуля
;Ведь как известно булевское значение true это значение отличное от нуля, а false это нуль.
;А нам нужна только проверка - была нажата эта кнопкак или нет.
ButBack.TButtons=NewButton(1,"Назад",560,440,1)
;##########################################
;ну и гоавный цикл конечно, где находиться основная логика работы меню
While Not KeyDown(1)
Cls
;читаем мышь, чтоб знать где находиться указатель мыши. Кстате
;в эту функцию можно поместить прорисовку собственного указателя
;но при этом е следует поместить в самом конце, чтобы указатель прорисовывался
;самым последним и был поверх всех кнопок.
UpdateMouse()

;Тут мы проверям переменную главных событий
Select MainEvent
;по умолчанию функция обновления кнопок возвращает нуль, поэтому
;мы "повесили" событие обновления главного экрана на константу равную нулю
        Case MM_MAIN
        ;обновляем все кнопки нулевой группы, соответственно на экране
        ;будут рисоваться только они, и если мы нажали на какую-нибудь
        ;кнопку то вункция возвратить значение отличное от нуля, и равное
        ;значению ИД номера прикрепленного к этой кнопке.
 MainEvent=UpdateButtons()
;если это значение равно константе обновления экрана "новая игра"
        Case MM_NEWGAME
        ;рисуем что-нибудь. Это что-нибудь может быть еще одним экраном
        ;(группой кнопок) с выбором уровня сложности. Достаточно создать
        ;дополнительную константу хранящуюю номер этого события, создать
        ;кнопки с нужным текстом и нужно группой и добавить обработку
        ;сюда, в новую ветку оператора select
 DrawEnything()
        ;обновляем кнопку "назад", чтобы можно было возвратиться обратно.
        ;в данном случае мы возвращаемся обратно на главный экран (ведь
        ;от него мы ушли всего на один экран). Для этого достаточно обнулить
        ;или присвоить значение константы события обновления главного экрана
        ;переменной хранящей все происходящие события. При этом оператор
        ;Select сам перейдет к выполению нужно ветки.
 If UpdateButton(ButBack) Then MainEvent=MM_MAIN
;если произошло событие - нажата кнопка "опции"
        Case MM_OPTIONS
        ;обновляем кнопки принадлежащие группе (экрану) "опции"
        ;и результат записываем во временную переменную.
        ;Это нужно чтобы возвращаемое по умолчанию функцией обновления кнопкок
        ;значение нуля, не затерло значение события хранимого переменной событий.
        ;Иначе мы бы сразу возвратились на обновление главного меню, ведь нуль это
        ;как-раз таки это событие
 event=UpdateButtons(MM_OPTIONS)
        ;если промежуточная переменная не равна нулю, тоесть мы нажали на какую-то
        ;кнопку на экране "опции", то мы записываем это событие.
 If event Then
        MainEvent=event
 End If
        ;так же не забываем обновлять кнопку "назад"
 If UpdateButton(ButBack) Then MainEvent=MM_MAIN
;тут аналогично экрану "новая игра"
        Case MM_ABOUT
 DrawEnything()
 If UpdateButton(ButBack) Then MainEvent=MM_MAIN
;если происходит событие - нажата кнопка "Выход"
;вызываем оператор exit который выходит из главного цикла
;и таким образом завершается работа меню
        Case MM_QUIT
 Exit
;аналогично экрану "новая игра"
        Case MM_GRAPHS
        DrawEnything()
        If UpdateButton(ButBack) Then MainEvent=MM_OPTIONS
;тоже самое
        Case MM_SOUNDS
        DrawEnything()
        If UpdateButton(ButBack) Then MainEvent=MM_OPTIONS
;ну и тут тоже
        Case MM_CTRLS
        DrawEnything()
        If UpdateButton(ButBack) Then MainEvent=MM_OPTIONS
End Select

Flip
Wend
End

Если будет время, то накатаю про остальную работу с меню.

ZanoZa 18.01.2006 16:32

to platon:
ВЕЩЬ :super:

jimon 18.01.2006 16:38

а что собствено мешало ето самому написать ? :)

Fant 18.01.2006 17:24

Цитата:

Originally posted by jimon@Jan 18 2006, 03:38 PM
а что собствено мешало ето самому написать ? :)

Опыт, друг мой!

Буду сегодня вечером понимать и осмысливать код Платона

2Платон

Посмотрел...на вид - супер. Еще не разбирался! Но меню офигенное!

Люююди! Вы издеваетесь :)

:))
ну как переключение режимов хоть работает! Никто его так и не оценил!
Само переключение граф. режимов!!! плииз! :wallbash:

Платон 18.01.2006 18:59

Цитата:

2Платон
Посмотрел...на вид - супер. Еще не разбирался! Но меню офигенное!

Это не меню, это просто работа с кнопками. До меню там еще как до луны :)
Но это лучше чем переключать разрешение клавишами :)
А так - точно так же делаются скроллеры, переключатели и прочая хрень.
Я как-то пробывал писать меню, если найду исходник (у меня тут такой бардак что черт ногу сломит:) ) - закомментирую и на форум выложу.

Fant 18.01.2006 19:35

Понятно-понятно!
Если найдешь, но будет неплохо, если выложешь (если время будет)
А так я сам постараюсь написать! Как умею, а если ступор(или проверить) то на форум! Тут я знаю, всегда помогут кодом или одскажут так, что 100% дойдет

Так и все-таки! Как мое переключение граф. режимов!? Сам принцип работы изменения графики?
:??
боооже...ну почему никто не видит этот мой вопрос по графе! :wallbash:

правильно ли я так переключаю разрешение?

jimon 18.01.2006 22:13

fant - я же тебе подробно обяснил как работает ето
в чем проблема ?

Fant 18.01.2006 22:40

Цитата:

Originally posted by jimon@Jan 18 2006, 09:13 PM
fant - я же тебе подробно обяснил как работает ето
в чем проблема ?

Выше я уже написал код по твоему подробному объяснению! Мне нужно что бы ты сказал, правильно ли я все выполнил. Т.е. правильно ли я переключаю режимы. Вот пока и все, что я хочу услышать. А если неправильно, то как и что подправить

jimon 18.01.2006 22:58

правильно :)
но как я думаю, тебе понадобится сохранить текущии настройки ?

Fant 19.01.2006 00:25

Этим я займусь завтра может быть, но если не завтра, то 21 после экзамна 100%. Тогда и буду очень активно (будут каникулы) работать над игрой. А пока поюзаю код Платона, и интегрирую смену графики в его код+ поправлю и сделаю ремейк того кода под свой лад...а щас ночь...все...спасибо за ответ...это еще не конец обсуждений...ушел....спать

Fant 23.01.2006 01:09

У меня такая фигня

Код:


Graphics 640,480,32,1
SetBuffer BackBuffer()
Rect 0,0,800,600,1
While Not KeyHit(1)
Flip
Wend *
End

Экран страшно мерцает! Как будто экран лучевой и поставлен на частоту обновления 10Гц...

Вы не знаете почему так?

мерцания происходят только в режими полноэкранном.
раньше этого не было.
Глюк именно примерах по работе с 2D! В 3d таких мерцаний нет...странно.
А еще по завершении программы...эти мерцания как бы продолжаются на мониторе пару секунд. Потом все приходит в норму.

А еще меню пытаюсь сделать.

Но там такая фишка:
Я загружаю изображение.
Рисую

Но оно рисуется с фоном!
maskImage нужно? Не выходит...как этот фон убрать-то? Аттач с попыткой меню прилагается ...

alcoSHoLiK 23.01.2006 02:00

А по-твоему оно не должно мелькать? У тебя в BackBuffer белый квадрат на весь экран, а во FrontBuffer - черный экран. :)

Чтобы у кнопок не было фона, нужно использовать MаskImage, но для этого фон должен быть одноцветным, чего я не наблюдал у твоих кнопок.

Fant 23.01.2006 11:35

Понятно! Разобрался я с мельканиями!

Не понял только про фон! Фон у кнопок ОДНОГО цвета ведь! Никак не могу понять чего там лишнего! Я в ХареВебСайл клипал, и использовал "фон". Значит он одного цвета (я так предпологал)

А как сделать его одним цветом тогда?

alcoSHoLiK 23.01.2006 21:32

Он не одного цвета, так как при сжатии картинки (степень зависит от выбранного качества) некоторые пиксели меняют свой цвет. Чтобы фон был одного цвета, рекомендую воспользоваться Фотошопом :)

Fant 23.01.2006 22:20

Цитата:

Originally posted by alcoSHoLiK@Jan 23 2006, 08:32 PM
Он не одного цвета, так как при сжатии картинки (степень зависит от выбранного качества) некоторые пиксели меняют свой цвет. Чтобы фон был одного цвета, рекомендую воспользоваться Фотошопом :)

Менюшки я делаю в Харе! А фотошоп вообще удалил давно. Есть альтернатива? Неужели больше никак?

И еще! Вот выложил код.

Нужно нажимать:
опции->графические опции->640 на 480
и почему-то у меня ошибка! Код+все картинки прилагаются! А тот код с роботами временно стоит оставить.

Подскажите пожалуйста почему ошибка? И самое главное, как ее исправить!
И...как же мне с maskImage быть? Есть ли варианты?

pax 24.01.2006 00:04

Вот исправлена ошибка, только появился глюк: после смены графического режима все тормозит... незнаю почему...

pax 24.01.2006 00:13

понял в чем причина, надо заного ставить задний буффер

SetBuffer BackBuffer()

:lol: :lol: :lol:

Fant 25.01.2006 14:00

Мы тут с Pax помутили с менюю...и вообщем я решил, чтобы не сбивались координаты надо из каждый раз писать заново.

Но есть такая команда ImageXHandle

Оказывается, она может узнать координату по оси X 2D объекта!

Как ни странно, но координату эта программа действительно показывает!.
Теперь я придумал сделать так:

Раз уж коорднинаты сбиваются, то PAX сделал граф. мышку, и имея графическую кнопоку можно проверить их на:
ImagesCollide Example

И работает ведь! Но ведь принцип работы такой:

image1 - first image to test
x1 - image1's x location
y1 - image1's y location
frame1 - image1's frame to test (optional)

image2 - second image to test
x2 - image2's x location
y2 - image2's y location
frame2 - image2's frame to test (optional)

То есть опять надо координаты указывать. Но есть ведь ImageXHandle
и ImageYHandle, который эти координаты находит, стало быть справедливо будет написать так:

Код:

If ImagesCollide (MouseImage,MouseX(),MouseY(),0,Buttonexit, ImageXHandle(Buttonexit) ,ImageYHandle(Buttonexit),0)
Но к сожалению просто ничего не происходит.

Тогда я пошел на хитрость:
Код:

ImageXHandle(Buttonexit)=a
ImageYHandle(Buttonexit)=b
If ImagesCollide (MouseImage,MouseX(),MouseY(),0,a,b,0)

Но к сожалению вылетела ошибка:Image does not exist

Теперь я не знаю что делать! Кто может помочь с координатами?

Как сделать так, что бы какой-нибудь командой выяснить координату, указать ее в команду коллизии, и что бы потом после смены графического режима не пришлось заново прописывать координаты объекта или координаты пересечения? :'((

alcoSHoLiK 25.01.2006 20:22

Ну ты хитрюга :lol:
Код:

a=ImageXHandle(Buttonexit)
b=ImageYHandle(Buttonexit)

Я посоветовал бы не пользоваться ImageXHandle и ImageYHandle, в самом начале создать переменные, в которых хранится позиция кнопки.

Fant 11.03.2006 00:03

Насколько я знаю, меню должно быть интерактивным. То есть например когда наводишь мышьку на кнопочку в меню (код смотреть в топике про бомбера), тодолжно происходить что-нить красивое (у меня сейчас просто указатель прыгает на кнопку)
Вопрос:
Как практичнее (и может даже лучше) осуществить эту "интерактивность"?
Может сделать плавное изменение цвета? Или что-нибудь еще? Я даже не знаю! Подскажите советом! Как сделать меню красивее!?

(если у вас есть простенький код, где есть красивое меню, то буду благодарен, если с советом будет и код "в помощь"

Вообщем это и весь мой вопрос!

jimon 12.03.2006 17:14

наклепать несколько состояний одной кнопки и использовать :)

tormoz 12.03.2006 18:09

В 3д меню делай.
Работает в разы быстрей и эффекты легко реализовать.

impersonalis 12.03.2006 18:14

Ну легко будет потом, вначле - сложнее.
К тому же многие ГУИ, работающие через 3д начинают дико глючить, если в игре используются несколько камер, меняется zoom и projection mode

impersonalis 12.03.2006 18:15

А вообще - я сам жду когда PAX доделает свою спрайтовую либуЮ чтобы ГУИ замутить =)

tormoz 12.03.2006 20:37

Что за спрайтовая либа ?

impersonalis 12.03.2006 21:18

http://community.boolean.name/index.php?showtopic=752

Fant 12.03.2006 21:54

То, что можно с нарисоваными кнопочками, я то понимаю, что можно их нарисовать, и сделать даже как анимацию, но я хочу это обойти! Есть ли еще варианты?

А есть ли вариант что-нить сделать с цветом кнопок? Или их zoom ить...или что-нибьудь еще???

3D меню никак не будет потому, что уже очень много сделано в 2D, да и не представляю я как 3d реализовать!

Подскажите как можно еще разнообразить меню?

tormoz 12.03.2006 23:42

Посмотрел. Задумка неплохая, но я предпочитаю каждый раз писать все с нуля, под конкретные задачи.
А с 2д в Блитц3д делать меню нет смысла.
Тормозят имажи и очень ограничивают эффекты.
В 3д возможностей полно: цвет, прозрачность, смена текстур. повороты, скейл. Быстро. просто, эффектно.

Вот функция создания "3д имажа". Размещать перед камерой

Код:

Function CreatePlane_m(File$)
 mesh=CreateMesh()
 texture=LoadTexture ( File$,2)
 surf=CreateSurface(mesh)

 * AddVertex surf,-1,1,0,0,0:AddVertex surf,1,1,0,1,0
 * AddVertex surf,1,-1,0,1,1:AddVertex surf,-1,-1,0,0,1
       
        AddTriangle surf,0,1,2:AddTriangle surf,0,2,3
        UpdateNormals mesh
        scx#=TextureWidth (texture)
        scy#=TextureHeight (texture)
        ScaleMesh * mesh,scx/256,scy/256,1
        EntityTexture mesh,texture
        FreeTexture texture
        Return mesh
End Function

Сейчас сделал "цепляние" курсора за кнопки и потом их колыхание - прикольно ;)

Fant 13.03.2006 19:55

Взвесив все, я решил, что буду стараться делать кнопки программно! То есть не рисунками. Попробую сделать что-нить простое. Выложу в это топике простецкий пример, а потом будем дальше рассматривать...


А еще и подумав головой я решил, что пока стоит оставить все как есть, а меню дорабатывать только тогда, когда степерь завершенности игры будет 90% (без графики, разумеется)

Я прав?

jimon 16.03.2006 18:44

мне бы логику автоматов для меню надо клепать сначала ... :(

impersonalis 16.03.2006 20:03

2jimon:ничегонепонялтыбыхотябызапятыеставилиногда

jimon 16.03.2006 22:11

2impersonalis : тебебытоженепомешалобызапятыеипробелыставитьпочаще :)

alcoSHoLiK 16.03.2006 22:24

jimon
Игнорирование предупреждения админа + флуд. Доиграешься.

jimon 17.03.2006 22:26

alcoSHoLiK :
прошу тыкнуть меня в то место где сказано что я написал какуето глупость или сообщение не относяищеюся к теме
imp просто написал что мне надо ставить больше запятых ... или что то другое ?

Fant 01.05.2006 23:08

Вообщем с главным меню в игре я разобрался, но как сделать меню непосредственно в самой игре!?

то есть приостановить игру и сделать активным меню?

У меня есть код, как делать паузу

Код:

;Пауза
If KeyHit(25)
  Text 0,280,"PAUSE"
  Flip
  .pause 
 WaitKey
  If KeyHit(25)=False Goto pause
FlushKeys 
FlushMouse
EndIf
;Пауза


tormoz 02.05.2006 02:33

Создай функции:

1 загрузка меню
2 цикл меню
3 удаление меню

Дальше понятно ?

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

Fant 02.05.2006 19:04

То есть вместо паузы, сделать цикл меню - ето я понял, но тогда вопрос в том, как "остановить игру" ?

tormoz 02.05.2006 21:10

не останавливай, а выходи из цикла игры и запускай цикл меню

Fant 02.05.2006 21:50

понял! Буду пробовать!) если что - напишу сюда)

Fant 07.05.2006 11:43

Код:

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

Delay 2

Text 0,320,"Проверка"

Flip
Until enterkey

End Function

Воткнул это в код, но цикл игры как бы продолжается, то есть например если включить ИИ, нажать esc
Код:

        If KeyHit(1) fnMenuGame()
это у меня в цикле игры
ТО ии, почему-то продолжает деятельность, да и бомба взорвется, хотя визуально все "останавливается, конечно

impersonalis 07.05.2006 14:34

Вероятно все события у тебя происходят по времени - следовательно всё "просиженное" в меню время будет учтено и обработано сразу же после возврата в игру.

Fant 07.05.2006 14:51

да! Мне SBJoker предложил сделать так:

В цикле:

Код:

If KeyHit(1) Then
      fnMenuGame
      time#=MilliSecs()-period#
End If

и все остановилось)

tormoz 07.05.2006 17:57

при нажатии ескейп - ВЫХОДИ из цикла игры совсем !
а не пытайся внутри цикла меню запускать (это сделать можно - но тебе проще выйти)

Fant 07.05.2006 19:51

А как совмем выйти? Я же хочу потом еще продолжить игру...

Fant 07.05.2006 19:52

А как выйти совсем? Я же хочу еще и продолжить игру!
Это будет реально?

tormoz 07.05.2006 22:46

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

impersonalis 07.05.2006 22:50

2tormoz:
причём тут это?
Его решение - запоминать состояние времени для необходимых объектов и восстанавливать его при выходе из меню.

Fant 08.05.2006 02:12

Кстати насчет переменных это идея...может они понадобятся?
А то у меня ошибка:

Код:

Function fnMenuGame()
ButtonReturn_to_game=LoadImage ("graphics\Return_to_game.png")
        Repeat
        Cls
        mhit1= MouseHit(1)
        mhit2= MouseHit(2)
        EnterKey = KeyHit(28)

DrawImage ButtonReturn_to_game ,300,100


Delay 2

If KeyHit(1)=1
       
ClearWorld()
       
        Graphics 640,480,16,2
        SetBuffer BackBuffer()
        loadimages()
        fnmainmenu()
        End If

Flip
Until enterkey

End Function

Если из этого меню выйти в главное, а потом в игру, то дебаггер будет ругаться, что
DrawImage ButtonReturn_to_game ,300,100
Не сущесвует этого имеджа!

Хотя как видно из кода, я каждый раз при входе в функию, гружу этот имеждж...странно, да?
никто не знает, почему такой косяк? и как его исправить?

tormoz 08.05.2006 02:35

Графику инициализируй один раз !
До входа в меню:
.точка входа при смене разрешения
инит графика
. точка входа после основного цикла
лоад ресурсы меню
меню
освобождаем ресурсы меню

проверяем выход из меню:(переменную)
если игра - грузим ресурсы игры
если возврат в игру - не грузим
если выход из игры то ЕНД
если меняли разрешение в меню то ставим флаг(переменную) и гоу на начало

основной цикл
игра
выход из цикла

возврат в точку меню


=========
Для нормального завершения при повторной инициализации графики создай функцию очистки типов и переменных (которые нужно очистить)
Delete Each MyType - очищает весь тип MyType

Fant 08.05.2006 11:55

2Tormoz!

наверное ты не совсем разобрался с принципом работы:

1. Инициализирует графику 640 на 480 (работает главное меню)
2. Выбираем одни из 3х режимов, пишем их в файл.
* Если нажали начать новую игру:
1. Удалить все 2D картинки (проваерял лично! Утечек нет!)
2) ClearWorld
3)Инициализирует графику
4)Вызвать функцию, где все объекты игры грузятся (там у меня 3 функции)
5) если нажали esc - начать игровое меню (ну это вы знаете из приведенного здесь кода)
* если вышли совсем, то (2 раза esc)
ClearWorld()
Graphics 640,480,16,2
SetBuffer BackBuffer()
loadimages() - те, которые касаются главного меню
fnmainmenu() - само меню

Но почему-то после такого "полного" выхода, при входе в игру сразу же сробатывает fnMenuGame(), и ругается, что не может нарисовать этот долбанный имедж!!! Хотя по идеи он должен срабатывать по нажатии, esc, разумеется!

tormoz 08.05.2006 17:06

Делай как я написал - схема отлажена временем.

Fant 08.05.2006 21:22

Но я не совсем понял как по вашей схеме делать!?

Как я могу 1 раз инициализировать графику, если в меню она 640 на 480, а в игре - опционально!
?

pax 08.05.2006 21:56

Думаю для самой игры надо сделать новое упрощенное меню дабы не менять разрешение экрана во время игры.

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



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

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