![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
создание меню в DelphiX.
Карлсон © (2003-06-22 21:36:00)
делаю игрушку.
в ней естественно присутствует меню.
есть основной модуль игры.
есть модуль где происходит создание и обработка меню.
вот код из 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 все равно та же фигня.
очень хочу понять, почему так происходит!
у кого какие предложения?
хм (2003-06-25 09:19:00) [1]
А я еще не ложился :). Вообще без конкретного кода малость хреново отлаживать :). Ты попробуй создать новый проект с одним меню и посмотреть, будет ли работать.
Карлсон (2003-06-25 09:07:00) [2]
блин, не проснулся я еще :(
rect тот что нужен, мыша находится в нем.
и всеравно глухо.
Карлсон (2003-06-25 09:02:00) [3]
мыша показывает правильное положение.
а вот TextOut(trunc(x-200),trunc(y),Format("%d %d %d %d",[BoundsRect.Left,BoundsRect.Top,BoundsRect.Right,BoundsRect.Bottom])); показывает такое заоблачное число, что просто страх %\
хм (2003-06-25 01:15:00) [4]
>я особо не вчитывался, чем 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 00:24:00) [5]
я особо не вчитывался, чем DelphiX от UnDelphiX отличается, может там что-то по разному работает.
просто знаю, что UnDelphiX более новый, чем просто DelphiX.
если делать так, как у тебя, то получается, что при наведении курсора на menuItm1 картинка не меняется, при наведении на menuItm2 картинка меняется у menuItm1.
к чему бы это? :)
ну я попробую еще покапаться, может чего и получится.
и кстати почему "это не ООП"?
чего я там напортачил такого?
warning"и - это я знаю.
а еще чаво?
и кстати почему у тебя везде Items[0]?
просто так или специально?
хм (2003-06-24 22:11:00) [6]
кинь проект мне на мыло
>и я ваще-то на UnDelphiX делаю :)))
What does it mean?
Карлсон (2003-06-24 11:49:00) [7]
гм...
теперь ваще нихрена не работает. :(
у тебя какая версия дельфи?
и я ваще-то на UnDelphiX делаю :)))
гы...
хм (2003-06-24 04:12:00) [8]
Я код немного :) подредактировал. 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-23 21:13:00) [9]
ага, никто не знает.
ну тогда хотя бы если кому-нить времени не жалко, создайте проект с таким вот меню и скажите, получилось или нет. :(
Карлсон (2003-06-23 16:48:00) [10]
в смысле?
почему TMenuItem = class(TImageSprite) а не просто TImageSprite что ли?
если да, то потому что удобнее.
по крайней мере мне.
dimodim (2003-06-23 13:52:00) [11]
ХМ, почему Tmenu Item , а не собств. класс?