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

Dizels 21.09.2005 17:08

А можете вставить свои - мои на данном этапе много весят, и поэтому передать их проблематично!Вставьте любые другие модели, я думаю у Вас много различных заготовок

SubZer0 21.09.2005 20:32

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

код главного меню:
Код:

; делаем файл первой игры как функцию
; ПРИМЕЧАНИЕ: в файле game1.bb должна отсутствовать команда END,
; иначе мы не сможем вернуться в главное меню
function game1()
 include "game1.bb"
end Function

; делаем файл второй игры как функцию
; ПРИМЕЧАНИЕ: в файле game2.bb должна отсутствовать команда END,
; иначе мы не сможем вернуться в главное меню
function game2()
 Include "game2.bb"
End Function
 
; теперь функция меню
Function mainmenu%()

 определяем граф.режим и выставляем буфер
 graphics3d 800,600,32,2
 setbuffer BackBuffer()

; загружаем и устанавливаем шрифт
 font=LoadFont("Arial",20,True,False,False)
 SetFont font
 
; цикл меню
Repeat
 
; проверяем если мышка внутри первого пункта
 If MouseX()>250 And MouseY()>100 And MouseX()<550 And MouseY()<150
; изменяем его цвет
  Color 100,255,100
; а если еще и кнопка нажата, то запускаем игру1
  If MouseDown(1)
  game1():return 1:exit
; выходим из функции меню вернув положительное значение
 EndIf
 Else
 Color 255,100,100
 EndIf
; рисуем сам квадрат первого пункта меню
 Rect 250,100,300,50,1


; точно так-же для второго пункта меню       
 If MouseX()>250 And MouseY()>250 And MouseX()<550 And MouseY()<300
 Color 100,255,100
 If MouseDown(1)
  game2():return 1:exit
 EndIf
 Else
 Color 255,100,100
 EndIf
       
 Rect 250,250,300,50,1

; и так-же для третьего пункта
 If MouseX()>250 And MouseY()>400 And MouseX()<550 And MouseY()<450
 If MouseDown(1)
; только тут нам ничего запускать не нужно, нужно только вернуть ложь
  return 0:exit
 EndIf
 Color 100,255,100
 Else
 Color 255,100,100
 EndIf

 Rect 250,400,300,50,1

; выводим надписи меню на экран
 Color 255,255,255
 Text 350,117,"First game"
 Text 342,267,"Second game"
 Text 385,417,"Exit"
       
; еще если нажата ESC, то возвращаем ложь и выходим       
 If KeyHit(1) Then Return 0:exit
 
 Flip
 
Forever
 
end function


; теперь главный цикл программы,
; запускаем меню пока оно не возвратит ложь, как только ложь, так сразу END
while mainmenu()
wend

end

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

надеюсь, что тебе это поможет в твоей проблеме :) :)

Dizels 21.09.2005 23:52

Большое спасибо, я вроде разобрался :)

impersonalis 22.09.2005 00:23

Код:

game1():return 1:exit
Ну exit после return писать совсем не нужно.

Dizels 13.10.2005 14:48

Это опять я :@
Собрался наконец, сделать альфа-версию так сказать, а для этого мне надо все скомпоновать в один файл, теоретически я все понял, что нужно сделать(Ваши объяснения на 2х страницах не прошли даром :glag: ;) ), а вот на практике опять проблемы, я прописываю, чтобы подгружалась игра,вроде все нормально, но как только запускаю - выводит ошибку, что мол в файле который я подгружаю находяться глобальные переменные и функции, так вот вопрос, как их объявить в "главном файле" и где именно?
И еще один вопрос, мне надо, чтобы воспроизводился файл:intro.mpg как правильно об этом сказать Блитцу? :))

SubZer0 13.10.2005 18:30

на счет видео (цитата из старого форума):
Цитата:

Видео проигрывается следующим обрзом:

Код:

;устанавливаем графический режим и выставляем текущим невидимый банк памяти
Graphics 640,480
SetBuffer BackBuffer()

;грузим наш фильм (путь ессно можно указать и без диска)
movie=OpenMovie("1.avi")

;запускаем цикл до нажатия ESC
Repeat

;выводим очередной кадр нашего видео
DrawMovie movie,100,100,MovieWidth(movie),MovieHeight(movie)

;переключаем банки видеопамяти, чтоб увидеть что туда нарисовала DrawMovie
Flip

Until KeyHit(1)

;закрываем видео
CloseMovie (movie)

;конец программы
end

некоторые замечания:

В функцию DrawMovie передаются пять параметров:
1. Идентификатор фильма (возвращается функцией OpenMovie)
2. X Координата левого верхнего угла просматриваемого видео
3. Y Координата левого верхнего угла просматриваемого видео
4. Ширина видео, можно установить в ручную тогда оно будет сжато или растянуто или-же можно использовать функцию MovieWidth для определения ширины видео.
5. Высота видео, точно так-же как и в ширине только функция соответственно по другому называется MovieHeight

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

надеюсь тебе поможет...

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

axel186 13.10.2005 20:42

ТО Dizels

посмотрел скиношты на вашем сайте форсинг, понравилось, давай скорее альфу выкладывай!!! :))

Dizels 13.10.2005 23:38

To SubZer0: написал письмо на e-mail, надеюсь ответишь.
To axel186: спасибо за проявленный интерес!Скоро должен буду выложить!

SubZer0 15.10.2005 04:18

Цитата:

Originally posted by Dizels@Oct 13 2005, 09:38 PM
To SubZer0: написал письмо на e-mail.....
Да, получил я письмо... посидел... посмотрел... подумал...
тут надо наверное весь код переписывать...

тут нужно соблюдать несколько правил:

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

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

3. Команда Graphics3D очищает мир полностью, удаляет все загруженные объекты и картинки (текстуры)...

:)

Dizels 08.11.2005 11:53

ОК, с меню я вроде разобрался, спасибо, а вот с проигрыванием заставки - проблемы - пишет Function not found в строке:
movie=OpenMovie("1.mpeg")
Что делать?

impersonalis 08.11.2005 18:50

Цитата:

Originally posted by Dizels@Nov 8 2005, 10:53 AM
ОК, с меню я вроде разобрался, спасибо, а вот с проигрыванием заставки - проблемы - пишет Function not found в строке:
movie=OpenMovie("1.mpeg")
Что делать?

Возможно ( вероятно даже) у тебя старая версия Blitz.

jimon 08.11.2005 19:18

или блиц иногда так лагает - перезапусти камп
или лагает visual ide - переделай файл комманд :)
или protean тоже так лагет

Dizels 08.11.2005 21:25

IDE V1.66 - Linker V1.64 - Runtime V1.66

C нее можно запустить?У меня другой нет!но вроде и эта не плохо работает и меня пока устраивает, есть еще обновлениее до 1,88 но оно после переустановки системы не хочет запускаться, ошибку выбает :(

impersonalis 08.11.2005 22:08

Цитата:

Originally posted by Dizels@Nov 8 2005, 08:25 PM
IDE V1.66 - Linker V1.64 - Runtime V1.66

C нее можно запустить?У меня другой нет!но вроде и эта не плохо работает и меня пока устраивает, есть еще обновлениее до 1,88 но оно после переустановки системы не хочет запускаться, ошибку выбает :(

ОГО :o
вот это антиквариат. Обновляй.
Что интересно - хелп новый, а компилер старый, обычно, встречал наоборот.

alcosholik 08.11.2005 22:34

Тут новая версия:
http://community.boolean.name/index.php?showtopic=149


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

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