Hey Leute
Ich programmiere ein TD in WPF und ich hab ein großes Problem.
Ich will dynamisch Images erstellen, am besten mit einem Array oderso...
.. WEIL die Geschoße von den Towern immer ein neues Ziel(Image_) finden müssen!
[code]
if (image1.Margin.Left > image2.Margin.Left)
image2.Margin = new Thickness(image2.Margin.Left + 1, image2.Margin.Top, image2.Margin.Right, image2.Margin.Bottom);
if (image1.Margin.Left < image2.Margin.Left)
image2.Margin = new Thickness(image2.Margin.Left - 1, image2.Margin.Top, image2.Margin.Right, image2.Margin.Bottom);
if (image1.Margin.Top > image2.Margin.Top)
image2.Margin = new Thickness(image2.Margin.Left, image2.Margin.Top + 1, image2.Margin.Right, image2.Margin.Bottom);
if (image1.Margin.Top < image2.Margin.Top)
image2.Margin = new Thickness(image2.Margin.Left, image2.Margin.Top - 1, image2.Margin.Right, image2.Margin.Bottom);
[/code]
Und statt zB image1.Margin hätte ich gerne image_.Margin
Mein 2. Problem ist etwas kleiner!
Ich würde gerne eine Schleife so lange laufen lassen, bis das Image die Position erreicht
zB
while (image1.Margin == 12,68,0,0)
// code
das geht aber leider nicht. So zeigt er mir keiner Fehler an, aber es ist eine endlos Schleife und das Programm hängt sich auf:
while (image1.Margin == image1.Margin = new Thickness(12,68,0,0))
//code
Da bekommt image1 immer die selben Koordinaten
Hoffentlich könnt ihr mir mit beiden Problemen helfen. Danke
Das klingt doch schon mal nach einem sehr interressanten Projekt!
Deinen ersten Codeschnipsel verstehe ich jetzt auf Anhieb nicht so ganz. Da du Margins verwendest gehe ich davon aus dass du deine Elemente in einem Grid hast. Bei einem Koordinaten-Basierten System wie in deinem Beispiel würde ich allerdings ein Canvas hernehmen. Ausserdem würde ich bei den Berechnungen nicht mit den GUI-Objekten direkt arbeiten sondern eigene Klassen wie etwas Tower oder Projectile machen und diese dann per Controls visualisieren. Dafür kannst du dann Bindings hernehmen.
Zu deinem 2. Problem.
Ich würde das so machen dass ich z.B. ein Projektil immer ein kleines Stück näher in richtung Ziel bringe bis die beiden Objekte kollidieren.
Hier ein Pseudocode-Beispiel:
while(!this.Colldewith(target))
{
Vector direction = target.Position - this.Position;
direction.Normalize();
//Jetzt haben wir einen Bewegungs-Vektor in dessen richtung wir marschieren müssen
this.Position += direction * this.Speed;
redraw();
Thread.Sleep(30);
}
Nein nein nein 😛
Es ist ganz anders!
Also 1. für das was du meinst, habe ich leider zu wenig Erfahrung (bzw garnicht.)
Und es ist sowieso egal ob ich die mir selber erstelle oder? Weil die muss ich ja trotzdem irgendwie dynamisch erstellen können, das geht dann wieder nicht.
Ich arbeite ganz einfach mit den MainWindow Koordinaten.
Also wenn du einen Button hinzufügst und drauf klickst, und bei Layout guckst, dann siehst du die Koordinaten wo es am MainWindow ist.
das was du bei 2. hingeschrieben hast, habe ich mit meinem Code in Punkt 1 gemacht 😛
Also das funktioniert schon.
PLUS wenn du Thread.Sleep machst, wird das ganze Programm angehalten? Ich regle das mit einem Timer, viel besser (ohne dem würde es ja nicht funktionieren)
Danke trotzdem für die Antwort
Zusammenfassung: Ich muss wissen wie ich dynamisch Images erstelle und die in ein Array packe (automatisch) und wie ich abfrage ob ein Image auf einer bestimmten Position im MainWindow ist(weil das Image sich immer um ein Feld bewegt, und ich muss wissen wo es ist!)
cucu
Nein nein nein 😛
Es ist ganz anders!
Also 1. für das was du meinst, habe ich leider zu wenig Erfahrung (bzw garnicht.
Könnte doch ein Anreiz sein Erfahrung zu machen? Wenn du den ganzen Code ins Hauptfenster schreibst ohne eine ordendliche Architektur zu haben wirst du irgendwann an dem Punkt landen wo dein Programm unwartbar wird und du dich selbst nicht mehr auskennst. Ausserdem lassen sich Bugs dann kaum noch aufspüren / beseitigen.
Als ich mit dem Programmieren angefangen habe habe ich mit WinForms auch ganze viele Minigames gemacht. Ich habe anfangs die gleichen Ansätze verfolgt wie du und den kompletten Code ins Hauptfenster geschrieben. Irgendwann hab ich mich dann selbst nicht mehr ausgekannt 😃.
PLUS wenn du Thread.Sleep machst, wird das ganze Programm angehalten? Ich regle das mit einem Timer, viel besser (ohne dem würde es ja nicht funktionieren)
Nicht das ganze Programm sondern nur ein der aktuelle Thread. Aber das war wie gesagt eh nur Pseudocode. Ich nehme an du hast noch nichts mit Threads gemacht. Der Timer tuts auch. Und man spart sich die Arbeit alles zu syncronisieren.
Zusammenfassung: Ich muss wissen wie ich dynamisch Images erstelle und die in ein Array packe (automatisch) und wie ich abfrage ob ein Image auf einer bestimmten Position im MainWindow ist(weil das Image sich immer um ein Feld bewegt, und ich muss wissen wo es ist!)
Nun ein Array aus Image-Elementen erstellst du wie jedes andere Array auch. Du möchtest vermutlich wissen wie du deine Elemente dann anzeigen möchtest.
Du schnappst dir einfach dein Layout-Panel (du hast warscheinlich ein Grid) und fügst das Image der Child-Auflistung hinzu:
grid.Children.Add(images[i]);
Zum abfragen der Koordinaten würde ich wie bereits gesagt ein Canvas nehmen. Das Canvas ist der einfachste LayoutContainer von allen. Die darauf platzierten Elemente haben lediglich X- und Y-Koordinaten und nicht, wie beim Grid, komplizierte Margins und Alignments. Die Koordinaten würde ich dann einfach relativ zum Canvas abfragen via Canvas.GetLeft() und Canvas.GetTop().
Viel Spass beim Basteln!
Ich habe es geschafft ein Image per Code zu erstellen.
Aber ich möchte machen, dass ein Images Array erstelle und jedes mal wenn ich auf einen Button klicke, dass ein neues generiert wird.
Das geht aber nur ohne Arrays, also wenn ich ein einzelnes erstelle.
Image[] img = new Image[5];
BitmapImage bi = new BitmapImage();
bi[imgint].BeginInit();
bi[imgint].UriSource = new Uri(@"C:\Users\Anonym\Desktop\TowerDefense\bomb.jpg");
bi[imgint].EndInit();
img[imgint].Source = bi[imgint];
img[imgint].Visibility = Visibility.Visible;
canvas1.Children.Add(img[imgint]);
Canvas.SetLeft(img[imgint], 10);
Canvas.SetTop(img[imgint], 10);
img[imgint].Width = 30;
img[imgint].Height = 39;
imgint++;
Wenn ich es ausführe kommt eine Fehlermeldung bei bi[imgint].BeginInit();
Fehlermeldung: NullReferenceException was unhandled
Object reference not set to an instance of an object.
Bitte um Hilfe!
Danke!
PS.: DANKE für den Tip für Canvas, ich habe es umgeschrieben und es ist viel einfacher und überschaubarer
*edit* Ich habe das bi nur zum Array gemacht, um zu testen ob es daran liegt, es ist egal wie ich es mache, also mit oder ohne Array (bei bi), ist der selber Fehler.
Aber wenn das Image kein Array ist, geht es. (Es muss aber ein Array sein! brauche ich unbedingt)
Hallo cemolade,
BitmapImage bi = new BitmapImage();
bi[imgint].BeginInit();
Wie du hast es zu einem Array gemacht?
Wenn es ein Array sein soll dann musst du auch bei der Deklaration die Variable als Array definieren.
Zudem musst du dabei beachten dass der Array bei der Deklaration zwar erstellt wird jedoch musst du die einzelnen Elemente selbst initialisieren.
D.h. die sind alle null und du kriegst schöne NullPointerExceptions 😃
Hier noch ein kleines Tutorial zu der Problematik [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1 und 1.1.1
Gruss
Michael