Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Ігри";
Поточний архів: 2004.12.12;
Завантажити: [xml.tar.bz2];

Вниз

Чи не забагато про Sprite, підкажіть. Знайти схожі гілки


MonoLife   (2004-08-08 06:56) [0]

Привіт всім професіоналам і аматорам Delphi!
Купив, мало не на останні гроші, Інтернет-карту.
І, звичайно ж, в першу чергу - на форум.
Відрадно бачити, що форум живіший за всіх живих. Судячи з питань,
задаються на форумі, участь беруть як профі, так і
новачки в справі розробок додатків, ігор та ін. прогр. в середовищі Delphi.
І також, радує те, що НЕ ВСІ умільці відповідають на питання
новачків і "не зовсім умільців" однією відповіддю: "У Вас проблеми з
ДНК "... А причини, на перший погляд," дурних питань "- нестача
інформації (в місті, де "ми" живемо, немає потрібної літератури, Інтернет
монополізований і доріг до чортиків, час-гроші в мережі
тікають зі швидкістю звуку), ну і, у вигляді зовсім запущених
випадків, ДНК теж. Ось і зараз, перш, ніж написати на форум,
для економії, я змушений спершу набрати цей текст в Note ...
Хай вибачать мене за віднімає час гості та господарі форуму.
Хочеться встигнути спробувати в Delphi якщо не все, то багато що.
Ось і зараз, намагаюся сфабрикувати що-небудь, схоже на 2-мірну
іграшку, використовуючи DelphiX. Хай вибачать мене прихильники чистого
DirectXа і API.
Вибачте, затягнув вступ. Виправте мене, якщо я не правий. Подчерпивая
інформацію в т.ч. з форуму:
я розумію дію Sprite (ів) та SpriteEngine - це отрисовка на екрані
заданої картинки. Тобто, Sprite не є об'єктом на формі як,
наприклад, кнопка (TButton) або панель (TPanel), а тільки промальована
картинка? А значить, у Sprite немає власних процедур, типу MouseDown,
MouseMove і т.д. Так, їх немає в DXSprite.pas. Вони є у DXDraw ...
Відбувається все це при порівнянні Rect картинки і позиції курсора миші з
допомогою якої-небудь функції або перевірки BoudsRect самого Sprite.
Але в моїй майбутній програмі створюється масив з TImageSprite (ів),
наприклад, з 50 елементів, і після промальовування, Sprites розташовуються Random (ом)
на поверхні і з Z-координатою, наприклад, від -2 до 2. Ось тут і
я зіткнувся з проблемою, як "зачепити" мишкою верхній спрайт?
Адже все, що знаходяться під низом спрайт, теж "повідомляють" про збіг
Rect з курсором миші. А при перевірці масиву при натисканні "миші", наприклад,
від 0 до 49, "зачепиться» не верхній спрайт (з максимальною Z-координатою),
а перший (останній, якщо downto) в списку масиву. Намагаюся вирішити цю
проблему кілька днів, але тільки більше заплутався і поламав розпочате.
Видно, не вистачає мені знань, і, найстрашніше -
логіки, для вирішення поставленого завдання. Чому я і звертаюся до форуму.
Чи є рішення в подібному випадку? Або доведеться "писати" власні компоненти, в чому, я боюся, не мастак.
Дякую за терпіння при прочитанні даного опусу.



MonoLife   (2004-08-08 12:30) [1]

ЗИ: Якщо на моє запитання відповіді не існує,
або "довго пояснювати", то хоч підкажіть тоді,
чи можна повністю позбутися від мерехтіння
TImage, при переміщенні по формі?

Спасибі.



Kruel   (2004-08-08 14:19) [2]

А що складного. Перебирай сам в циклі всі спрайт, і той у якого Z більше (і при цьому мишка в нього потрапила), той і буде верхнім ..
А щодо переміщення TImage забудь. Це компонент не для цього. Малюй на Canvas форми.



MonoLife   (2004-08-08 15:46) [3]

<Перебирай сам в циклі всі спрайт, і той у якого Z більше (і при цьому мишка в нього потрапила), той і буде верхнім .. >>

Я намагався так зробити, але, мабуть, і справді з логікою не всі впорядке. Заплутався. Тим більше, що іноді Z-координата збігається



aprm   (2004-08-08 17:39) [4]


> ЗИ: Якщо на моє запитання відповіді не існує,
> Або "довго пояснювати", то хоч підкажіть тоді,
> Чи можна повністю позбутися від мерехтіння
> TImage, при переміщенні по формі?


Взагалі-то так не роблять, але якщо дуже хочеться, можна timage засунути в Tpanel, встановити TPanel.fullrepaint: = false; і тягати вже за панель. Мерехтіти НЕ буде



Servelat ©   (2004-08-08 21:56) [5]

По-перше, якщо у спрайту немає прозорих шматків (тобто у картинки Transparent = False), то це даром: DXSpriteEngine.Engine.GetSpriteAt (X, Y), поверне тобі потрібний спрайт, і роби з ним що хочеш.
Коли є прозорі ділянки - складніше, я поколупався (робити нєфіг було :)) і написав прімерчік, там враховуються прозорі області. Правда, там я не розглядав варіанти, коли Z однакові, якщо тобі охота - поколупатися, я впевнений, що зробити можна. Але я міркував так: Z може приймати значення від
-2147483648 до 2147483647.
Відповідно при названому тобою кількості в 50 спрайтів, проблеми в тому, щоб у кожного спрайту був свій Z, немає ніякої.
Так що не парся і зроби Z не від -2 до 2, а від -20000 до 20000, і ймовірність збігу Z практично ніяка.
Так, мій прімерчік мона взяти тут:
http://pavel-k.fromru.com/Sample.zip
Підказка: там лівою кнопкою миші можна тягати спрайт (в цьому весь сенс прикладу).



MonoLife   (2004-08-09 03:04) [6]

arm >>
Обов'язково спробую, дякую.
Servelat >>
Дякуємо. Я вже думав, зовсім нічого немає з цього питання.
Все випробують і повідомлю.



MonoLife   (2004-08-09 04:09) [7]

Servelat >>>
Спасибі, я переглянув і випробував твій
код - просто і зі смаком! Виявилося все простіше, ніж я думав.
"Перевірка бульбашкою" - ось чого я не зміг зробити.
Підозрюю, що це найпростіший хід, який зобов'язаний
знати початківець кодер. Ну, і звичайно, по більше розкид по Z,
це треба було мені зробити в першу чергу.
Проте, під час перевірки роботи програми, з
6 завантажень (51 спрайт) у 2 спрайтів 2 рази з 6, збіглися
Z-координати. Можна додати розкид, але я думаю, це не
істотно, розкид, все одно виходить великий.



Megabyte-CeerCop ©   (2004-08-09 06:30) [8]

Привласнюй по рандів тільки координати. А Z усе своєю чергою від 0 до 50. Повір цього буде достатньо для того щоб комбінації не виглядали повторюваними. Тоді перевіряючи спрайт з кінця (від 50 до 0) ти обов'язково в першу чергу натрапиш на самий верхній.
А ще можна взагалі всім привласнити Z: = 0; Ефект буде той же.



MonoLife   (2004-08-09 08:31) [9]

>> Ефект буде той же >> [8]
Той, та не той же. Дивлячись для яких цілей. Причина в тому, що при створенні спрайтів, наприклад, від 0 до 50, "більший" спрайт
буде перекривати менший. І в купі різних спрайтів їх
можна спокійно "дізнатися". До чого веду? Наприклад, для створення
pazzle. Але все одно спасибі.



MonoLife   (2004-08-09 08:32) [10]

>>>
Використовуючи не прозорі спрайт і
функцію DXSprite.Engine.GetSpriteAt (X, Y),
спасибі Servelat (у), у мене ось що вийшло:
// * - * - * - * - * - * - * - * - * - * - * - dpr:
program MovSprite;

{Thank you for help SERVELAT}

використовує
Forms,
SPMovi in ​​"SPMovi.pas" {Form1};

{$ R * .res}

починати
Application.Initialize;
Application.CreateForm (TForm1, Form1);
Application.Run;
end.

// * - * - * - * - * - * - * - * - * - pas:
unit SPMovi;

інтерфейс

