Poruszanie postaci - zobacz :)

0

mam image2 i image 1 w tym ze image 1 to jest główny obraz a image2 to nasz hipek

i teraz mam pozycje hipka w image1

x := 10;
y := 10;

i mam wartości globalne x2, y2 : integer;

teraz podaję:

x2 := 50;
y2 := 70;

jak mogę zanimować, która ma się poruszyć z punktu x,y do punktu x2,y2 - ruch postaci ma być rposty - czyli:

X - nasz obraz ---- to linia do poruszania w poziomie a wpionie |

======================


                |
                |

======================

--
\|

tu narysowałem ruch, który nie chcę aby został wykonany.
ruch obrazka (kierunek odległość itp.) ma być przeciwprostokątną tego trójkąta :)

ogólnie chodzi mi o to zeby aplikacja nie została zastepowana (ee obciążona) zbytnio bo robię to w DelphiX.
(chodzi o ruch)

mam jeden pomsył tylko że zajmuje dużo czasu (bo komputer musi przemyśleć)

a mianowicie

rysuje na jakimś tam image linie z x,y do x2,y2

a potem tylko zapisuje do jakiegos tam memox i memoy : tmemo

wartosci x oraz y

potem w pętli for moj obiekt sie porusza :)

samo obliczenie gdzie znajduje się czarny piksel - nasza linia

zajmuje dobre sobie bo znalezienie 480000 punktów i ich przetwożenie w razie gdy to konieczne jest zajmuje w cholerę czasu :] {browar}

Więc pytam : )

Wiem jak zrobić poruszanie przez te 2 linie, a jak zrobić poruszanie po przeciwprostokątniej tegoż trójkąta prostego :)


            |
            |
            |
            |

Nie czytałem tamtego tket jeszcze raz :) więc mozecie cos zle zinterpretowac ale mysle, ze sie jasno wyrazilem :]

Pozdrawiam.

0

eeee

w tym niby trojkącie znaki "|" były na samym koncu a nie pośrodku- nie wiem co się stało ; )

0

Czy ja dobrze rozumiem, ze chodzi Ci po prostu o znalezienie trajektorii miedzy dwoma punktami?

to moze tak:

daj 5 editow, buttona i image

procedure TForm1.Button1Click(Sender: TObject);
var
x1,x2,y1,y2,dx,dy,i,d,px,py, ppx, ppy, step :integer;
fx,fy:double;

begin
x1:=StrToInt(Edit1.Text);
y1:=StrToInt(Edit2.Text);
x2:=StrToInt(Edit3.Text);
y2:=StrToInt(Edit4.Text);
step:=StrToInt(Edit5.Text);

dx:=x2-x1;
dy:=y2-y1;

d:=round(sqrt(sqr(abs(dx)+abs(dy)))); // wyliczam odleglosc po skosie z pitagorasa
fx:=abs(dx/d);
fy:=abs(dy/d);

i:=0;

repeat
px:=round(x1+ifx);
py:=round(y1+i
fy);
if i&gt0 then Image1.Canvas.Pixels[ppx,ppy]:=clWhite;
Image1.Canvas.Pixels[px,py]:=clBlack;
ppx:=px;
ppy:=py;
Application.ProcessMessages;
inc (i, step);
until i&gt=d

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=True;
end;

--Pawel

Delphi6

0

Jeszcze poprawka. Pwonno byc:
fx:=dx/d;
fy:=dy/d;--Pawel

Delphi6

0

pq a po co mi edit5 - ja tego nie podam :] program sam musi wiedziec ile ma miec kroków do końca :) czyli długość i wtedy d:= step;
^
|
jezeli o to ci biega

0

ZIOMBER napisał:
pq a po co mi edit5 - ja tego nie podam :] program sam musi wiedziec ile ma miec kroków do końca :) czyli długość i wtedy d:= step;
&gt^
&gt|
&gtjezeli o to ci biega
&gt

step okresla szybkosc poruszania sie obiektu (w przykladzie pixela), tzn o ile punktow na trajektorii ma sie on przesunac w jednym obrocie petli repat..until--Pawel

Delphi6

0

jeszcze cos

a moglbys mi powiedziec jakby to zrobic - jak obiekt , ktory musimy przeniesc to Tbutton??

0

O to chodzi?

repeat
px:=round(x1+ifx);
py:=round(y1+i
fy);
Button1.Left:=px;
Button1.Top:=py;
Application.ProcessMessages;
inc (i, step);
until i&gt=d

--Pawel

Delphi6

0

niestety cos postac sie nie rusza

0

zmieniłem kilka rzeczy :) i działa ale tylko przesunięcie nie ma tej anmacji co chciałem :) poruszanie po przeciwprostokątnej

oto mój kod sorry ale nie zmieniałem oryginału w formę co ty mi podałeś

procedure tform1.ruch_postaci; *by pq
var
x1,x2,y1,y2,dx,dy,i,d,px,py, ppx, ppy, step :integer;
fx,fy:double;

begin
if sprite = 'autko' then
begin
x1:=pos.x;
y1:=pos.y;
x2:=newx;
y2:=newy;
end;

if sprite = 'wrog' then
begin
x1:=pos2.x;
y1:=pos2.y;
x2:=newx;
y2:=newy;
end;

step:=1;

dx:=x2-x1;
dy:=y2-y1;

d:=round(sqrt(sqr(abs(dx)+abs(dy)))); * wyliczam odleglosc po skosie z pitagorasa
fx:=dx/d;
fy:=dy/d;

if sprite = 'autko' then
begin
d:=round(sqrt(sqr(abs(dx)+abs(dy))));
end;
fx:=dx/d;
fy:=dy/d;

i:=0;

repeat
Application.ProcessMessages;
px:=round(x1+ifx);
py:=round(y1+i
fy);
if sprite ='autko' then
begin
pos.x :=px;
pos.y:=py;
end;
if sprite ='wrog' then
begin
pos2.x:=px;
pos2.y:=py;
end;
i := i + 1;
until i&gt=d ;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0