Frage von BENNIBOZz3352, 70

Wie löse ich das folgende Problem in csharp am elegantesten?

Aaalllsssoooo:ich bin momentan dabei ein kleines einfaches spiel mit c# zu programmieren und es gibt unter anderem in diesem spiel 2 "punkte" die sich abschießen sollen können mit 1 schuss pro Match.meine lösungs Möglichkeit wäre ein unsichtbares panel mit den punkten mitwandern zu lassen und wenn man dann auf schießen drückt dieses panel sichtbar wird und in richtung ziel fliegt und wenn das panel die location von dem ziel hat dem ziel health abgezogen wird.aber da gibt es sicher noch eine elegantere lösung ,oder? Danke für antworten(2d spiel)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von procoder42, 56

Erklär mal gescheit was du jetzt eigentlich willst. Das ist grammatikalisch so falsch, dass man den Sinn nur erahnen kann.

Kommentar von BENNIBOZz3352 ,

also ich habe punkte die sich über ein spielfeld von links nach rechts bewegen. einen davon steuert man selbst.man soll schießen können auf andere punkte.meine lösungs Möglichkeit wäre ein unsichtbares panel mit dem punkt wandern zu lassen,also wenn man den punkt steuert sich das panel genauso mitbewegt.wenn dann auf schuss gedrückt wird soll dieses panel sichtbar werden und fliegen also jenachdem ob auf schuss nachoben oder schuss nach unten gedrückt wird die entsprechende richtung.und falls das panel dann einen punkt trifft (mit der if abfrage if panel location=location vom punkt )soll der punkt nichtmehr da sein.aber da das sehr umständlich ist und man verdammt viele panels erzeugen muss,gibt es dich sicher noch einfachere/bessere lösungen für dieses problem

Kommentar von procoder42 ,

Warum willst du denn ein Panel benutzen ? Erzeug doch einfach ein Rechteck/Punkt was auch immer, um den Schuss darzustellen.

Und das Objekt selbst kann man auch erst beim Abschuss erzeugen. Ansonsten muss man andauernd ein Objekt mitberechnen, welches nicht gebraucht wird (=> ineffizient)

Kommentar von BENNIBOZz3352 ,

und wie macht man das? ein objekt beim schuss erzeugen?

Kommentar von regex9 ,

Wie darf man diese Frage verstehen?

Sobald der Spieler die Taste drückt, die den Schuss im Programm auslöst, wird innerhalb des Event Handlers, der das KeyEvent behandelt, ein neues Objekt erzeugt, welches sich orthogonal zum Spielerpunkt nach oben/unten bewegt. 

Kommentar von procoder42 ,

Genau so habe ich das verstanden.

Mein Vorschlag bestand nun darin, erst bei Tastendruck ein Objekt (also nen Punkt, Rechteck oder was auch immer den Schuss visualisieren soll) zu erzeugen.

Für jeden der Spieler ein Panel mitlaufen lassen, ist ziemlich sinnlos, da das Panel womöglich gar nicht gebraucht wird.

Zur Erzeugung : Ich schließe mal aus deinen anderen Fragen, dass du dich immer noch an Unity versuchst ? In den Fall solltest du dir mal die Dokumentation anschauen.

Kommentar von BENNIBOZz3352 ,

aber mit welchem befehl erzeugt man solch ein objekt?

Kommentar von BENNIBOZz3352 ,

nein.nicht unity in visual studio.gibt es irgendeinen befehl ider eine methode z.b. Buttonshootup_click() create.new.panel(oder viereck oder was auch immer) gibt es solch einen befehl oä. ? wie würdest du das machen???

Kommentar von EightSix ,

Panel p = new Panel();

Kommentar von BENNIBOZz3352 ,

danke

Antwort
von CrystalixXx, 35

Wenn ich mir so deine Fragen anschaue, dann programmiere kein Spiel, sondern lerne deine Programmiersprache. Du versuchst (warum auch immer) jedes Problem mit einem Panel zu lösen - das ist echt schräg.

Vorallem Spiele sind deutlich schwieriger als übliche Desktop-Anwendungen, weil diese häufig andere Techniken, Denkweisen und vorallem objektorientierte Programmierung erfordern. Letzteres ist bei Spielen besonders wichtig.

Um aber noch auf deine Frage einzugehen: klug wäre es, wenn du alles über ein einziges Steuerelement abwickelst. Du erzeugst dir ein UserControl und arbeitest hauptsächlich mit der OnPaint-Methode, d.h. du erledigst alle Darstellungen über GDI+. Dann brauchst du dich auch nicht mit der Erzeugung irgendwelcher resourcenfressender Steuerelemente befassen, die eigentlich nur einen farbigen Punkt darstellen sollen. Du zeichnest dann deine beiden Spieler an ihren Positionen und zeichnest dann dein Geschoss.

Die Positionen werden verändert, wenn der Benutzer Tastatureingaben tätigt, dafür könntest du die OnKeyDown-Methode überschreiben und darauf reagieren. Für das Schießen gilt dies analog.

Kommentar von BENNIBOZz3352 ,

ich kann c# noch nicht richtig.ich probiere so kleine spiele zu programmieren um zu üben.

Kommentar von CrystalixXx ,

Wenn du direkt mit der Programmierug von Spielen anfängst, dann lernst du wenig - eben aus den besagten Gründen. Erst, wenn du die wesentlichen Grundzüge von objektorientierter Programmierung verstanden hast, könntest du darüber nachdenken damit anzufangen. Alles andere ist im Grunde verschwendete Zeit.

Fang mit einfachen Anwendungen an. Solchen, die relativ einfach gestrickt sind.

  • einen Taschenrechner
  • Darstellung mathematischer Funktionen inkl. diverser Berechnungen
  • ein Programm zum Rechnen mit komplexen Zahlen oder Vektoren
  • ein Programm zum Auswerten Bool'scher Ausdrücke
  • einen Texteditor
  • einen Dateiexplorer
  • einen Taskmanager

Da gibt es viele Möglichkeiten. Viele davon kann man auch mit steigenden Programmierkenntnissen erweitern und verbessern.

Meiner Meinung nach ist beispielsweise das Programmieren eines Dateiexploreres hilfreich. Als Anfänger benutzt man einfach nur ein ListView zur Darstellung der Dateien und Ordner - fertig. Das kann man mit einer TextBox für den Dateipfad erweitern, oder verschiedenen Ansichten für die Dateien. Ein eigenes Eigenschaften-Fenster, was verschiedene Informationen zur jeweiligen Datei anzeigt, einer Menüleiste mit unterschiedlichen Funktionen und so weiter. Mit entsprechenden Kenntnissen kannst du dann den Windows-Explorer täuschend echt nachempfinden.

Solche Anwendungen kann man mit steigendem Wissen verbessern und bekommt neue Ideen, was man wie machen könnte. Dann kann man ganz gezielt nach Lösungen suchen und so sein Wissen erweitern.

PS: Ich empfehle zum Lernen immer Bücher. Macht sich beim Programmieren viel besser, wenn man ein entsprechendes Buch neben sich liegen hat, als digital auf dem (Zweit-)Monitor.

Kommentar von BENNIBOZz3352 ,

habe mir vorgestern das buch schroedinger lernt c# gekauft mit knapp 1000 seiten.ein wenig c#kann ich aber also methoden schreiben,konstruktoren,schleifen,verzweigungen usw. habe auch schon ein zahlen raten spiel programmiert,dass auf zeit geht und ein menü usw. hat und man den schwierigkeitsgrad ändern kann. was genau sollte man können um anzufangen kleine Spiele zu programmieren??????( also z.b. ein 2d runner mit schlechter Grafik also die figur ist z b. nur ein punkt)

Kommentar von CrystalixXx ,

Lässt sich so einfach nicht sagen, weil du sicherlich andere Vorstellungen von so einem simplen Jump'n'Run Spiel als ich.

Es geht aber wohl darum, dass du selbst erst einmal verstehst, was du machen musst und das Problem in Worte fassen kannst. Je einfacher du ein Problem beschreiben kannst, desto einfacher kannst du die Lösung in Form von Programmcode umsetzen. Wenn du zum Beispiel weißt, dass die Bewegung deiner Figur nichts andere ist als eine Änderung seiner Koordinaten, dann weißt du, wo du ansetzen musst, um deine Figur bewegen zu lassen.

Es ist auch wichtig zu wissen, dass nicht alles, was man auf der Oberfläche sieht, irgendein existierendes Steuerelement sein muss. So muss ein Geschoss auch kein Panel sein, sondern kann im Programmcode als Point-Objekt vorliegen. Sichtbar wird es dann durch Zeichenoperationen im Paint-Ereignis oder vergleichbares. Das gleiche gilt für ein Hindernis, zum Beispiel einer Kiste, über die der Spieler springen muss. So eine Kiste kann man als Rectangle-Objekt (mit den 4 relevanten Eigenschaften X, Y, Width, Height) hinterlegen. Einfach weiter lernen, dann kommt sowas schon ganz von alleine. Viel Erfolg!

Kommentar von BENNIBOZz3352 ,

danke für die ausführlichen Antworten:),ich kann die basics von csharp,mein problem ist,dass ich die Lösungen zwar finde ,diese aber oft unnötig kompliziert sind.Ist das Buch schroedinger lernt c# gut?bzw kennst du es?

Kommentar von CrystalixXx ,

Nein, das Buch kenne ich nicht. Dazu kann ich leider nichts sagen. Ich kann zu C# auch keines empfehlen, weil ich nur welche zu VB.Net habe.

Kommentar von BENNIBOZz3352 ,

wieso lernt man deiner Meinung nach am meisten,wenn man versucht einen explorer zu programmieren? lernt man bei dem,was ich mache(dieses spiel)weniger/nichts?

Kommentar von CrystalixXx ,

Ich schrieb nicht, dass man dabei am meisten lernt. Aber er eignet sich gut um einen Lernprozess zu begleiten, weil es viele einfache Dinge gibt, aber man auch viele schwierige und komplizierte Dinge implementieren kann.

Das gleiche trifft aber beispielsweise auch auf einen Texteditor zu. Es war ja nur ein Beispiel.

Bei einem Spiel lernt man als Anfänger - meiner Meinung nach - nichts, weil dort kein Prozess von Anfänger bis Experte durchlebt werden kann. Im Grunde beginnt der Prozess bei Fortgeschritten. (Wo auch immer man die Grenze zwischen den Gruppen zieht.)

Kommentar von BENNIBOZz3352 ,

habe gerade ein problem: ich will eine methode schreiben am die man per parameter einen namen eingibt der in string eingespeichert wird.dieser name soll dann als name für das in der methode erzeugte panel verwendet werden.ich hab das jetzt so gemacht: private void newPanel(string name) {panel eingabename= new panel} wieso darf ich dort die variable eingabe name nicht als name benutzen?muss ein name eine konstante sein?wie mach ich das?

Keine passende Antwort gefunden?

Fragen Sie die Community