Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Вниз

создание меню в DelphiX.   Найти похожие ветки 

 
Карлсон   (2003-06-22 21:36) [0]

делаю игрушку.
в ней естественно присутствует меню.
есть основной модуль игры.
есть модуль где происходит создание и обработка меню.
вот код из menu.pas:
type
TMenuItem = class(TImageSprite)
public
constructor Create(AParent: TSprite; Picture: TPictureCollectionItem; SprX, SprY: double);
protected
procedure DoDraw; override;
end;
...
var
menuItm1: TMenuItem;
menuItm2: TMenuItem;
menuItm3: TMenuItem;
menuItm4: TMenuItem;
...
constructor TMenuItem.Create(AParent: TSprite; Picture: TPictureCollectionItem; SprX, SprY: double);
begin
inherited Create(AParent);
Image:=Picture;
width:=image.width;
height:=image.height;
x:=SprX;
y:=SprY;
z:=100;
AnimStart:=0;
AnimCount:=1;
AnimLooped:=False;
AnimSpeed:=0;
end;

procedure TMenuItem.DoDraw;
begin
inherited DoDraw;
if PtInRect(menuItm1.BoundsRect,Mouse.CursorPos)=True then
menuItm1.AnimPos:=1 else menuItm1.AnimPos:=0;
if PtInRect(menuItm2.BoundsRect,Mouse.CursorPos)=True then
menuItm2.AnimPos:=1 else menuItm2.AnimPos:=0;
if PtInRect(menuItm3.BoundsRect,Mouse.CursorPos)=True then
menuItm3.AnimPos:=1 else menuItm3.AnimPos:=0;
if PtInRect(menuItm4.BoundsRect,Mouse.CursorPos)=True then
menuItm4.AnimPos:=1 else menuItm4.AnimPos:=0;
end;

вот как я создаю меню:

procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
menuItm1:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("newgame"), Screen.Width div 2-150 div 2, Screen.Height div 2 - 30*4);
menuItm2:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("options"), Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*3);
menuItm3:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("titri"), Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*2);
menuItm4:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("exit"), Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*1);
end;

если наводить курсор на первые три пункта, то все работает нормально.
когда навожу на четвертый - AnimPos не меняется. Хотя если туда вставить простой ShowMessage("work"), то при наведении курсора на пункт этот мессадж появляется.
если вместо DoDraw пользоваться DoMove, то все работает как надо.
я не понимаю в чем прикол.
и еще.
если при инициализации поверхности менять строки с созданием третьего и четвертого пункта местами, то третий оказавшись последним не будет работать.
т.е. делая вот так:

procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
menuItm1:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("newgame"), Screen.Width div 2-150 div 2, Screen.Height div 2 - 30*4);
menuItm2:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("options"), Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*3);
menuItm4:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("exit"), Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*1);
menuItm3:=TMenuItem.Create(DXSpriteEngine1.Engine, Form1.MenuPix.Items.Find("titri"), Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*2);
end;
не меняется AnimPos у menuItm3.
если создавать меню в FormCreate все равно та же фигня.
очень хочу понять, почему так происходит!
у кого какие предложения?


 
dimodim   (2003-06-23 13:52) [1]

ХМ, почему Tmenu Item , а не собств. класс?


 
Карлсон   (2003-06-23 16:48) [2]

в смысле?
почему TMenuItem = class(TImageSprite) а не просто TImageSprite что ли?
если да, то потому что удобнее.
по крайней мере мне.


 
Карлсон   (2003-06-23 21:13) [3]

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


 
хм   (2003-06-24 04:12) [4]

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

TMenuItem = class(TImageSprite)
public
constructor CreatePar(AParent: TSprite; Picture: TPictureCollectionItem; SprX, SprY: double);
protected
procedure DoDraw; override;
end;

//CreatePar - Избавляемся от варнинга
constructor TMenuItem.CreatePar(AParent: TSprite; Picture: TPictureCollectionItem; SprX, SprY: double);
begin
inherited Create(AParent);
Image:=Picture;
width:=image.width;
height:=image.height;
x:=SprX;
y :=SprY;
z:=100;
AnimStart:=0;
AnimCount:=1;
AnimLooped:=False;
AnimSpeed:=0;
end;

procedure TMenuItem.DoDraw;
begin
inherited;
//То, что было у тебя - не ООП
if PtInRect( self.BoundsRect,Mouse.CursorPos)=True then
AnimPos:=1 else AnimPos:=0;
end;