використовує
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXSprite, DXDraws, DXClass;
тип
TMyPict = class (TImageSprite)
OX: double;
OY: double;
OZ: integer;
Lindex: Shortint;
end;

тип
TForm1 = class (TForm)
DXDraw: TDXDraw;
ILfr: TDXImageList;
SEngi: TDXSpriteEngine;
DXTimer1: TDXTimer;
procedure FormCreate (Sender: TObject);
procedure DXTimer1Timer (Sender: TObject; LagCount: Integer);
procedure DXDrawMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DXDrawMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DXDrawMouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{Private declarations}
nW, nH: Shortint;
public
{Public declarations}

end;

було
Form1: TForm1;
md: boolean;
SpCount: Shortint;
LindZ: integer;
MoviSpr: TImageSprite;

реалізація
{$ R * .dfm}

procedure TForm1.FormCreate (Sender: TObject);
var i: integer;
починати
DXDraw.Align: = alClient;
md: = false;
SpCount: = 49;
LindZ: = 0;
randomize;
SEngi.Engine.X: = 0;
SEngi.Engine.Y: = 0;
for i: = 0 to SpCount-1 do
With TMyPict.Create (SEngi.Engine) do
begin
Image: = ILfr.Items.Find ( "nam");
Image.Transparent: = False;
Width: = Image.Width;
Height: = Image.Height;
X: = Random (DXDraw.Width-Width);
Y: = Random (DXDraw.Height-Height);
Z: = Random (500) -25;
OZ: = Z;
Lindex: = i;
end;
nW: = SEngi.Engine.Items [0] .Width div 2;
nH: = SEngi.Engine.Items [0] .Height div 2;
MoviSpr: = nil;
end;

procedure TForm1.DXTimer1Timer (Sender: TObject; LagCount: Integer);
починати
if not DXDraw.CanDraw then exit;
DXDraw.Surface.Fill (0);
SEngi.Move (0);
SEngi.Draw;
with DXDraw.Surface.Canvas do
begin
if md then
begin
TextOut (1,20, IntToStr (LindZ));
TextOut (1,1, IntToStr ((MoviSpr as TMyPict) .Lindex));
end;
Release;
end;
DXDraw.Flip;
end;

procedure TForm1.DXDrawMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
було
i: integer;
P: TPoint;
починати
if Button <> mbLeft then exit;
p: = point (X, Y);
for i: = 0 to SpCount-1 do
begin
if PtInRect (SEngi.Engine.Items [i] .BoundsRect, P) then
begin
md: = true;
MoviSpr: = (SEngi.Engine.GetSpriteAt (X, Y) as TMyPict);
LindZ: = (MoviSpr as TMyPict) .OZ;
(MoviSpr as TMyPict) .Z: = 600;
break
end;
Application.ProcessMessages;
end;
end;

procedure TForm1.DXDrawMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
починати
if md then
begin
md: = false;
(MoviSpr as TMyPict) .Z: = (MoviSpr as TMyPict) .OZ;
MoviSpr: = nil;
end;
end;

procedure TForm1.DXDrawMouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);
починати
if MoviSpr = nil then exit;
MoviSpr.X: = X-nW;
MoviSpr.Y: = Y-nH;
end;

end.

Напевно, не можна в такому вигляді на форум виставляти?
Велике занадто повідомлення?



ASoft   (2004-08-09 09:12) [11]

>> спасибі Servelat (у) [10] >>

Приєднуюся!
Була проблема ...



сторінки: 1 вся гілка

Форум: "Ігри";
Поточний архів: 2004.12.12;
Завантажити: [xml.tar.bz2];

Вгору





Пам'ять: 0.61 MB
Час: 0.055 c
3-1100103136
Olga_cc
2004-11-10 19:12
2004.12.12
DBGRID


1-1101783419
змій
2004-11-30 05:56
2004.12.12
файл в каталозі з * .exe


14-1100875107
Раміль
2004-11-19 17:38
2004.12.12
Копіювання жорсткого диска


1-1101249250
Хто --- то
2004-11-24 01:34
2004.12.12
Як відстежити де саме виникає витік пам'яті?


3-1100430358
M. Saratoff
2004-11-14 14:05
2004.12.12
Реалізація операції перетину





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська