![]() |
Grenzen eines bewegten TImage
Heyho Delphi Praxis Community,
da mir bisher hier gut geholfen werden konnte und ich wieder vor einem kleinen Problem stehe, wo ich nicht weiterweiß, wollte ich nocheinmal nach Rat fragen. (Ach ja, bin noch ziemlich frisches Fleisch im Programmieren) Und zwar ist mein Problem folgendes, ich habe nun ein TImage (als Platzhalter ein kleines Quadrat momentan ^^), welches man mit 4 Buttons über den Bildschirm bewegen kann. Also als eine Art Bewegung des Objektes. Hier nocheinmal der Quelltext mit einer Richtung, wäre sonst zulang ^^
Delphi-Quellcode:
Nun habe ich einige Grenzen eingebaut (kleine Quadratische Bilder vin "Büschen"), bei denen das Bild nicht weiter gehen soll. Nur leider habe ich keine Ahnung wie ich Koordinaten als Begrenzung angeben kann bzw. den Vorgang der Bewegung dann einfach blockieren kann, sodass sich das Objekt da nicht durchbewegen kann.
//Konsole bei Start
procedure TForm1.FormCreate(Sender: TObject); begin timer1.enabled := false; timer2.enabled := false; timer3.enabled := false; timer4.enabled := false; timer1.Interval := 200; timer2.Interval := 200; timer3.Interval := 200; timer4.Interval := 200; end; //Steuerung: Hoch procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled := true; end; procedure TForm1.Button2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Timer1.Enabled := false; end; //Konsole für Hoch procedure TForm1.Timer1Timer(Sender: TObject); begin Image1.Top := Image1.Top - 15; end; Vll. kann mir hier ja einer weiterhelfen, schonmal dankö im voraus :) Mit freundlichen Grüßen, der Eme |
AW: Grenzen eines bewegten TImage
Mal was generelles, ein Timer gibt einen bestimmten Takt vor und pro Takt hat man ein Event.
In diesem Event kann man machen, was einem beliebt (machst du ja auch schon) Mit den Buttons schaltest du einen Timer ein und aus. Wenn du jetzt beim Einschalten des Timers auch noch die Werte setzen würdest, die das Objekt (hier Image) in x und y Richtung pro Takt verschoben werden soll, dann brauchst du nur einen Timer ;) Aber bitte nicht die Werte in ein unsichtbares Label schreiben. Dafür kannst du in der Form Felder definieren (das sind Variablen, die nur der Form bekannt sind)
Delphi-Quellcode:
type
TForm1 = class( TForm ) ... private FDeltaX : Integer; FDeltaY : Integer; public end; |
AW: Grenzen eines bewegten TImage
Liste der Anhänge anzeigen (Anzahl: 1)
Auch wenn das bewegen von Controls auf Dauer nicht empfohlene Methode ist hätte ich hier Vorschläge bzgl. Bewegung auch mit mehreren Tasten gleichzeitg und der Kollisionserkennung/behandlung
Delphi-Quellcode:
unit uKollision;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm4 = class(TForm) Shape1: TShape; MoveObj: TShape; Shape3: TShape; Timer1: TTimer; Shape2: TShape; Shape4: TShape; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } FXDir, FYDir: Integer; public { Public-Deklarationen } end; var Form4: TForm4; implementation {$R *.dfm} Procedure CheckMove(MoveObj:TControl;var FXDir,FYDir:Integer); var Parent:TWinControl; C:Tcontrol; i:Integer; rdummy,rx,ry:TRect; begin Parent := MoveObj.Parent; rx := MoveObj.BoundsRect; ry := rx; OffsetRect(rx,FXDir,0); OffsetRect(ry,0,FYDir); for I := 0 to Parent.ControlCount - 1 do begin C := Parent.Controls[i]; if C <> MoveObj then begin If IntersectRect(rdummy,rx,C.BoundsRect) then begin FXDir := 0; end; If IntersectRect(rdummy,ry,C.BoundsRect) then begin FYDir := 0; end; end; end; end; procedure TForm4.Timer1Timer(Sender: TObject); Const C_Speed = 2; var L, R, U, D: Boolean; begin L := GetAsyncKeyState(VK_Left) < 0; R := GetAsyncKeyState(VK_Right) < 0; U := GetAsyncKeyState(VK_UP) < 0; D := GetAsyncKeyState(VK_DOWN) < 0; if (L OR R) and not(L AND R) then begin if L then FXDir := -C_Speed else FXDir := C_Speed end else FXDir := 0; if (U OR D) and not(U AND D) then begin if U then FYDir := -C_Speed else FYDir := C_Speed end else FYDir := 0; CheckMove(MoveObj,FXDir,FYDir); MoveObj.Left := MoveObj.Left + FXDir; MoveObj.Top := MoveObj.Top + FYDir; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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 by Thomas Breitkreuz