procedure TForm1.DXDraw1Initialize(Sender: TObject);
begin
menuItm1:=TMenuItem.CreatePar(DXSpriteEngine1.Engine, MenuPix.Items[0], Screen.Width div 2-150 div 2, Screen.Height div 2 - 30*4);
menuItm2:=TMenuItem.CreatePar(DXSpriteEngine1.Engine, MenuPix.Items[0], Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*3);
menuItm4:=TMenuItem.CreatePar(DXSpriteEngine1.Engine, MenuPix.Items[0], Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*1);
menuItm3:=TMenuItem.CreatePar(DXSpriteEngine1.Engine, MenuPix.Items[0], Screen.Width div 2-150 div 2,Screen.Height div 2 - 30*2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
WindowState:=wsMaximized;
end;




 
Карлсон   (2003-06-24 11:49) [5]

гм...
теперь ваще нихрена не работает. :(
у тебя какая версия дельфи?
и я ваще-то на UnDelphiX делаю :)))
гы...


 
хм   (2003-06-24 22:11) [6]

кинь проект мне на мыло

>и я ваще-то на UnDelphiX делаю :)))
What does it mean?


 
Карлсон   (2003-06-25 00:24) [7]

я особо не вчитывался, чем DelphiX от UnDelphiX отличается, может там что-то по разному работает.
просто знаю, что UnDelphiX более новый, чем просто DelphiX.
если делать так, как у тебя, то получается, что при наведении курсора на menuItm1 картинка не меняется, при наведении на menuItm2 картинка меняется у menuItm1.
к чему бы это? :)
ну я попробую еще покапаться, может чего и получится.
и кстати почему "это не ООП"?
чего я там напортачил такого?
warning"и - это я знаю.
а еще чаво?
и кстати почему у тебя везде Items[0]?
просто так или специально?


 
хм   (2003-06-25 01:15) [8]

>я особо не вчитывался, чем DelphiX от UnDelphiX отличается, может там что-то по разному работает.
>просто знаю, что UnDelphiX более новый, чем просто DelphiX.
Хз
>если делать так, как у тебя, то получается, что при наведении курсора на menuItm1 картинка не меняется, при наведении на menuItm2 картинка меняется у menuItm1.
>к чему бы это? :)
Неправильно указаны координаты?
Напиши так:

procedure TMenuItem.DoDraw;
begin
inherited;
//То, что было у тебя - не ООП
if PtInRect(BoundsRect,Mouse.CursorPos)=True then
AnimPos:=1 else AnimPos:=0;
with form1.dxdraw1.surface.canvas do
begin

TextOut(trunc(x-200),trunc(y),Format("%d %d %d %d",[BoundsRect.Left,BoundsRect.Top,BoundsRect.Right,BoundsRect.Bottom]));
TextOut(trunc(x-50),trunc(y),Format("%d %d",[Mouse.CursorPos.X,Mouse.CursorPos.Y]));
Release;
end;
end;

И сравни вручную цифры, действительно point in rect или нет. Если нет - то Mouse.CursorPos возвращает что-то не то :).

>и кстати почему "это не ООП"?
>чего я там напортачил такого?
Потому что объект должен обрабатывать сам себя, а не проверять является ли он переменной XXX,YYY или ZZZ. Это лишнее. Он ведь и так знает, что он self :)
В твоем случае будет шестнадцать проверок if(по четыре проверки на четыре метода MenuItm1.DoDraw, MenuItm2.DoDraw etc.), а в моем - четыре проверки.
>warning"и - это я знаю.
Дык! Варнинг он же не просто так. Если компилируется, значит можно забить;)? Ты прячешь виртуальный метод, и вызовы MenuItem.Create и (MenuItem as TImageSprite).Create будут разными. Нехорошо это.
>и кстати почему у тебя везде Items[0]?
Dобалять кучу текстур было лень :).


 
Карлсон   (2003-06-25 09:02) [9]

мыша показывает правильное положение.
а вот TextOut(trunc(x-200),trunc(y),Format("%d %d %d %d",[BoundsRect.Left,BoundsRect.Top,BoundsRect.Right,BoundsRect.Bottom])); показывает такое заоблачное число, что просто страх %\


 
Карлсон   (2003-06-25 09:07) [10]

блин, не проснулся я еще :(
rect тот что нужен, мыша находится в нем.
и всеравно глухо.


 
хм   (2003-06-25 09:19) [11]

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



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.021 c
1-25294
Ломброзо
2003-12-23 00:15
2004.01.09
Как избавиться от сообщения при закрытии Exe-Com-Сервера...


6-25471
lesha
2003-11-11 04:10
2004.01.09
Socket


14-25574
BlackTiger
2003-12-16 21:23
2004.01.09
ЛЮДИ!!! Помогите срочно с клавиатурой!


14-25534
Onyx
2003-12-19 11:04
2004.01.09
Win2k


8-25454
Virus
2003-09-09 11:00
2004.01.09
смена фона рабочего стола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский