Image bewegen
Hallo Leute;
Meine Frage heute, wie bringe ich ein Image dazu sich per Tastendruck zu bewegen? Danke schonmal für eure Antworten. |
Re: Image bewegen
Zur Änderung der Position musst Du Left bzw. Top des Image neu setzen. Und für Tastendrücke gibt es die Ereignisse OnKeyPress bzw. OnKeyDown. Falls Du noch weitere Komponenten auf dem Formular hast, solltest Du ggf. dessen Eigenschaft KeyPreview auf true setzen.
|
Re: Image bewegen
hier im Feld "Search" Move Image eingeben.
Die Adresse würde ich bookmarken. [Edit] zu spät ? [/Edit] Gruß Wolfgang |
Re: Image bewegen
Dein Formular hat ein Event namens OnKeyDown. Dieses Event wird immer dann ausgelöst, wenn der Nutzer eine Taste drückt und das Formular den Fokus hat. Damit du weißt, in welche Richtung das Image bewegt werden soll, musst du natürlich noch abfragen, welche Tastae gedrückt wurde. Die Taste ist im Parameter "Key" angegeben, für die Pfeiltasten gibt es die Konstanten VK_LEFT, VK_RIGHT, VK_UP und VK_DOWN.
Lange Rede, kurzer Sinn:
Delphi-Quellcode:
Eine andere Möglichkeit wäre ein Timer/eine Schleife, in dem/der du den Zustand (Gedrückt/Nicht gedrückt) der Tasten selbst abfragst. Das ginge dann mit GetAsncKeyState.
procedure TForm1.FormKeyDown(..., const Key: integer, ...);
begin case Key of VK_LEFT: Image1.Left := Image1.Left - 10; VK_RIGHT: Image1.Left := Image1.Left + 10; VK_UP: Image1.Top := Image1.Top - 10; VK_DOWN: Image1.Top := Image1.Top + 10; end; end; |
Re: Image bewegen
Ich hab jetzt mal wieder ne Frage!
Ich habe diesen Quellcode geschrieben:
Delphi-Quellcode:
Und jetzt habe ich das Problem ,dass sich das Image bewegt und der grüne Punkt erst garnicht erscheint. :cry:
procedure TForm1.FormCreate(Sender: TObject);
var Bitmap:TBitmap; begin Bitmap:=TBitmap.Create; Bitmap.Width:=Image1.Width; Bitmap.Height:=Image1.Height; Image1.Picture.Graphic:=Bitmap; with Image1.Canvas do begin pen.color:=clGreen; pen.width:=10; MoveTo(500,500); end end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_LEFT: Image1.Left := Image1.Left - 10; VK_RIGHT: Image1.Left := Image1.Left + 10; VK_UP: Image1.Top := Image1.Top - 10; VK_DOWN: Image1.Top := Image1.Top + 10; end; end; end. |
Re: Image bewegen
Du erzeugst ein Bitmap, das Du aber nie benutzt. Zeichne statt auf den Canvas des Image lieber auf den der Bitmap und weise diese erst im Anschluss dem Image zu.
|
Re: Image bewegen
Und wie soll ich das machen?
Ich hab wirklich bis jetzt fast nur Ahnung von Rechenprogrammen und ein bisschen von Grafiken! |
Re: Image bewegen
Versuch es mal so (ungetestet):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Bitmap:TBitmap; begin Bitmap:=TBitmap.Create; try Bitmap.Width:=Image1.Width; Bitmap.Height:=Image1.Height; Bitmap.Canvas.pen.color:=clGreen; Bitmap.Canvas.pen.width:=10; Bitmap.Canvas.Ellipse(0,0,Bitmap.Width,Bitmap.Height); Image1.Picture.Graphic.Assign(Bitmap); finally Bitmap.Free; end end; |
Re: Image bewegen
Danke alles ist gut bis auf diese Zeile:
Image1.Picture.Graphic.Assign(Bitmap); Die funktioniert nicht ich weiß nicht warum :wiejetzt: . |
Re: Image bewegen
Das mach ich jedesmal falsch :wall:. Lass das "Graphic." einfach weg.
|
Re: Image bewegen
Du machst auch 'mal Fehler? Hätte ich nicht erwartet. :mrgreen:
|
Re: Image bewegen
Natürlich, ich halte mich ja nicht für unfehlbar, da ich weiß, dass ich das nicht bin.
|
Re: Image bewegen
So und jetzt wo ich das hätte will ich wissen wie ich den weißen Rand unsichtbar machen kann?
|
Re: Image bewegen
Stichwort transparent
|
Re: Image bewegen
Ja das hab ich auch gewusst aber wo baue ich es ein?
|
Re: Image bewegen
Schau mal beim Image im Objektinspektor oder in der Referenz.
|
Re: Image bewegen
Ich habs selber herausgefunden juchu
Delphi-Quellcode:
Danke jetzt soll mein Objekt an einer Wand stehen bleiben wie geht das?
with Image1 do
begin transparent:=true; end |
Re: Image bewegen
Du meinst ein Hindernis? Dazu musst Du vor dem Verschieben nachrechnen, ob sich Image und Wand berühren und erst dann ggf. Verschieben.
|
Re: Image bewegen
Soweit bin ich jetzt:
Delphi-Quellcode:
nur ich weiß nicht wie man eine Berührung erkennt.
if Image1 then
begin end else begin case Key of VK_LEFT: Image1.Left := Image1.Left - 10; VK_RIGHT: Image1.Left := Image1.Left + 10; VK_UP: Image1.Top := Image1.Top - 10; VK_DOWN: Image1.Top := Image1.Top + 10; end; |
Re: Image bewegen
Nunja, z.B. für die Bewegung nach links:
Delphi-Quellcode:
if Image1.Left - 10 > Mauer.Left then
Image1.Left := Image1.Left - 10; |
Re: Image bewegen
Also ich habe folgendes Problem, dass Delphi sagt Undefinierter Bezeichner Image1 und so weiter und sofort:
Delphi-Quellcode:
Bitte helft mir.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var Bitmap:TBitmap; begin Bitmap:=TBitmap.Create; try Bitmap.Width:=Image1.Width; Bitmap.Height:=Image1.Height; Bitmap.Canvas.pen.color:=clGreen; Bitmap.Canvas.pen.width:=10; Bitmap.Canvas.Ellipse(5,5,50,50); Image1.Picture.Assign(Bitmap); finally Bitmap.Free; end; Bitmap:=TBitmap.Create; try Bitmap.Width:=Image2.Width; Bitmap.Height:=Image2.Height; Bitmap.Canvas.pen.color:=clBlue; Bitmap.Canvas.pen.width:=10; Bitmap.Canvas.Ellipse(5,5,50,50); Image1.Picture.Assign(Bitmap); finally Bitmap.Free; end; with Image1 do begin transparent:=true; end end; procedure FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState); begin if Image1.Left - 10 > Image2.Left then begin Image1.Left := Image1.Left - 10; end else begin case Key of VK_LEFT: Image1.Left := Image1.Left - 10; end end if Image1.Left + 10 > Image2.Left then begin Image1.Left := Image1.Left + 10; end else begin case Key of VK_RIGHT: Image1.Left := Image1.Left + 10; end end if Image1.Top - 10 > Image.Top then begin Image1.Top := Image1.Top - 10; end else begin case Key of VK_DOWN: Image1.Top := Image1.Top - 10; end end if Image1.Top + 10 > Image2.Top then begin Image1.Top := Image1.Top + 10; end else begin case Key of VK_UP: Image1.Top := Image1.Top + 10; end end end; end. |
Re: Image bewegen
Zitat:
|
Re: Image bewegen
:pale: Du solltest vielleicht erst einmal ein Grundlagentutorial durcharbeiten. Du hast doppelten Code im FormCreate(die Bitmap wird 2 mal erzeugt) und für das KeyDown-Ereignis musst Du im Objektinspektor auf dem Reiter "Ereignisse" einen Doppelklick bei "OnKeyDown" machen. Daraufhin erzeugt Dir Delphi das Codegerüst automatisch, Du musst nur noch den Code zwischen begin und end einfügen sowie evtl. Variablen.
|
Re: Image bewegen
Zitat:
|
Re: Image bewegen
Er weist die Bitmap beide Male Image1 zu, das macht ja keinen Sinn.
|
Re: Image bewegen
Jaja ich weiß was ich falsch gemacht habe.
Hier nochmal eine verbesserte Variante nur bewegt sich der Kreis nicht mehr:
Delphi-Quellcode:
nit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var Bitmap1,Bitmap2:TBitmap; begin Bitmap1:=TBitmap.Create; try Bitmap1.Width:=Image1.Width; Bitmap1.Height:=Image1.Height; Bitmap1.Canvas.pen.color:=clGreen; Bitmap1.Canvas.pen.width:=10; Bitmap1.Canvas.Ellipse(5,5,50,50); Image1.Picture.Assign(Bitmap1); finally Bitmap1.Free; end; Bitmap2:=TBitmap.Create; try Bitmap2.Width:=Image2.Width; Bitmap2.Height:=Image2.Height; Bitmap2.Canvas.pen.color:=clBlue; Bitmap2.Canvas.pen.width:=10; Bitmap2.Canvas.Rectangle(10,10,1000,15); Image2.Picture.Assign(Bitmap2); finally Bitmap2.Free; end; with Image1 do begin transparent:=true; end; with Image2 do begin transparent:=true; end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Image1.Left - 10 > Image2.Left then begin Image1.Left := Image1.Left - 10; end else begin case Key of VK_LEFT: Image1.Left := Image1.Left - 10; end; end; if Image1.Left + 10 > Image2.Left then begin Image1.Left := Image1.Left + 10; end else begin case Key of VK_RIGHT: Image1.Left := Image1.Left + 10; end; end; if Image1.Top - 10 > Image2.Top then begin Image1.Top := Image1.Top - 10; end else begin case Key of VK_DOWN: Image1.Top := Image1.Top - 10; end; end; if Image1.Top + 10 > Image2.Top then begin Image1.Top := Image1.Top + 10; end else begin case Key of VK_UP: Image1.Top := Image1.Top + 10; end; end; end; end. |
Re: Image bewegen
Hol tief Luft, schau Dir Deinen Code nochmal in Ruhe an und dann überlege, was Du eigentlich erreichen willst. Als Tipp: erst die Taste ermitteln, dann erst prüfen, ob sich das Image bewegen darf/soll.
|
Re: Image bewegen
Ich hab den ganzen Teil mit den Tasten nochmal gelöscht und überlege nochmal.
|
Re: Image bewegen
Ich komme hier nicht weiter:
Delphi-Quellcode:
Ich habe keine Ahnung wie ich mit Tasten umgehe!!!
case Key of
VK_LEFT: if Image1.Left -10 Image2.Left then begin Image1.Left := Image1.Left - 10; end end |
Re: Image bewegen
Da kommt eine Nachricht an "Taste gedrückt". Nun musst Du ermitten, ob das eine der Pfeiltasten ist, damit Du weißt, in welche Richtung sich das Image denn überhaupt ggf. bewegen soll(das war der case-Block). Innerhalb dieses Blocks musst Du nun je Taste schauen, ob die Bewegung in diese Richtung überhaupt ohne Kollision möglich ist. Daher musst Du den Code von oben nur anders verschachteln, dann passt das schon.
[edit] Das ist ja fast schon richtig, Du hast nur das "<" vergessen. [/edit] |
Re: Image bewegen
Ich weiß das ist irgendwie verschwunden, aber es bewegt sich nichts!
|
Re: Image bewegen
Das Ereignis OnKeyDown ist zugewiesen, das war der Code daraus und Du hast zum Testen die Pfeiltaste links gedrückt?
|
Re: Image bewegen
Ja nichts passiert alles bleibt wie es ist.
Hier ist der Text:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var Bitmap1,Bitmap2:TBitmap; begin Bitmap1:=TBitmap.Create; try Bitmap1.Width:=Image1.Width; Bitmap1.Height:=Image1.Height; Bitmap1.Canvas.pen.color:=clGreen; Bitmap1.Canvas.pen.width:=10; Bitmap1.Canvas.Ellipse(5,5,50,50); Image1.Picture.Assign(Bitmap1); finally Bitmap1.Free; end; Bitmap2:=TBitmap.Create; try Bitmap2.Width:=Image2.Width; Bitmap2.Height:=Image2.Height; Bitmap2.Canvas.pen.color:=clBlue; Bitmap2.Canvas.pen.width:=10; Bitmap2.Canvas.Rectangle(10,10,1000,15); Image2.Picture.Assign(Bitmap2); finally Bitmap2.Free; end; with Image1 do begin transparent:=true; end; with Image2 do begin transparent:=true; end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of VK_LEFT: if Image1.Left -10 < Image2.Left then begin Image1.Left := Image1.Left -10; end; end; end; end. |
Re: Image bewegen
Wenn die Unit nicht allzu groß ist, poste sie mal komplett hier, ansonsten häng sie mal an.
|
Re: Image bewegen
Zitat:
|
Re: Image bewegen
Zitat:
|
Re: Image bewegen
Ich hab es umgeändert und es passiert immer noch nichts!
|
Re: Image bewegen
Setz mal im OnKeyDown den Cursor auf die erste Zeile hinter dem begin und drücke F5. Wenn Du nun das Programm ausführst, bleibt es dann bei dieser Zeile stehen?
|
Re: Image bewegen
Du könntest auch testen, ob OnKeyDown überhaupt ausgeführt wird (z.B. indem du einfach ein ShowMessage einbaust). Falls nicht, solltest du mal überprüfen, ob in den Eigenschaften der Form KeyPreview auf True ist. Es könnte nämlich sein, dass gerade irgendein Edit oder ein Button aktiv ist...
[edit]Tut mir Leid; dachte, ich hätte schon alle Beiträge hier durchgelesen...[/edit] |
Re: Image bewegen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz