Autor |
Beitrag |
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 12:48
Guten Tag Com.
Ich habe eine Funktion geschrieben in dem ich Panels erstelle die eine Click funktion haben. Jedoch habe ich das sehr umstennlich geschrieben und habe mehr oder weniger das gleiche 20x geschrieben was ich mit einem Array ändern möchte
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| for (int ebene1 = anzahl; ebene1 < anzahlmax; ebene1++) { panel.Add(new Panel());
panel[ebene1].Location = new Point(10 + (ebene1 * 21), hoch); panel[ebene1].Size = new System.Drawing.Size(20, 20); panel[ebene1].Name = "Panel" + ebene1; panel[ebene1].BackColor = System.Drawing.Color.White; panel[ebene1].MouseClick += Klicken; this.Controls.Add(panel[ebene1]); panel[ebene1].TabIndex = ebene1;
} |
mit dieser Funktion erstelle ich mehrere Panels neben einander.
Jedoch möchte ich ,dass die Panels auch unter einander sind d.h. das in einer reihe ca. 30 Panels und in der tiefe 60 Panels sind.
Folgendes Problem:
Ich habe ein bischen über Array gelesen (in meinem Buch und im Internet) , weis aber nicht wie ich die beiden sachen mit einander verbinden kann
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 29.08.14 13:18
Jetzt erzeugst du ja schon die Panels in einer Schleife und weißt sie der ControlsCollection zu. Auf der Form werden die somit funktionieren und wenn du die Location richtig berechnest hast werden die auch da liegen wo du die haben willst.
Für welche Aufgabe möchtest du dann jetzt noch das Array verwenden?
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 13:27
Für die tiefe , sodass ich einen rechteck mit panels habe
ich habe dafür schon versucht eine "if" bedingung zu benutzen aber aus irgent einem grund hat der bestimmt variabeln nicht mehr benutzt sodass es nicht so funktioniert hat wie ich es wollte.
ein freund(Java user) von mir meinte ich solle es mit einem Array probieren
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 29.08.14 13:39
Du mußt nur die Location richtig berechnen.
Beispiel für ein (farbloses) Schachbrett mit 20*20 Pixel Feld Größe.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| int Anzahl = 64; int panelPerRow = 8;
for (int i = 0; i < Anzahl; i++) { var panel = new Panel(); panel.Location = new Point(i % panelPerRow * 20, i / panelPerRow * 20); panel.Size = new System.Drawing.Size(20, 20); this.Controls.Add(panel); } |
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 13:52
Sorry aber ich kann dir nicht ganz folgen was deine Location berechnung angeht
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 29.08.14 14:09
Erinnere dich an simple Ganzzahldivision aus deiner Grundschulzeit. Stell die vor alle Panels von links oben nach rechts unten durchzunummerieren.
Als Beispiel nehmen wir jetzt das 15.te Panel(da alles 0. basiert ist hat dieses Panel den gedachten Index 14). Auf einem Schachbrett wäre es in der 2.ten Reihe an der 7.ten Spalte. Wie bekomme ich die Reihe raus in die das Panel gehört? Man teilt durch die Panelbreite also 14 : 8 = 1 Rest 6. Da alles 0.basiert entspricht 1 der 2.ten Reihe und 6 der 7 Spalte. Voila.
Die x Position ist also der Rest der Ganzzahldivision (% ist der Modulo Operator also der Divisionsrest). Für eine sinnvolle Spaltenbreite multiplizieren wir das noch mit der Panelbreite also
(Index % AnzahlSpalten) * Spaltenbreite
Die y Position ist der normale Ganze Anteil der Ganzzahldivision wiederum multipliziert mit der Zeilenhöhe. Also
(Index / AnzahlSpalten) * Spaltenbreite
Und x,y schmeißt man dann halt in einen Point und weißt den der Location zu.
Für diesen Beitrag haben gedankt: DonKannallie
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 14:29
Aso , verstehe - vielen dank!
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 29.08.14 14:32
Die andere Möglichkeit wäre ein zweidimensionales (rectangle) Array:
C#-Quelltext 1:
| Panel[,] panels = new Panel[MaxX, MaxY]; |
Und dann mit zwei ineinander verschachtelten Schleifen für x und y die Panels erzeugen.
Die Frage, welche Version besser ist, hängt dann damit zusammen wie man die Panels indizieren möchte (also eindimensional oder zweidimensional).
Für diesen Beitrag haben gedankt: DonKannallie
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 15:43
Jetzt stellt sich die frage für mich (bei Ralf Jansen's version)
wie kann ich ein einzelnen Panel ansprechen?
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 29.08.14 15:56
Zitat: | wie kann ich ein einzelnen Panel ansprechen? |
Warum? Ohne kann man nicht wirklich was sinnvolles raten. Das hat ja eventuell schon bei meiner letzten Rückfrage nach "Für welche Aufgabe" nicht funktioniert.
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 16:43
Ich will den Panels bestimmte farben zuweisen
Das Programm soll eine hilfe für ein Spiel sein was ich derzeitig spiele - mit den Panels soll man einen weg machen welche monster durch rennen müssen dabei gild es den weg möglichst lang zumachen auf eine bestimmt fläche
mit den färbungen möchte den anfang und das ende des bau bereiches zeigen
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 29.08.14 17:17
Okay dann alles zurück auf 0
Du beginnst dein Spiel von der visuellen Anzeige zu denken das ist problematisch.
Beginne mit der Spiellogik also mit einer Datenstruktur die die aktuelle Situation beschreibt.
Wenn du diese Struktur hast dann überlege dir wie du die auf den Bildschirm bekommst.
Diese Struktur könnte im einfachsten Fall auf ein Array hinauslaufen. 2-Dimensional um jede Spielfläche zu beschreiben. In den Zellen wären aber keine Panels. Sondern etwas das den Zustand diese Fläche beschreibt. Also so Infos wie "ist ein Weg", "ist eine Mauer", "ist der Anfang", "ist das Ende", "hier befindet sich ein Spieler", " hier befindet sich ein Monster" oder was auch immer und irgendwelche weiteren Information die man zur Logik des Spiels braucht. Wenn du die hast dann kannst dir das Mapping dieser Struktur auf den Bildschirm überlegen. Z.B. mit einer adäquaten Matrix von Panels. Wobei 30 * 60 Panels grenzwertig ist. Window Handles sind eine knappe Resource und jedes Panel braucht eine. Wenn man die zu verschwenderisch benutzt zeichnet irgendwann deine Anwendung nicht mehr weil Handles aufgebraucht sind. Wenns dumm läuft zeichnet nicht nur nicht mehr deine Anwendung sondern kein Prozess mehr.
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Fr 29.08.14 17:49
okay ich glaube du hast ich faltsch verstaden
so weit wollte ich nicht gehen
nochmal von vorn mit details
Das spiel ist ein Tower Defense spiel - da ich es mit mehreren leuten spiele und man nur wenig zeit hat um die Tower zubauen muss man sich schon im klaren sein wie man seine "maze" bauen möchte
dieses Programm soll helfen damit man vor dem spiel und auch in späteren spielen sich richtig drauf vorbereiten kann - ob sie letzt endlich auch sehr wirklich erweist ist dem überlassen der sie baut
ich habe ca. >1000 Panels , ich habe eine version des Programms schon fertig wo alles tiptop läuft jedoch gefällt es mir von der programmieren nicht da ich nur mit unnötiger mühe änderungen dran vornehmen kann , daher auch die frage nach dem Array
|
|
hekolliko
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 2
|
Verfasst: Mo 01.09.14 16:55
Wow du nimmst dir ja einiges vor ... Aber .. gute Frage, bin gespannt auf den Lösungsansatz!
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Di 02.09.14 15:08
naja eig. ist es relativ einfach wenn man mehr anhnung hat als ich aber danke
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 02.09.14 15:59
naja wir würden auch helfen wenn wir das Problem verstehen würden
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Di 02.09.14 17:29
Würde es helfen wenn ich das Programm irgentwie hochladen würde?
wenn ja wo kann man das den machen?
|
|
Ralf Jansen
Beiträge: 4700
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 02.09.14 17:45
Deinen Project Ordner einfach zippen, vorher den bin und object Ordner löschen wir brauchen ja nur die Sourcen, und hier anhängen.
Es würde aber auch reichen wenn du erklärst was dein Programm tun soll. Du bist leider nicht genauer geworden als das du du eine Matrix von Panels hast die dir irgendwie bei der Planung für ein Spiel helfen soll.
|
|
C#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Di 02.09.14 22:24
Hmm. Also wenn ich dich richtig verstehe, dann willst du so eine Art "Paint für Arme". Ich hab mal selber ein bisschen gecoded und das Projekt in den Anhang gehängt.
Mit der linken Maustaste wird das Feld mit der entsprechenden Farbe markiert und mit der Rechten wieder gelöscht.
EDIT
Hab noch eine zweite Version gemacht. Die erste Version arbeitet mit Panels, die zweite hingegen arbeitet mit Graphics (finde ich die bessere Lösung) und hat noch ein extra Feature. Vergleiche mal die beiden Versionen.
Einloggen, um Attachments anzusehen!
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Für diesen Beitrag haben gedankt: DonKannallie
|
|
DonKannallie
Beiträge: 16
|
Verfasst: Mi 03.09.14 14:13
Hmm ich wüsste jetzt auch nicht genau was es da noch mehr zu erklähren gibt.
aber gut , auf ein neuen versuch
das programm hat die panel matrix.
wenn ich auf ein panel klicke , soll sich die farbe des angeklickten panels ändern:
Links klick : Schwarz
Mausrad klick : Rot
Rechts klick : weiß
es gibt 2 anfänge und 1 ende (man kann sich das feld wie ein gedrehtes "T" vorstellen
ich möchte gerne die anfänge und das ende makieren.
Problem :
Ich habe die Panels Dynamisch erstellt aber weis nicht genau wie ein Panel sagen kann das es keine funktion und nur die farbe blau haben soll.
danke C# du hast eine weitere lösung in deinem Programm. Ich wollte als nächsten schritt das Speichern ermöglichen wusste aber noch nicht genau wie ich dass anstellen - leider reicht mein wissen bei weitem nicht das zu verstehen was du da "gezaubert" hast
hier ist mein Projekt - vl. hilft es auch noch weiter
Einloggen, um Attachments anzusehen!
|
|