unendlich viele Graphics mit List<T> zeichen
-
Danke.
Ich habe meinen Code nun entsprechend modifiezerit, aber nun hat sich ein weiteres Problem ergeben:Der wird der Ball dauernd an der Position (0,0) gezeichnte, also weiß ich nicht, ob es funktioniert, bzw. mehrere Bälle gezeichnet werden.
Ich denke es liegt an dieser Stelle hier:
[cs]private void Form1_MouseClick(object sender, MouseEventArgs e) { [b]Point Maus = PointToClient(MousePosition); ball.X = Maus.X; ball.Y = Maus.Y;[/b] Bälle.Add(new Ball()); Refresh(); }[/cs]
Aber es hat auch geklappt wie ich immer nur einen Ball zeichnen konnte. Muss ich da noch etwas beachten?
Der Code ist immoment so:
[cs]using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Punkte_zeichnen { public partial class Form1 : Form { public Form1() { InitializeComponent(); } struct Ball { public int X; public int Y; public void DrawBall(Graphics g) { g.FillEllipse(new SolidBrush(Color.Green), X, Y, 5,5); } } Ball ball; private List<Ball> Bälle = new List<Ball>(); private void Form1_MouseClick(object sender, MouseEventArgs e) { Point Maus = PointToClient(MousePosition); ball.X = Maus.X; ball.Y = Maus.Y; Bälle.Add(new Ball()); Refresh(); } } private void Form1_Paint(object sender, PaintEventArgs e) { foreach (Ball ball in Bälle) ball.DrawBall(e.Graphics); } private void Form1_Load(object sender, EventArgs e) { } private void timer1_Tick(object sender, EventArgs e) { } } } [/cs]
Mongole
-
1. Umlaute in Variablennamen sind GAAAANNZZZZ schlecht
2.private void Form1_MouseClick(object sender, MouseEventArgs e) { Point Maus = PointToClient(MousePosition); Ball ball = new Ball(); ball.X = Maus.X; ball.Y = Maus.Y; Baelle.Add(ball); Refresh(); }
du musst auch den Ball hinzufügen den du jedesmal beim klick erzeugst.
-
Mein Code sollte nur das Prinzip verdeutlichen, du solltest das nicht so 1:1 übernehmen. Du musst natürlich das Ball-Objekt, dass du mit den Koordinaten gefüttert hast der Liste hinzufügen und nicht noch eine Neues.
Allerdings solltest du dir überlegen ob dein System so noch funktioniert wenn du mehrere Bälle hast, wenn du allen die Mauskoordinaten zuweist befinden sich alle an der gleichen Stelle und es ist effektiv wieder nur ein Ball zu sehen.PS: Nimm mal bitte die überflüssigen Whitespaces raus, das bläht deine Beiträge nur zusätzlich auf und macht sie unübersichtlich.
-
1.Ich weiß aber es kürzt die Variable etwas ab und da mein Programm ja noch in der BetaPhase ist und deswegen noch nicht weltweit verbreitet werden kann, kann ich die Umlaute noch drinnen lassen^^(Ich weiß ich bin etwas größenwahnsinnig
)
2.
Danke es hat geklappt. Du meinst wenn ich soviele Bälle habe, dass überall Bälle sind? Ja dann mach ich halt ein Limit oder eine Abfrage, ob diese Stelle schon nen Ball hat(wird schwierig^^)Ich habe da aber noch ein Frage:
Ich möchte den Bällen jetzt auch Farben zuweisen(das immer wenn ein Timer tickt sich die Farbe ändert. Dazu Habe ich eine public Color clr in Ball. Dieser Farbe kann ich aber nur in DrawBall etwas zuweisen sonst wird der Ball nicht gezeichnet. Das sollte aber doch ganz einfach gehen. Halt so wie ich zB die X Koordinate geändert habe, aber: Fehlanzeige.
Hier mal der relevante Codeausschnitt:[cs]struct Ball { public int X; public int Y; public Color clr; public void DrawBall(Graphics g) { clr = Color.Red; SolidBrush Pinsel = new SolidBrush(clr); g.FillEllipse(Pinsel , X, Y, 5, 5); } }[/cs]
Ich weiß, dass durch das clr = Color.Red; der Ball immer die Farbe rot bekommt, aber nur dann wird er gezeichnet. Gebe ich aber das ball.clr = Color.Red in einem Timer ein, dann wird es garnicht gezeichnet(Ja der timer ist enabled).
Was kann man dagegen tun xD
Wieso ist das alles so kompliziert:Dmfg Mongole
Whitespaces entfernt
-
Wandernder Mongole schrieb:
Du meinst wenn ich soviele Bälle habe, dass überall Bälle sind?
Ja, so wie du es jetzt geschrieben hast habe ich das gemeint. Die Abfrage ob da schon ein Ball ist könntest du dir sparen, wenn du nur die Position des Balles verändert, ich weiß allerdings nicht ob das das ist was du willst.
Zum Thema Farbe:
Veranlasst du in deinem Timer ein Neuzeichen (Invalidate)? Ansonsten weiß die Form ja nicht, dass sie die Bälle neuzeichnen soll.
-
Firefighter schrieb:
1. Umlaute in Variablennamen sind GAAAANNZZZZ schlecht
Wieso? Es lebe Unicode/UTF! Man sollte sich allerdings an eine Sprache halten. Und da die Bibliotheken schon auf Englisch sind...
Wenn ich aber korrektes Englisch haben will, muss auch der folgende Code funktionieren
void NaïveAlgorithm() { }
:p
-
Eventuell sollte sich der Threadersteller erstmal etwas mehr mit den eigentlichen Sprachefeatures beschäftigen eh er versucht etwas in Forms zu zeichnen, mag vielleicht für den Anfang leicht sein, aber es birgt ein paar feinheiten die man beachten sollte.
Ich würd dir empfehlen mal zu googlen wie man zum beispiel mit List<T> umgeht und was generics usw sind.
-
hajb schrieb:
Firefighter schrieb:
1. Umlaute in Variablennamen sind GAAAANNZZZZ schlecht
Wieso? Es lebe Unicode/UTF! Man sollte sich allerdings an eine Sprache halten. Und da die Bibliotheken schon auf Englisch sind...
Wenn ich aber korrektes Englisch haben will, muss auch der folgende Code funktionieren
void NaïveAlgorithm() { }
:p
LOL sehr geil :p Dein Code finde ich dann bestimmt manchmal bei der dailyWTF :p kleiner Spass
-
Danke für die Hilfe ich habe es jetzt geschafft.
Zwar nicht die beste Lösung, aber es funktioniert:[cs]private void timer1_Tick(object sender, EventArgs e) { if (MouseButtons == MouseButtons.Left) { Point Maus = PointToClient(MousePosition); Ball ball = new Ball(); ball.X = Maus.X; ball.Y = Maus.Y; ball.clr = Color.Green; Bälle.Add(ball); Refresh(); } if (MouseButtons == MouseButtons.Right) { Point Maus = PointToClient(MousePosition); Ball ball = new Ball(); ball.X = Maus.X; ball.Y = Maus.Y; ball.clr = Color.Red; Bälle.Add(ball); Refresh(); } Refresh(); }[/cs]
Und ich werde mich jetzt weiter mit List<T> ausseinandersetzten(Scheint ja ziemlich nützlich zu sein
)
mfg Mongole
-
Auch wenn dein Projekt nicht so groß ist wie du in einem Post bereits gesagt hast, gewöhn es dir aber bitte nicht an Variablen mit Umlauten zu bestücken, es KANN gut gehen, aber vielleicht fällst du damit mal woanders auf die Nase, ist nur ein gutgemeinter Rat und mal ernsthaft, die zwei extra Buchstaben werden dich nicht umbringen, besonders nicht wenn dir Intellisense dabei hilft deine Variablen wiederzufinden :p