| Autor |
Beitrag |
herni
      
Beiträge: 20
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 14:41
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 02.03.06 14:46
(a) Nimm ein Image als Spielfeld
Delphi-Quelltext 1:
| Canvas.Draw (0,0,Bitmap); |
zeichnet dann die entsprechende Bitmap an die Stelle
(b) OnClick (Sender: TObject) gibt den Image1 in Sender zurück
(c) merke Dir in einen Extra-Array, welcher Spielstein wo ist, dann weißt Du auch welches Bitmap wohin kommt!
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
herni 
      
Beiträge: 20
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 16:51
OK, aber wie realisiere ich dann jetzt ein OnClick Ereignis? Weil ich hab dann ja nicht mehr die in meinem Fall 24 Bilder als eigenständige Komponente auf meinem Form. Oder wie ist das gemeint?
|
|
herni 
      
Beiträge: 20
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 17:08
Es geht im übrigen um das Brettspiel Mühle, hatte ich vergessen zu erwähnen. Ich habe also ursprünglich gedacht ein ganz normales Image als Spielfeld zu nehmen, wie du ja auch geschrieben hast. Da drauf habe ich dann 24 TImages gelegt die alle zum Start ein transparentes .bmp Bild geladen haben. Also quasi leer sind. Nun wollte ich das Setzten der Steine eben so angehen, dass wenn ich eines dieser TImages anklicke geguckt wird ob das Feld leer ist, also das transparente Bild geladen ist und wenn das so ist soll eben ein neues Bild geladen werden. Da ich nun aber nicht für jedes Bild eine eigene OnClick Prozedur machen wollte habe ich alle OnClick Ereignisse auf die selbe Prozedur verwiesen und wollte dann quasi dort gucken welches TImage jetzt die Prozedur ausgelöst hat.
Deinen Vorschlag habe ich insofern verstanden das ich mir eine PaintBox bastel und dann mit Paintbox.Canvas.Draw(x,y,Bild); mir die 24 Felder eben so baue. Und die Information ob das Feld leer ist, mit schwarz oder weiß besetzt ist eben in einem extra Feld speicher. Das heißt also ich baue mir 24 Array mit Koordinaten und der Info ob leer, schwarz oder weiß richtig? Nur mein Problem ist eben nun (also ich bin absoluter Leie  ) wie ich nun die OnClick's mache. Kann ich denn sagen wenn ich im Umkreis von was weiß ich 20 Pixeln um x,y klicke rufe eine Prozedur auf?
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 02.03.06 19:59
Wenn Du weißt auf welche Koordinaten das Bitmap kommt, dann fragst Du einfach ab ob X zwischen DrawX und DrawX+20Pixel etc ist, ja dann diese Kästchen nein, teste das nächste!
OnMouseMove liefert die Koodrinaten das Mausclicks oder du nimmst onMouseUp, dan weißt Du gleich alles!
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Sinspin
      
Beiträge: 1337
Erhaltene Danke: 119
Win 10
RIO, CE, Lazarus
|
Verfasst: Do 02.03.06 20:39
wenn ich dich richtig verstanden habe hast du jetzt ein bild das virtuell aus 24 einzelnen feldern besteht.
willst du nun herausbekommen wohin geclickt wurde so verwendest du onMouseUp. dieses liefert dir die position an der die maus loßgelassen wurde mit.
dir ist ja bekannt wie groß jedes einzelne deiner felder ist. (alle sind sicher gleich groß). die position die dir geliefert wird ist relativ zu der linken oberen ecke deines spielfeldes. teilst du nun die mauskoordinaten jeweils durch die breite oder höhe deiner felder kannst du die position der zusätzlichen werte in deinem array bestimmen.
zusWerte:array[0..spielfeldzeilen-1,0..spielfeldspalten-1] of record (deine daten);end;
die berechung für die jeweiligen daten erfolgt dann:
zusWerte[maus-y div feldhöhe, maus-x div feldbreite]
beginnst du die array indices nicht mit null muss du im index jeweils eines addieren.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
herni 
      
Beiträge: 20
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 21:48
Jetzt versteh ich gar nichts mehr
Es muss doch irgendwie möglich sein
1. Bei einem OnClick Ereignis auf ein Image zu prüfen welches Bild da geladen ist oder nicht?
2. Das man in der OnClick Prozedur eben rausbekommt auf welches Image geklickt wurde?
Oder geht das beides etwa nicht?
|
|
Sinspin
      
Beiträge: 1337
Erhaltene Danke: 119
Win 10
RIO, CE, Lazarus
|
Verfasst: Do 02.03.06 22:15
das musst du doch nicht über den sender ermitteln. es ist viel einfacher wenn du dir das in einem extra datensatz merkst.
es ist auch sinnvoller mit nur einem bild zu arbeiten und alle bilder an entsprechende positionen in dieses bild zu zeichen. und genau dafür waren meine ausführungen. eben um zu berechnen auf welches der bilder (die du ja gemeinsam in einem bild anzeigst) gerade geclickt wurde.
so kannst du belibig viele informationen parallel speichern.
eine andere lösung wäre es TImage abzuleiten und so die zusätzlichen werte im image zu speichern.
dann könntest du jedes image einzeln anzeigen und das onClick ereignis verwenden.
du müsstest dann bloß im onClick den sender auf dein abgeleitetes TImage casten und die jeweiligen werte abfragen oder ändern.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TNewImage= class(TImage) public private end
procedure tform1.newImage1Click(Sender:TObject); begin TNewImage(Sender)."deine daten"... end; |
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
herni 
      
Beiträge: 20
Erhaltene Danke: 1
|
Verfasst: Do 02.03.06 22:48
letzteres scheint das zu sein was ich möchte. Danke! Leider bin ich wie gesagt Leie und mit "casten" kann ich nicht so richtig was anfangen.
Also so sieht das bei mir aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type TForm1 = class(TForm) Image1: TImage; P1: TImage; P2: TImage; . . . . P23: TImage; P24: TImage;
procedure WeissSetzt(Sender: TObject); |
So, also ich habe da eben 24 einzelne Images und halt noch das Image1 (Das ist einfach das komplette Spielbrett als Bild (sozusagen der "Hintergrund"))
Was ist bei dir "new"??
Kannst du deine Idee vielleicht an meinem konkreten Code jetzt mal zeigen, vielleicht verstehe ich das dann. Wie gesagt, in der Prozedur WeissSetzt möchte ich jetzt rausbekommen ob nun P1, P2, P3........ oder P24 angeklickt worden ist. Und ich möchte diesem PX dann ein Bild zuweisen, also PX.Picture.LoadFromFile('irgendwas.bmp'); und ich möchte gucken können ob ein bestimmtes Bild geladen ist in PX
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt
|
|
Sinspin
      
Beiträge: 1337
Erhaltene Danke: 119
Win 10
RIO, CE, Lazarus
|
Verfasst: Do 02.03.06 23:22
eigentlich habe ich dir schon alles nötige gezeigt um das problem zu lößen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| ... procedure WeissSetzt(Sender: TObject); begin if TImage(Sender).Name='P1' then TImage(Sender).Loadfromfile('irgendwas.bmp'); if TImage(Sender).Tag=0 then begin TImage(Sender).Loadfromfile('weiss.bmp'); TImage(Sender).Tag=1; end; end; ... |
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
herni 
      
Beiträge: 20
Erhaltene Danke: 1
|
Verfasst: Fr 03.03.06 18:34
Danke Danke Danke
Jetzt hab ich das begriffen und auch gleich probiert. Und es funktioniert, auch die Idee mit dem Tag ist Klasse. Da mach ich einfach ne 0 für leer 1 für weiss und 2 für schwarz. Also Vielen Dank, hast mir sehr geholfen.
P.S.: Du bist mein Held 
|
|