![]() |
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 :?:
|
Re: 2 Images gleichzeitig verschieben?
Verstehe ich zwar nicht richtig, aber du kannst Komponenten auch mit .setBounds oder komponente.boundsrect:= verschieben, meinst du das?
|
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 |
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:
Wenn jetzt RUNTER und LINKS auf einmal drückt, bewegt sich nur 1 Image. Wie kann man das proggen, das sich beide bewegen? :duck:
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. |
Re: 2 Images gleichzeitig verschieben?
Hallo,
da gibt es API-Funktionen GetKeyState und GetAsycnKeyState. Musste mal im PSDK nachschauen. ![]() ![]() |
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:
Tschüß Markus
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; |
Re: 2 Images gleichzeitig verschieben?
Wie baue ich das ein @ Markus?
So gehts nicht:
Delphi-Quellcode:
Oder muss das bei Process fürs Bewegen der Images hin?
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; [procedure MoveFighter(Image : TImage ; X : integer ; Jump : integer );] :?: |
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:
Den Teil brauchst du aber auch, da der obrige Code nur ausgeführt wird wenn du zwei Tasten auf einmal drückst.
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;
Delphi-Quellcode:
So hatte ich damals das selbe Problem gelöst, weiß allerdings nicht ob es dafür noch andere Möglichkeiten gibt.
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 ); Tschüß Markus |
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. |
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:
Tschüß Markus
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; |
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