Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 2 Images gleichzeitig verschieben? (https://www.delphipraxis.net/17829-2-images-gleichzeitig-verschieben.html)

LoW_FloW 10. Mär 2004 11:51


2 Images gleichzeitig verschieben?
 
Wie kann man mit Image.Left und Top usw. 2 Images gleichzeitig bewegen? Delphi tut immer zuerst eine Aktion durchführen und dann die andere. Betätigt nur Spieler 1 die Taste, damit seine Figur nach rechts geht, kann Spieler2 nix tun. Was kann man dagegen unternehmen :?:

Vjay 10. Mär 2004 11:53

Re: 2 Images gleichzeitig verschieben?
 
Verstehe ich zwar nicht richtig, aber du kannst Komponenten auch mit .setBounds oder komponente.boundsrect:= verschieben, meinst du das?

ISAS 10. Mär 2004 12:12

Re: 2 Images gleichzeitig verschieben?
 
Nur eine Frage: Wäre DelphiX mit Direct Input nicht besser. Kommt natürlich auf das Spiel an, um das es sich handelt.

Ansonsten würd ich das so machen:

if key = vk_left then begin
Image1.Left:=...
Image2.Left:=...
Image1.Top...
Image2.Top:=...
end;

Du müsstest mir das ein bisschen genauer erläutern, versteh nämlich nicht ganz, was du genau bewirken willst

LoW_FloW 10. Mär 2004 12:26

Re: 2 Images gleichzeitig verschieben?
 
Dann hier der Source. Aber ich habe halt schlechte Erfahrung gemacht, wenn ich den Source poste, dann antwortet wieder keiner :cry:
Delphi-Quellcode:
const
RightMove = 10 ;
LeftMove = -10 ;
NoMove = 0 ;
Jumphigh = 200 ;
NoJump = 0 ;

implementation

{$R *.dfm}

procedure ShowFighter(Image : TImage ; Richtung: String ; Bewegung : Boolean );
begin
  if Richtung = 'Rechts' then Image.Picture.LoadFromFile('Bilder\Rechts.bmp');
  if Richtung = 'Links' then Image.Picture.LoadFromFile('Bilder\Links.bmp');
  if Richtung = 'Gerade' then Image.Picture.LoadFromFile('Bilder\Gerade.bmp');
end;

procedure MoveFighter(Image : TImage ; X : integer ; Jump : integer );
var
Schritt, i : integer ;
begin
//==HORIZONTALE=BEWEGUNG==
if X > 0 then ShowFighter(Image, 'Rechts', true) ; // Rechts, Links bei Bewegung
if X < 0 then ShowFighter(Image, 'Links', true) ;
Image.Left := Image.Left + (X) ;
//==VERTIKALE=BEWEGUNG==
if Jump > 0 then begin
  for i := 1 to Round(Jump/32) do begin
    Image.Top := Image.Top - 32 ;
    sleep(10);
    Image.Repaint;
    end;
  sleep(100);
  for i := 1 to Round(Jump/64) do begin
    Image.Top := Image.Top + 64 ;
    sleep(10);
    Image.Repaint;
    end;
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
ShowFighter(imgFighter1, 'Rechts', true ) ;
frmMain.DoubleBuffered := true ;
end;

procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_LEFT then MoveFighter (imgFighter1, LeftMove , NoJump );
if Key=VK_RIGHT then MoveFighter(imgFighter1, RightMove, NoJump );
if Key=VK_UP then MoveFighter  (imgFighter1, NoMove  , Jumphigh );
if Key=VK_DOWN then MoveFighter (imgFighter2, LeftMove , NoJump ); //TEST, damit man 2 auf einmal bewegen kann
end;

end.
Wenn jetzt RUNTER und LINKS auf einmal drückt, bewegt sich nur 1 Image. Wie kann man das proggen, das sich beide bewegen? :duck:

Jens Schumann 10. Mär 2004 13:11

Re: 2 Images gleichzeitig verschieben?
 
Hallo,
da gibt es API-Funktionen GetKeyState und GetAsycnKeyState.
Musste mal im PSDK nachschauen.

MSDN Online GetKeyState

MSDN Online GetAsyncKeyState

Markus K. 10. Mär 2004 13:20

Re: 2 Images gleichzeitig verschieben?
 
Hallo LoW_FloW,
dein Problem müsstest du mit GetKeyState lösen können. Hier mal ein Beipiel zum Bewegen von zwei Panels.

Delphi-Quellcode:
if ((getkeystate(vk_numpad2)and 128)=128) and
   ((getkeystate($41)and 128)=128)
then begin
     panel3.top:=panel3.top+20;
     panel4.top:=panel4.top+20;
end;
Tschüß Markus

LoW_FloW 10. Mär 2004 13:41

Re: 2 Images gleichzeitig verschieben?
 
Wie baue ich das ein @ Markus?
So gehts nicht:
Delphi-Quellcode:
procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_LEFT then MoveFighter (imgFighter1, LeftMove , NoJump );
  if Key=VK_RIGHT then MoveFighter(imgFighter1, RightMove, NoJump );
  if Key=VK_UP then MoveFighter  (imgFighter1, NoMove  , Jumphigh );
  if Key=VK_DOWN then MoveFighter (imgFighter2, LeftMove , NoJump );
 
if ((getkeystate(vk_numpad2)and 128)=128) and
   ((getkeystate($41)and 128)=128)
then begin
  if Key=VK_LEFT then MoveFighter (imgFighter1, LeftMove , NoJump );
  if Key=VK_RIGHT then MoveFighter(imgFighter1, RightMove, NoJump );
  if Key=VK_UP then MoveFighter  (imgFighter1, NoMove  , Jumphigh );
  if Key=VK_DOWN then MoveFighter (imgFighter2, LeftMove , NoJump );
  end;
end;
Oder muss das bei Process fürs Bewegen der Images hin?
[procedure MoveFighter(Image : TImage ; X : integer ; Jump : integer );]
:?:

Markus K. 10. Mär 2004 14:03

Re: 2 Images gleichzeitig verschieben?
 
In den Klammern gibst du an was geschehen soll, wenn du zwei Tasten auf einmal drückst. Und bei then fügst du dann die Prozeduren hinzu welche ausgeführt werden sollen.
Delphi-Quellcode:
if ((getkeystate(VK_LEFT)and 128)=128) and
   ((getkeystate(VK_DOWN)and 128)=128)
then begin
     MoveFighter (imgFighter1, LeftMove , NoJump );
     MoveFighter (imgFighter2, LeftMove , NoJump );
     end;
Den Teil brauchst du aber auch, da der obrige Code nur ausgeführt wird wenn du zwei Tasten auf einmal drückst.
Delphi-Quellcode:
if Key=VK_LEFT then MoveFighter (imgFighter1, LeftMove , NoJump );
if Key=VK_RIGHT then MoveFighter(imgFighter1, RightMove, NoJump );
if Key=VK_UP then MoveFighter  (imgFighter1, NoMove  , Jumphigh );
if Key=VK_DOWN then MoveFighter (imgFighter2, LeftMove , NoJump );
So hatte ich damals das selbe Problem gelöst, weiß allerdings nicht ob es dafür noch andere Möglichkeiten gibt.

Tschüß Markus

LoW_FloW 10. Mär 2004 16:38

Re: 2 Images gleichzeitig verschieben?
 
Muss ich da jetzt alle Kombinationen durchgehen? Das sind ja 64 Stück?

Was bedeutet außerdem diese 128. Beide Tasten werden aber nicht durchgehend gedrückt.

Markus K. 10. Mär 2004 16:46

Re: 2 Images gleichzeitig verschieben?
 
...hmm ich musste es damals für alle Kombinationen einzeln machen...hatte damals aber nur 8 und deshalb hatte ich auch mir nix anderes ausgedacht
den Code für die Bewegung, welche ausgeführt werden soll wenn man nur eine Taste kann man so kürzer fassen...beim anderen fällt mir gerade nichts ein
Delphi-Quellcode:
case Key of
     VK_LEFT: MoveFighter (imgFighter1, LeftMove , NoJump );
     VK_RIGHT: MoveFighter(imgFighter1, RightMove, NoJump );
     VK_UP: MoveFighter  (imgFighter1, NoMove  , Jumphigh );
     VK_DOWN: MoveFighter (imgFighter2, LeftMove , NoJump );
end;
Tschüß Markus


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz