Форум: "Игры";
Текущий архив: 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, то все работает как надо.
я не понимаю в чем прикол.
и еще.
если при инициализации поверхности менять строки с созданием третьего и четвертого пункта местами, то третий оказавшись последним не будет работать.
т.е. делая вот так:
не меняется AnimPos у menuItm3.
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;
если создавать меню в 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.01 c