Abfrage, welche PictureBox geklickt wurde

Rockstady11

Mitglied
Hallo @ all,

ich versuche mal mein Problem darzulegen.

Ich erstelle mir zur Laufzeit ein "Spielfeld", welches unterschiedlich groß ist, aber aus beispielsweise 100 PictureBoxen besteht, die wie ein Schachbrett, also von der Anordnung, aufgebaut ist.
Später soll es mal ein Spielfeld im Sinne einer Tile-based-Map werden. Ich möchte nun dafür eine Art Map-Editor bauen und man sollte die jeweiligen Hintergründ auf die PictureBoxen verteilen können.

Nun möchte ich gerne wissen, wie kann ich auslesen, auf welche PictureBox der User gerade geklickt hat. Das On-Click-Event zu verwenden und hierbei eine Art Übergabeparameter zu verwenden ist sehr umständlich und wird wahrscheinlich auch nicht direkt funktionieren, da alles erst zur Laufzeit erzeugt wird.
Eine Berechnung über die Koordinaten möchte ich auch nicht als primäre Lösung, da die einzelnen PictureBoxen nicht immer gleich groß sind und mir diese Lösung als unsauber erscheint.

Gibt es eine Möglichkeit sozusagen abzufragen, auf welches Steuerelement der User geklickt hat? Ich hoffe ihr versteht, was ich meine.

Über Antworten wäre ich sehr dankbar.

Mit freundlichen Grüßen

Rockstady11
 
Hi

Wieso ist es nicht möglich, zur Laufzeit ein Event zu abonnieren? :confused:

C#:
PictureBox pb = new PictureBox();
// Code für Größe, Position etc
pb.Click += new EventHandler(PictureBoxClick);

// weitere Code

private void PictureBoxClick(object sender, EventArgs e)
{
    if(sender is PictureBox)
    {
        PictureBox pb = (PictureBox)sender;
        // mach was mit pb
    }
}
 
Sorry, habe mich wohl falsch ausgedrückt, ich weiß nicht, wie es zu realisieren ist.

Ich verwende VB.NET, sorry vergessen.

Wie kann ich hier den Eventhandler deklarieren? Ich bekomme es nicht hin.

vielen Dank für die Antwort.
 
Hi

Das Prinzip ist in VB.NET das gleiche:
Du erstellst die PictureBox und abonnierst das Click-Event.
Das EventHandler Delegate wird vom .NET Framework mitgeliefert und erwartet im Konstrutor eine Verweis auf die Funktion, die beim Auslösen des Events aufgerufen werden soll. Diese MUSS als Parameter eine object-Parameter und einen EventArgs-Parameter entgegennehmen können.
EventHandler-Klasse: http://msdn.microsoft.com/en-us/library/system.eventhandler(VS.80).aspx
Behandeln von Events: http://msdn.microsoft.com/de-de/library/2ccyd347.aspx
 
Eine Berechnung über die Koordinaten möchte ich auch nicht als primäre Lösung, da die einzelnen PictureBoxen nicht immer gleich groß sind und mir diese Lösung als unsauber erscheint.

Ich würde gerade eine 2D Spiel Welt mit festen Einheiten definieren.
Ich hatte damals zum Beispiel in meinem Spiel (habs nie weiter als bis zum Leveleditor verfolgt :D ) 16*16 Blöcke gehabt.

So machst du es dir aufjedenfall einfacher mit Kollisionsprüfungen.

Die Korrdinaten Prüfung selbst ist auch relativ einfach zum einen besitzt das Rectangle die Methode Contains mit der du ein Point vergleichen kannst oder die statische Methode Intersect die dir sagt ob sich Rectangles überschneiden.
 
Und wo wäre jetzt der Unterschied zur dynamischen Erzeugung der Controls? :confused:
Die Controls kennen sowohl ihre Position als auch ihre Größe!
 
Nagut hab es vielleicht nicht ganz richtig beschrieben.

Er will ja zum Beispiel einen Leveleditor erstellen und aus seiner Frage erkennt man ja das er noch nicht fortgeschritten ist.

Da bietet sich eine einhetliche EInheit an.

Man nehme zum Beispiel meinen alten Leveleditor:
http://www.iv-interactive.de/tua/screens/bg_worldEditor.png

Grass, Wasser Sand wurden alle über 16*16 Blöcke definiert, im unteren Abschnitt sieht man auch einen Raster wie man die Bodenflächen auswählen konnte.

Die Objekte selbst werden auch wieder über 16*16 Blöcke definiert.
http://www.iv-interactive.de/tua/screens/bg_bmpEditor.png

Die Bäume, Häußer etc. brauche ich jetzt blos immer an den 16*16 Blöcken ausrichten.

Der Vorteil hier ist einfach das ich mich nicht mit tieferer Mathematik beschäftigen muss wenn es um Wegfindung oder Kollisionen geht.
Ich hab immer die 16*16 Blöcke die ich abprüfen muss.

Aber ist halt eh nur ein Weg von vielen.
 

Anhänge

  • Release.zip
    2,1 MB · Aufrufe: 22
Zuletzt bearbeitet:
Moin

Ok, dann hatte ich dich falsch verstanden. Ich dachte er hätte aus deiner Sicht dann einen Vorteil, wenn er alle PictureBoxen fest auf die Form packt. Von der Größe her wäre ich im ersten Schritt defenitiv auch für eine feste Matrix. Die kann aber auch ohne Probleme zur Laufzeit erzeugt werden.
 
So, erst mal danke für eure Antworten.

Ich habe mal einen aktuellen Screenshot hochgeladen, soll nur veranschaulichen, was ich meine, dass es bis jetzt nicht toll aussieht, weiß ich selbst, ist aber auch noch nicht das Ziel gewesen.

@ Spyke: Dein Level-Editor sieht schon richtig klasse aus, gefällt mir gut, aber meiner soll erst mal deutlich einfacher werden.

Ich hätte es gerne so, dass man zu Beginn die Größe der Map auswählt und dann an der Seite auswählt, welche Textur ausgewählt ist. Die jeweils ausgewählte Textur soll dann auf die geklickte Fläche der Map übertragen werden, leider weiß ich immer noch nicht, wie ich den Namen der jeweils geklickten Fläche herausbekomme?

Im Hintergrund meiner Map liegt ein zweidimensionales Array, in dem Zahlen gespeichert werden, diese werden dann praktisch nur durch Bilder optisch dargestellt. Mit der Kollsionsabfrage habe ich es so, dass die Figur nur bewegt werden kann, wenn der Wert des Feldes nebenan z.B. 1 ist. Hoffe dies ist verstänlich. Ob es auch eine gute Lösung ist, weiß ich nicht.
Bei mir kann sich die Figur jeweils nur um ein ganzes Bild verschieben, Teilsprünge sind nicht möglich.

Mit dem Eventhandler bin ich irgendwie etwas überfordert. Könntet ihr mir hier bitte nochmals helfen? Ich bekomms halt nur gebacken, wenn ich Doppelklick auf die PictureBox mache, aber selber als allgemeine Funktion für alles PictureBoxen verstehe ich leider nicht. ;)

MfG Rockstady11
 

Anhänge

  • Screen.gif
    Screen.gif
    48,4 KB · Aufrufe: 41
Wie hast du das Click Ereignis der Pic.Boxen zugewiesen?
Bei der zugewiesenen Click Methode hast du ja 2 Parameter
object sender
EventArgs e

Im Parameter sender bekommst du zurück welches Objekt das Ereignis ausgelöst hast.
In deinem Fall wären es die PictureBoxen.

Code:
PictureBox pic = sender as PictureBox; //castet sender nach PictureBox, wenn sender nicht vom Objekt PictureBox wird null gesetzt

if(pic != null)
{
   //tu was
}

Und falls du 2D Bilder brauchst, schau mal hier:
http://reinerstileset.4players.de/

Edit:
Ups seh gerade genau das gleiche hatte ja Nico auch schon gepostet, also wo genau ist das Problem?
 

Neue Beiträge

Zurück