| Autor |
Beitrag |
ShinShan
      
Beiträge: 19
|
Verfasst: Di 08.08.06 16:15
Hi,
ich Programmiere seit einiger Zeit an einem Spiel, welches sich über Netwerk spielen lässt. Ich bin jetzt an dem Punkt, an dem ich eine Map gestalten muss. Prinzipiell ist diese KArte in viele kleine einzelne Kästchen aufgeteilt etwa so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| - - - - - - - - - |a|b|c|d|e|f|g|h|i| - - - - - - - - - |a|b|c|d|e|f|g|h|i| - - - - - - - - - |a|b|c|d|e|f|g|h|i| - - - - - - - - - |a|b|c|d|e|f|g|h|i| - - - - - - - - - |
die Buchstaben stehen hier in dem Kästchen.
Jedes Kästchen soll einzeln anklickbar sein.
Komme ich da nicht drum herum für jedes Kästchen ein einzelnes Panel zu verwenden? Ich bräuchte 144 von denen.
Das wir dann mit der Zeit total unübersichtlich.
Außerdem müsste ich für jedes Panel eine eigene PanelClick Prozedure haben.
Bekommt man es auch irgendwie hin so eine Karte zu generieren, ohne für jedes Teil der Karte eine eigene Click-prozedur zu schreiben?
Moderiert von Gausi: Code-Tags hinzugefügt
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 08.08.06 16:30
ja mit einem TImage oder einer TPaintbox oder direkt das Canvas von TForm benutzen
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Di 08.08.06 16:55
oder du erstellst deine panels und proceduren dynamisch... dazu findest du genug topic im Forum, such einfach mal nach "Komponenten dynamisch erstellen" o.ä. ...
mfg
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Di 08.08.06 17:04
Fabian W. hat folgendes geschrieben: | | oder du erstellst deine panels und proceduren dynamisch... dazu findest du genug topic im Forum, such einfach mal nach "Komponenten dynamisch erstellen" o.ä. ... |
Genau! Und als OnClick-Ereignis weist du jedem Panel eine Prozedur mit Sender: TObject zu. In der Prozedur weißt du dann, welches Panel gedrückt wurde.
|
|
huhn
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Di 08.08.06 19:10
ich würde ne eigene visuelle Kompo schwind machn.
Einfach von TGraphicControl ableiten und die breite durch die feldanzahl machn und dann die linien zeichnen, um rauszufinden welches der felder geklickt wurde dann einfach das selbe rückrechnen (am besten mit einer public function (function PointToKoordinaten(x,y:integer;var a,b:integer)  .
wenn du dann noch spizelle bilder zeichnen willst nimmste en image sammlung und lässt sie dir an den knotenpunten zeichnen.
von 144 panels rate ich strikt ab!
mfg huhn
//edit: es gibt noch viele weitere vorteile, so kannst du die karte dann variable erweitern verkleinern. Systemauslastung ist geringer und arbeitsspeicherschonender!
//edit2: wenn es dir um die schönen rahmen geht^^ das kannste dann au mit Canvas.FrameRect(); machn 
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Di 08.08.06 19:54
wow danke für die schnellen Antworten.
Das werde ich dann morgen alles mal versuchen auszuprobieren und mal schaun was am besten geht....
|
|
huhn
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Di 08.08.06 20:10
im anhang en schnelles fertiges bsp
Einloggen, um Attachments anzusehen!
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
Zuletzt bearbeitet von huhn am Di 08.08.06 20:49, insgesamt 1-mal bearbeitet
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 08.08.06 20:26
bsp datein sind tatsächlich maps, aber eher für quake 3 und half life *g*
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Di 08.08.06 20:42
@ F34r0fTh3D4rk
Also ich hab mir deine Map mal angesehen und es gibt 2 Dinge die ich nciht verstehe:
1. property KartenBreite:integer read FKartenBreite write FKartenBreite;
Was ist eine Proberty und was tut das read und write?
2. procedure TMap.PointToKoord(x,y:integer;var KartenX,KartenY:integer);
var tx,ty:real;
begin
tx:=x/(width/FKartenbreite);
ty:=y/(height/FKartenhohe);
was bedeut width und height? die sind nirgends definiert!
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Di 08.08.06 20:43
an sonsten ist das genau das was ich haben wollte.
Also es ist genau richtig und genauso sollte es auch funktionieren.
Danke.
Ich werde dann mal sehen ob ich das auch selber hin bekomme, wenn ich weis was die oben genanneten Dinge sind.
|
|
huhn
      
Beiträge: 272
Erhaltene Danke: 1
WIN XP
D7Pers
|
Verfasst: Di 08.08.06 20:46
zu propertys, schau am besten mal im forum
width und height sind die breite und höhe der komponente ^^
man könnte auch Self.Width sagen, dazu bin ich aba zu faul xD
das mit dem umwandeln muss ich mir nochmal anguckn, wegen dem auf der linie klickn, da soll es nänlich dann -1 rausgeben damit man weiß das er net getroffen hat.
aber ansonsten solltest mit dem ding eigentlich relativ gut klarkommen.
@F34r0fTh3D4rk: uppps peinlich^^ gleich mal korrigieren
_________________ Quod Erat Demonstrandum-Was zu beweisen war! *THX to Chrissivo!*
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Mi 09.08.06 10:02
ja sorry sollte eigentlich
@ huhn da oben stehen..... peinlich..... sorry nochmal
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Mi 09.08.06 12:08
so also ich werde jetzt wahrscheinlich die Panels dynamisch erzeugen lassen.
Das geht ganz gut und ist auch einfach zu realisieren.
Das mit dem Sender werde ich dann auch übernehmen.
Aber 2 Fragen habe ich noch:
Wenn ich jetzt durch den Sender das Panel herausbekomme, das angeklickt wurde, was genau (also in Buchstaben) übermittelt denn der Sender eigentlich?
Und wenn ich jetzt weis, welches Panel angesprochen wurde, und dieses Panel seine aktion durchführen soll (alles andere), da brauch ich doch einen case ... of befehl oder?
In der art:
case Sender of
Panel1:
Panel2:
Panel3:
.
.
.
Das ist auch bei 144 zu viel Schreibarbeit.
Achso und gibt es eine Möglichkeit eine Gruppe von Panels dynamisch zu verändern?
z.B. for i:=1 to x do
panel[i].caption:='Hallo';
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 09.08.06 12:09
schau mal nach FINDCOMPONENT
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Mi 09.08.06 13:56
Der Sender is vom Typ TObject. Ansprechen kannste die entsprechende Kompo also so:
Delphi-Quelltext 1:
| TPanel(Sender).caption := 'Ich wurde geklickt'; |
F2 brauchste kein FindComponent:
Delphi-Quelltext 1: 2:
| for i:=1 to x do Felder[i].caption:='Hallo'; | Is da vollkommen richtig wenn die Panels so erstellt wurden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var Felder: array[0..143] of TPanel; For x := 0 to Length(Felder) - 1 do begin Felder[x] := TPanel.create(self); end; |
mfg
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Mi 09.08.06 15:38
jaa!!!!
genau das brauchte ich.... so simpel!!!!!!!!!!!!!!
ein Array of TPanel... super geht!!!!!
kommt gleich rein in den Quelltext!
DANKE
|
|
_frank_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Mi 09.08.06 17:48
*schüttel* 144 panels...
wenn du nur Klick abfragen willst, sollte die grid.zip von www.fw-web.de/units.htm etwas für dich sein. Bei Drag&Drop wirds dann schwieriger...
HTH Frank
_________________ EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt  )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Mi 09.08.06 19:20
Also ich habs gemacht wie es da oben steht, und Delphi zeigt auch keinen Fehler an.
Allerdings sehe ich die erzeugten Panels nicht. hab auch schon die Farbe und so geändert, aber nichts zu sehen.
Muss ich wenn ich sowas mache auch ein handle benutzen?
|
|
ShinShan 
      
Beiträge: 19
|
Verfasst: Mi 09.08.06 19:52
Das Grid Prog ist auch nicht schlecht.
Es is vor allem sehr einfach zu verstehen.
Aber geht es auch nachdem man rausgefunden hat, welches grid der User getroffen hat, dort dann ein Bild einzufügen?
quasi ein TImage dynamisch an der Stelle zu erzeugen?
.... hab mit Timage und so noch keine Erfahrung. 
|
|
_frank_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Mi 09.08.06 21:25
warum Bild einfügen?
male einfach eins...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var b:TBitmap; begin b:=TBitmap.create; b.loadfromfile(...); canvas.draw(posx,posy,b); b.free; end; |
HTH Frank
_________________ EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt  )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
|
|