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 18.09.2005 23:10

Вот код меню:
Код:

Function knopka(x1,x2,y1,y2,vImage);nujno v opredelenii funktsii sozdat' peremennuyu dlya kartinki
If MouseX()>x1 And MouseX()<x2 And MouseY()>y1 And MouseY()<y2 Then
DrawImage vImage,x1,y1
Return True
EndIf
End Function

Function DrawMenu(n)
DrawImage mainpict,0,0

DrawImage newg,450,300
DrawImage options,450,340
DrawImage quit,450,380

If n=1 Then
If knopka(450,590,300,330,newg2)=True Then
If MouseDown(1) Then
poloz=1

newgAlt=True;nuzhno po-drugomu nazvat' peremennuyu, potomuchto v "newg" u tebya uzhe est' kartinka
EndIf
EndIf

Если здесь не хватает какой-то части кода для понимания можете посмотреть здесь - www.forcing.nm.ru в разделе статьи

Так вот, нужно, чтобы при нажатии кнопки загрузался блицовский файл с самой игрой

SubZer0 18.09.2005 23:22

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

jimon 18.09.2005 23:32

Код:

Function knopka(x1,x2,y1,y2,vImage);nujno v opredelenii funktsii sozdat' peremennuyu dlya kartinki
If MouseX()>x1 And MouseX()<x2 And MouseY()>y1 And MouseY()<y2 Then
DrawImage vImage,x1,y1
..........................................
вот здесь грузи че хочеш и как хочеш
..........................................
Return True
EndIf
End Function


ps. :))

SubZer0 18.09.2005 23:38

Цитата:

Originally posted by jimon@Sep 18 2005, 09:32 PM
Код:

Function knopka(x1,x2,y1,y2,vImage);nujno v opredelenii funktsii sozdat' peremennuyu dlya kartinki
If MouseX()>x1 And MouseX()<x2 And MouseY()>y1 And MouseY()<y2 Then
DrawImage vImage,x1,y1
..........................................
вот здесь грузи че хочеш и как хочеш
..........................................
Return True
EndIf
End Function


ps. :))

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

и по поводу твоего примера. а зачем по твоему функция knopka возвращает true в случае нажатия?? тогда стоило сделать вызов процедуры и проверять если она вернула true то грузить... :)

Dizels 19.09.2005 13:41

Цитата:

Originally posted by jimon@Sep 18 2005, 09:32 PM
Код:

Function knopka(x1,x2,y1,y2,vImage);nujno v opredelenii funktsii sozdat' peremennuyu dlya kartinki
If MouseX()>x1 And MouseX()<x2 And MouseY()>y1 And MouseY()<y2 Then
DrawImage vImage,x1,y1
..........................................
вот здесь грузи че хочеш и как хочеш
..........................................
Return True
EndIf
End Function


ps. :))

Где грузить - я знаю, а вот как грузить?
Теперь отвечу на вопрос SubZer0: грузить надо файл *.bb а потом я уже сделаю отдельный файл для компиляции(по этому вопросу я вас потом еще помучаю) ;)

SubZer0 19.09.2005 14:59

Цитата:

Originally posted by Dizels@Sep 19 2005, 11:41 AM
грузить надо файл *.bb а потом я уже сделаю отдельный файл для компиляции(по этому вопросу я вас потом еще помучаю) ;)
заранее хочу извиниться, поскольку знаю, что человек обижается если ему не даешь то, что он хочет...

а теперь ответ: такой процесс практически невозможен, такой команды нет... можно только если написать свой компилятор...

поподробнее:

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

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

можно подгружать уже готовые EXE, которые уже проверены и откомпилены, НО это будет супер-нерациональный метод, потому, что компилятор Блиц кладет в каждый екзешник основные функции обращения к DirectX и если мы будем подгружать готовый екзешник, то получится что у нас в первом екзешнике эти функции есть и в том который подгружаем тоже есть, а они нам нужны два раза??.. получается нерациональное использование оперативной памяти...

еще раз извиняюсь, обычно мы не отвечаем отрицательно на поставленные вопросы, но в этом случае я не вижу другого решения :sorry: :sorry:

jimon 19.09.2005 23:11

я чет торможу ?!
ето зачем тебе подгружать bb файлы ?
ты хоть представляеш что будет за фича ?!

file aa.bb : "
function error()
runtimeerror ":/"
end function
"

main file : "
if ..=.. then
include "aa.bb"
end if
"

и смотрим как ето превратится после прекомпиляции : "
if ..=.. then
function error()
runtimeerror ":/"
end function
end if
"

так как в нашем случае include окажется внутри функции то получится что функция окажется внутри другой функции и произойдет error :o

просто грузи все bb файлы вначале основного и будет все :ok:

ps. :))

Dizels 19.09.2005 23:48

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

impersonalis 19.09.2005 23:56

Выложи конкретно свои файлы в одном аттаче, пл3 - гляну

jimon 20.09.2005 08:45

мдя...

у тебя в файле menu.bb есть вот такой код :
Код:

function menu()
....
end function

и что же тебе мешает перенести ету функцию в другой файл и ее там юзать ?

SubZer0 20.09.2005 14:12

2 Dizels

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

Жека 20.09.2005 15:33

(Только теория)

Чтобы проще было работать с меню и прочим, делаешь глобальную переменную состояния игры, типа flagGameStatus. Уже есть? - Отлично.
Вводишь для себя условности относительно этой переменной, например:
если flagGameStatus равен 0 - выход из проги, 1 - главное меню, 2 - игра, 3 - игровое меню, вобщем ясно уже...

Когда твоя функция knopka вернула ИСТИНУ, ты меняешь значение этой переменной.
По значению переменной определяешь что нужно делать (выйти, рисовать меню, крутить игровой цикл и прочее)

Пример:
Запустил свою игру - flagGameStatus = 1 - меню рисуешь
Нажал кнопку Новая игра
{
flagGameStatus = 2
также грузишь первый (или другой) уровень игры, т.е. все что к нему относится
}

В главном цикле проверяешь значение flagGameStatus через IF или SELECT/CASE и делаешь соответствующие полученному значению действия...

Dizels 21.09.2005 13:27

Вложений: 2
Вот мои наработки так сказать.

Dizels 21.09.2005 16:06

И по ходу дела сразу же еще один вопрос, что нужно поменять в моем коде, чтобы игра быстрее грузилась?А то по моему мнению - она долго грузиться - секунд 10, при том, что у меня оперативы - 1ГБ

SubZer0 21.09.2005 16:49

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

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

Dizels 09.11.2005 12:53

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

jimon 09.11.2005 15:07

а ты просто скачай обновление до 1.90 или ОБНОВЛЕНИЕ до 1.87
если надо могу выложить обновление до 1.87 :)

ps. оно занимает около 2 мб

Dizels 09.11.2005 19:23

А можно сразу с моей версии обновить до 1.90?Или надо сначало 1.87 установить?

jimon 09.11.2005 22:38

поидее можно


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

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