| Autor |
Beitrag |
Soapy
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 19:17
So jetzt hab ich wieder ein neues Problem bei meinem Spiel:
Ich will auf einen Button drücken mit dem ich ein Haus bauen kann.
Nun will ich das Haus platzieren - an der Cursorposition, an der der Spieler auf die Karte drückt.
Die Cursorpositionen sind nicht das Problem. Das Problem ist: Wie schaff ich es, dass es mir das Haus genau an dieser Position baut?
Ich hab mir gedacht mit OnMouseDown vielleicht, aber da ich mich damit jedoch nicht besonders gut auskenne, und ich im großen, weiten Internet keine Artikel gefunden haben, die mir weitergeholfen haben, sind meine bisherigen Versuche kläglich gescheitert.
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
bflegel
      
Beiträge: 193
Erhaltene Danke: 1
Win XP, Win 7, BS2000
D5
|
Verfasst: Mi 23.01.08 19:31
Hallo,
ich verstehe das Problem zwar nicht ganz, aber wenn Du die Cursorposition hast und Du weist, wie hoch und wie breit Dein Haus ist, dann nimm die Cursorposition doch als Mittelpunkt.
Delphi-Quelltext 1: 2:
| Bild.left := Cursorposition.x - (Bildbreite/2) Bild.Top := Cursorposition.y - (Bildbhöhe/2) |
Bye
bflegel
_________________ I know all the jokes about my name
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 19:35
Ja
aber wenn ich jetzt meine linke Maustaste drücke, dann soll das Haus bei den Koordinaten stehen, bei denen ich die Mausgedrückt habe!
Ich brauch nur zu wissen, wie ich das mit dem Klick mache, die TImages in denen die Bilder sind werden bei einem Klick auf den Button erzeugt!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
bflegel
      
Beiträge: 193
Erhaltene Danke: 1
Win XP, Win 7, BS2000
D5
|
Verfasst: Mi 23.01.08 19:39
Mal sehen ob ich es richtig verstanden habe:
Du hast ein TImage (Karte). Du klickst irgendwo auf die Karte, DANACH auf einen Button und es soll bei den Koordinaten des letzten Klicks ein Haus gebaut werden?
Dann speichere doch im TImageOnMouseClick die Koordinaten z.B. in eine globale Variable und lese diese im Button-Click aus.
Bye
bflegel
_________________ I know all the jokes about my name
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 19:50
So ähnlich!
Ich klick auf einen Button, dann mit der Maus auf die Karte und dann soll an der Stelle wo ich auf die Karte geklickt hab ein Haus entstehen.
Kannst du mir das mit dem TImageOnMouseDown erklären? Weil ich hab das bisher noch nicht gebraucht und hab leider davon auch keinen blassen schimmer.
Aber Danke für die Antwort!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
bflegel
      
Beiträge: 193
Erhaltene Danke: 1
Win XP, Win 7, BS2000
D5
|
Verfasst: Mi 23.01.08 19:56
Nun, dann sind wir schon zwei. Ich habs auch noch nicht benutzt. Aber da Du zuerst auf den Button "Haus bauen" klickt, setze entweder eine globale Variable z.B. auf "1" (Oder "missbrauche" die Tag-Eigenschaft des TImages zur Speicherung.
Dann im OnMouseDown des TImage fragst Du zuerst ab ob die Variable auf "1" steht und zeichne dann Dein Haus, oder wenn die Variable "2" ist, dann einen Baum, bei "3" einen Strauch usw.
bye
bflegel
_________________ I know all the jokes about my name
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 20:00
Ok dankeschön! Das werde ich mal ausprobieren!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 20:21
hilfeeeeeeeeeeee...
Kann mir jemand erklären wie ich den Code hier -
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Cursorposx := ScreenToClient(Mouse.CursorPos).X; cursorposy := ScreenToClient(Mouse.CursorPos).Y;
Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= CursorPosX; FImages[length(FImages)-1].Top:= CursorPosY; FImages[length(FImages)-1].Picture.LoadfromFile('Bildpfad'); |
- in ein OnMouseDown-Ereignis eines TImages richtig einfüge?
Das hier funktioniert so nicht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Image3MouseDown(Sender:Tobject;Button:TMouseButton;Shift: TShiftState;X, Y: Integer); var CursorPosX, CursorPosY : integer; begin Cursorposx := ScreenToClient(Mouse.CursorPos).X; cursorposy := ScreenToClient(Mouse.CursorPos).Y;
Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= CursorPosX; FImages[length(FImages)-1].Top:= CursorPosY; FImages[length(FImages)-1].Picture.LoadfromFile('Bildpfad'); end; |
Wenn ich das aber jetzt in einem normalen Button ausführe funktioniert es einwandfrei:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); var CursorPosX, CursorPosY : integer; begin Cursorposx := ScreenToClient(Mouse.CursorPos).X; cursorposy := ScreenToClient(Mouse.CursorPos).Y;
Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= 50; FImages[length(FImages)-1].Top:= 50; FImages[length(FImages)-1].Picture.LoadfromFile('Bildpfad'); Image1.Visible := true; end; |
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
bflegel
      
