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;

0

Moze ktoś nie wie o co mi w ogóle chodziło co nie pq? :P

jezeli nie patrząć linię o długości 100 ustawić prosto czyli nie tak jak przeciwprostokątna to:

a te 2 przyprostokątne były nie wiem do czego :)

var
i : integer
begin
for I:=0 to 100 do
begin
application.processmessages;
button1.left := i;//przyjmuję juz na stałe ze button jest w pozzycji 0 i z niej zaczyna
application.processmessages;
sleep(45);
end;

end;

wlasnie o tą namiację mi chodzi tylko, że - button musi poruszac się po skoscie (po tej przeciwprostokątnej)--&ltfont color="maroon"&gtPozdrawiam,
&ltbr&gt
&ltbr&gtZIOMBER&lt/font&gt

0

Co do Twojego podpisu Ziomber pragne przypomniec ze zwyklych uzytkowników forum obowiązują znaczniki --Delphi 6
Pozdrowienia{hello} ,
Moderator Imperior

0

Imperior napisał:
Co do Twojego podpisu Ziomber pragne przypomniec ze zwyklych uzytkowników forum obowiązują znaczniki

--
Delphi 6
Pozdrowienia{hello} ,
Moderator Imperior

Hehehe, NIEZWYKLY uzytkownik forum PAN MODERATOR IMPERIOR raczyl pouczyc tych zwyklych, gdzie ich miejsce ;) ;) ;) :D :D :D

BTW, ZIOMBER, jakbym nie zrozumial Twojego pierwszego postu, to ostatni by mi tylko zamacil {glowa} {glowa} .

Pozdrowienia i ciesze sie ze w koncu Ci dziala. Jakas gierka samochodowa???

--
Pawel

Delphi6

0

nie pq mylisz się właśnie mi nie działa! i dlatego wlanąłem to jeszcze raz :) z innym wytłumaczeniem

Potrzebne mi to do: mojej gry RTS :)--

0

hehe to do tego o znacznikach:
do dzisiaj bylo tak ze w podpisie mogles umiescic wszystkie znaczniki, lacznie ze skryptami JavaScript ( PHP chyba tez )
tzn. ze Ziomber mogl wpisac te kolorki hehe :)
no ale przykro mi panowie powiadomilem o tym Adama i ....
stalo sie, teraz mozna uzywac tylko tych o ktorych pisal Imp :)

tylko nie wim dlaczego Adam zablokowal tez znacznik :)

ps. zeby nie podpis Ziombra to ten blad bylby nadal aktulany i ....
az strach pomyslec co by sie moglo dziac :)

---=-=[ Delphi 3, 6 ]=-=-
-=-=-==[ LKS ]==-=-=-
-=[ [email protected] ]=-

0

ZIOMBER napisał:
nie pq mylisz się właśnie mi nie działa!

To znaczy ze jak puscisz moj kod to Button1 nie przesuwa sie z punktu opianego w Edit1, Edit2 do punktu opisanego w Edit3, Edit4 po najkrostszej linii, tzn po skosie jesli te punkty nie leza w 1 linii??? I z predkoscia zalezna od Edit5?

Bo u mnie dziala...--Pawel
&ltbr&gt
&ltbr&gtDelphi6

0

no poruszy sie tak jak bym napisal

w button2click

button1.left ; =10;
button1.top := 40;

właśnie taki jest efekt

nie porusza się w ogóle mój button po tej lini - chodzi mi o to zeby on sobie po tej lini szedł z przystepowaniem aby a mam to w d ()P13 macie linka do rysunku gdzie jest to pokazane :]

http://www.resportgql.republika.pl/files/1.bmp

i chyba tam wytłumaczyłem (jak umię najjaśniej :P) :] hehe--

0

No to u mnie button sie przesuwa pieknie stopniowo po ukosnej linii. Jak w Edit5 jest 1, to dosc wolno, jak jest 4 to szybko, jak 20 to b.szybko.

Nie rozumiem, czemu u Ciebie nie dziala. :( :(

--
Pawel

Delphi6

0

Jak napisałem na tamtym obrazku:

Używam DelphiX do zrobienia tej gry a tam niekiedy nie mozna stwosować tradycyjnych metod - bo:
a)komp zwisa
b)cos nie działa prawidłowo, choć normlanie działa - to jest ten problem

==ja spróbuję dać zamiast do pętli repeat until to dam do DxTimer'a

ze zmienna if przesuwac = true then
begin

==kod=

//i warunek zamykający pętlę
if pozycja &gt= dlugosci then przesuwac := false;
end;

:) i powinno dadziałać

Pozdrawiam--

0

Oj oj zrobiłem :]]]]]]]]]]]]

hehe moze ktoś chce kodzik - ale jako nie dokończoną grę. No podpisywać się!!! :)--

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