Autor |
Beitrag |
Hagato
      
Beiträge: 17
|
Verfasst: Mi 22.01.14 21:03
Hallo!
c# Visual Studio
Ich habe einer ImageList Bilder hinzugefügt. Danach will ich - nur 1 bestimmtes - löschen sobald es 1 mal vorkommt. Es gibt mehrere Pictureboxen und sobald "DAS BILD" das erste mal erscheint soll es in den anderen Pictureboxen nicht mehr erscheinen können.
C#-Quelltext 1: 2: 3:
| pbx_teil2.Image = hindernisse[m_hindernisse.Next(0, hindernisse.Count)]; if (pbx_teil2.Image == pbx_kanister.Image) hindernisse.RemoveAt(2); |
Funktioniert nicht.
Ich bin schon lange am tüfteln jedoch komm ich nicht drauf wie ich das schreiben soll/muss.
Bitte um rasche Antwort, vielen Dank.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 22.01.14 22:02
ImageList hat keine RemoveAt Methode. Die Image Collection einer Image List schon und die Methode funktioniert.
Beschreibe bitte genauer was "Funktioniert nicht" bedeutet. Also was du erwartet hast das passiert und was stattdessen passiert. Implodieren wird dein Rechner ja vermutlich nicht.
Warum übrigens RemoveAt(2)? Wo hast du die 2 her?
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Mi 22.01.14 22:33
RemoveAt(2) -> Die 2 steht für mein 3. Bild das ich der Liste hinzugefügt habe.
Bild 1 -> 0
Bild 2 -> 1
Bild 3 -> 2
C#-Quelltext 1: 2: 3:
| pbx_teil2.Image = hindernisse[m_hindernisse.Next(0, hindernisse.Count)]; if (pbx_teil2.Image == pbx_kanister.Image) hindernisse.RemoveAt(2); |
Ich habe 11 Pictureboxen, den Code oberhalb habe ich für alle ähnlich. Sobald in einer Picturebox der "Kanister" enthalten ist sollte mein 3. Bild aus der ImageListe entfernt werden.
pbx_kanister ist dabei mein Vergleichs Image. Also wenn eines der Pictureboxen das gleiche Image enthält sollte es von der Liste entfernt werden sodass der "Kanister" nicht nocheinmal vorkommt.
D.H. von 11 Pictureboxen darf der "Kanister" maximal 1 mal vorkommen.
Er kommt jedoch "nur" random, meine if-Abfrage zeigt keine Wirkung.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 22.01.14 22:50
Funktioniert jetzt der Vergleich nicht (die if Bedingung) oder der RemoveAt nicht?
Wenns der Vergleich ist vermute ich mal das man Images so nicht einfach vergleichen kann. Der wird nicht irgendwie die Pixel durchgegangen ob die gleich sind sondern einfach die Referenzen verglichen. Wenn das also 2 verschiedene Instanzen der Image Klasse hast werden die immer ungleich sein auch wenn da drin das gleiche Bild ist.
Zitat: | pbx_kanister ist dabei mein Vergleichs Image. Also wenn eines der Pictureboxen das gleiche Image enthält sollte es von der Liste entfernt werden sodass der "Kanister" nicht nocheinmal vorkommt. |
Klingt wirr. Für deinen Code heißt das der Kanister immer das 3.te Bild ist oder eben nicht in der Liste ist. Dann brauchst du die Bilder doch nie vergleichen Sobald du mit m_hindernisse eine 2 würfelst kannst du das Bild entfernen wenn es in der LIste ist. Und ob es in der Liste ist oder nicht kannst du dir auch in einem Bool unabhängig von der Liste selbst merken.
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Mi 22.01.14 23:02
Naja wenn der Random Generator 2 gewürfelt hat sollte 2 removed werden.
Falls 1 rauskommt, passiert nichts, dasselbe bei 0.
C#-Quelltext 1: 2: 3: 4: 5:
| Random m_hindernisse = new Random();
hindernisse.Add(Image.FromFile("Bilder\\saturn.png")); hindernisse.Add(Image.FromFile("Bilder\\asteroid.png")); hindernisse.Add(Image.FromFile("Bilder\\kanister.png")); |
Das ist mein Randomgenerator. Könnte es theoretisch sein dass ich mit jeder Zeile: pbx_teil1.Image = hindernisse[m_hindernisse.Next(0, hindernisse.Count)];
Den Generator neu "mache", sprich mein Kanister besitzt nicht den Index 2, sondern jedes mal aufs neue 0, 1, oder 2?
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 22.01.14 23:06
Nein.
Wie hast du pbx_kanister.Image zugewiesen? Auch aus der hindernisse Liste?
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Mi 22.01.14 23:07
Nein, direkt im Form hab ich eine Picturebox wo das Image bereits geladen ist.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 22.01.14 23:18
Ok dann ist zumindest klar das der Vergleich im if nie true sein kann. Es sind 2 verschiedene Image Instanzen auch wenn es das gleiche Bild ist.
Ich würde, wie gesagt vorschlagen, nicht zu vergleichen sondern in einem Boolean mir merken ob das Bild in der Liste enthalten ist oder nicht.
Ungefähr so
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Boolean containsKanister = true;
...
int Index = m_hindernisse.Next(0, hindernisse.Count); if ((index == 2) && (containsKanister)) { hindernisse.RemoveAt(index); containsKanister = false; } |
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Mi 22.01.14 23:32
Ok klingt eigentlich gut, aber..
Ich habe noch einige andere Operationen damit geschrieben wo ich mein vergleichsImage mit PictureBoxen vergleiche. Dort funktioniert zwar auch noch nichts aber der Code ist da.. ^^
Habe versucht mein VergleichsImage so: pbx_kanister.Image = Image.FromFile("Bilder\\kanister.png"); zu beladen, leider ohne Erfolg.
Ansätze oder Ideen wie dies funktionieren könnte?
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 22.01.14 23:54
C#-Quelltext 1:
| pbx_kanister.Image = hindernisse[2]; |
Und nebenbei, da gerade bei mir ein Groschen fällt, du meintest nicht eine ImageList wie in deinem ersten Beitrag sondern eine List<Image>, oder? Es gibt eine spezielle ImageList Klasse (die dir jetzt gerade aber nicht hilft).
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Do 23.01.14 00:03
Hm das mit dem vergleichen funktioniert immer noch nicht, aber mir ist auch eine Alternative gekommen. Gibt ja .Tag (wo ich den Namen, der Bilder verwenden kann oder?).
Könnte das funktionieren wenn ich den Namen der Bilder überprüfe mit .Tag? Bzw wie?
Ja List<Image> hindernisse = new List<Image>(); hab ich.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 23.01.14 00:12
Verstehe gerade nicht was du wie vorhast. Aber ein string kann man sauber vergleichen. Und den im Tag von PictureBox oder Image ablegen geht natürlich auch.
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Do 23.01.14 00:14
Anstatt die Images der PictureBoxen zu vergleichen, will ich die Pictureboxen mit Tag vergleichen.
|
|
Hagato 
      
Beiträge: 17
|
Verfasst: Do 23.01.14 19:59
Habs jetzt anders gelöst, und nach einer Nachtschicht und einigen Stunden funktioniert endlich alles! 
|
|