Beiträge: 193
Erhaltene Danke: 1
Win XP, Win 7, BS2000
D5
|
Verfasst: Mi 23.01.08 20:32
Auf die Schnelle würde ich sagen:
Delphi-Quelltext 1: 2:
| FImages[length(FImages)-1].Left:= CursorPosX; FImages[length(FImages)-1].Top:= CursorPosY; |
und
Delphi-Quelltext 1: 2:
| FImages[length(FImages)-1].Left:= 50; FImages[length(FImages)-1].Top:= 50; |
ist nicht ganz dasselbe.
Daher dürfte er das Image irgendwohin setzen, aber nicht dahin, wo Du möchtest.
bflegel
_________________ I know all the jokes about my name
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 23.01.08 20:40
Du bekommst die Client-Koordinaten der Maus doch schon per Parameter beim Ereignis überliefert - warum rufst du die dannn noch mal ab? Du kannst einfach X und Y nehmen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= X+25 FImages[length(FImages)-1].Top:= Y+10; FImages[length(FImages)-1].Picture.LoadfromFile('Bildpfad'); end; |
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 21:04
Danke, euch beiden!
So nun hab ich es auf Yogu's weise probiert...
... und es tut immer noch nicht *heul*
So sieht mein Quelltext aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Menus, StdCtrls, Tabs, ComCtrls, jpeg, ImgList;
type TForm1 = class(TForm) PopupMenu1: TPopupMenu; Timer1: TTimer; Schliessen: TMenuItem; Label3: TLabel; ScrollBox2: TScrollBox; Image2: TImage; Label2: TLabel; ScrollBox3: TScrollBox; Image3: TImage; Label1: TLabel; TabControl1: TTabControl; Haus1: TButton; Haus2: TButton; Haus3: TButton; Haus4: TButton; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Timer2: TTimer; Image1: TImage; procedure Timer2Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Haus1Click(Sender: TObject); procedure TabControl1Change(Sender: TObject); procedure SchliessenClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Image3MouseDown(Sender:Tobject;Button:TMouseButton;Shift: TShiftState;X, Y: Integer); private FImages: array of Timage; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin ScrollBox2.Left := Scrollbox3.Width-300; Scrollbox3.Width := Screen.Width+5; Scrollbox3.Height := Screen.Height+3; Scrollbox2.Parent := Scrollbox3; Form1.Height := Screen.Height+5; TabControl1.Left := Screen.Width - (TabControl1.Width + 50); Button1.Visible:= False; Button2.Visible:= False; Button3.Visible:= False; Button4.Visible:= False; Image1.Visible := False; end;
procedure TForm1.SchliessenClick(Sender: TObject); begin Form1.Close; end;
procedure TForm1.TabControl1Change(Sender: TObject); begin If TabControl1.TabIndex= 0 Then begin Haus1.Visible:= True; Haus2.Visible:= True; Haus3.Visible:= True; Haus4.Visible:= True; end else begin Haus1.Visible:= False; Haus2.Visible:= False; Haus3.Visible:= False; Haus4.Visible:= False; end;
If TabControl1.TabIndex= 1 Then begin Button1.Visible:= True; Button2.Visible:= True; Button3.Visible:= True; Button4.Visible:= True; end else begin Button1.Visible:= False; Button2.Visible:= False; Button3.Visible:= False; Button4.Visible:= False; end;
end;
procedure TForm1.Haus1Click(Sender: TObject); begin Form1.Close; end;
procedure TForm1.Button1Click(Sender: TObject); var CursorPosX, CursorPosY : integer; begin Cursorposx := ScreenToClient(Mouse.CursorPos).X; cursorposy := ScreenToClient(Mouse.CursorPos).Y;
Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= 50; FImages[length(FImages)-1].Top:= 50; FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg'); Image1.Visible := true; end;
procedure TForm1.FormDestroy(Sender: TObject); var Component: TComponent; i: integer; begin for i:= 1 to length(Fimages) do begin Component:= FindComponent('Image'+Inttostr(i)); if assigned(Component) then (Component as TImage).Free; end; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin ScrollBox2.Left := Scrollbox3.Width-300; TabControl1.Left := Screen.Width - (TabControl1.Width + 50);
if odd(GetAsyncKeyState (VK_Escape)) then begin PopUpMenu1.Popup(50,50); end;
if boolean(getasynckeystate(ord('K'))) then Scrollbox2.Visible := not Scrollbox2.Visible; end;
procedure TForm1.Timer2Timer(Sender: TObject); var CursorPosX, CursorPosY : integer; begin Cursorposx := ScreenToClient(Mouse.CursorPos).X; cursorposy := ScreenToClient(Mouse.CursorPos).Y;
Image1.Left := CursorPosX-(Image1.Width div 2); Image1.Top := CursorPosY-(Image1.Height div 2);
If Image3.Left < 150 Then begin If CursorPosX < 10 Then Image3.Left := Image3.Left+15; end;
If Image3.Left > -(Image3.Width-Screen.Width+150) Then begin If CursorPosX > Screen.Width-10 Then Image3.Left := Image3.Left-15; If Image3.Left > Image3.Width+150 Then
end;
If Image3.Top < 150 Then begin If CursorPosY < 10 Then Image3.Top := Image3.Top+15; end;
If Image3.Top > -(Image3.Height-Screen.Height+150) Then begin If CursorPosY > Screen.Height-10 Then Image3.Top := Image3.Top-15; end; end;
procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= X; FImages[length(FImages)-1].Top:= Y; FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg'); end;
end. |
Sieht jemand einen Fehler?
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 23.01.08 21:49
Soapy hat folgendes geschrieben: | | ... und es tut immer noch nicht |
Aha. Es tut immer noch nicht. Wenn ich meine Glaskugel nicht gerade eben verloren hätte, dann wüsste ich jetzt, was dieser Fehler ist. Weil die Glaskugel jedoch gerade nicht da ist, wärst du so nett, und erklärst, worin genau dieser Fehler besteht?
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 21:52
Tut mir Leid!
Der Fehler ist der, dass es wenn ich jetzt einen Mausklick mache, das Bild immer noch nicht erscheint!
Wenn ich allerdings auf den Button1 klicke funktioniert alles!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 23.01.08 21:55
Warum regelst du das Klicken über ein Image, wenn du das Symbol "staemme.jpg" dann doch auf einer ScrollBox anzeigen lässt? Es kann sein, dass dein Image das "stämme.jpg" überdeckt. Oder ist das Image3 gar nicht in der ScrollBox? Dann kann das gar nicht klappen.
Regel das ganze am bestem beim Klick auf die Scrollbox.
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 21:59
Das Image ist in der Scrollbox!
Das staemme.jpg wird aber nicht überdeckt von meiner Karte... Ich hab die Karte nämlich auf visible := false gesetzt und dann gings immernoch nicht!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 23.01.08 22:02
Ist die Karte dein Image3? Gib den Komponenten mal vernünftige Namen..
wenn ja:
wenn du die Karte auf visible := false setzt, wird soweit ich weiß auch das MouseDown Event nicht mehr aufgerufen...
Hast du mal einen Haltepunkt gesetzt, ob der da überhaupt durchläuft?
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 23.01.08 22:02
Soapy hat folgendes geschrieben: | | Ich hab die Karte nämlich auf visible := false gesetzt |
Daran liegt es wahrscheinlich. Wenn das Image ausgeblendet ist, auf das du klicken willst, passiert auch nichts.
Mist, zu langsam 
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 22:27
Ja aber als ich es ausgeblendet habe hab ich auch den Code von Image3mousedown in scrollbox3mousedown geändert!
Außerdem wird das Bild nicht verdeckt, da es mit dem gleichen Code von Button1Click auch nicht verdeckt wird!
Oh man...
ich verzweifel noch!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 23.01.08 22:29
Soapy hat folgendes geschrieben: | Ja aber als ich es ausgeblendet habe hab ich auch den Code von Image3mousedown in scrollbox3mousedown geändert!
|
Hast du da einfach nur die Bezeichnung verändert, oder auch das Event neu zugewiesen, nämlich an die Scrollbox?
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Mi 23.01.08 22:31
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Setlength(FImages, length(FImages)+1); FImages[length(FImages)-1]:= TImage.Create(self); FImages[length(FImages)-1].Name:= 'Kaserne'+InttoStr(length(FImages)); FImages[length(FImages)-1].Parent:= Scrollbox3; FImages[length(FImages)-1].height:= 20; FImages[length(FImages)-1].width:= 50; FImages[length(FImages)-1].Left:= X; FImages[length(FImages)-1].Top:= Y; FImages[length(FImages)-1].Picture.LoadfromFile('C:\Dokumente und Einstellungen\Philipp\Eigene Dateien\staemme.jpg'); Image3.Visible := false; end; |
So und oben neu deklariert!
_________________ Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
|
|