ListRemove entfernt keine Einträge

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

sackboy

Betreff: ListRemove entfernt keine Einträge

BeitragDo, Jan 14, 2016 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich beschäftige mich gerade zum ersten mal mit der Programmierung in BlitzMax und wollte mich erstmal an einer Tilemap versuchen. Ich wollte dabei einen zweidimensionalen Array mit einem selbstdefinierten Type kombinieren, um später den einzelnen Feldern verschiedene Eigenschaften zuzuweisen. Im Grunde will ich erstmal erreichen, dass die Map gezeichnet wird und wenn ich mit der Maus auf ein bestimmtes Tile klicke, wird dieses entfernt. Hier der Code dazu (habe jetzt nur den wesentlichen Teil genommen):

Code: [AUSKLAPPEN]
Const dimx:Int = 9
Const dimy:Int = 9

Global Tile:TTile[dimx, dimy]
Global a:Int = 1

Global mouseXgrid:Int
Global mouseYgrid:Int

Global mylist:TList = New TList


Type TTile

Const Tilewidth:Int = 32
Const Tileheight:Int = 32

Field image:TImage

Function Create:TTile(x:Int, y:Int)
   
   Local Tileneu:TTile = New TTile
   Tileneu.image = LoadImage("bla.bmp")

   ListAddLast(mylist, Tileneu)
      
   DrawImage(Tileneu.image, (x * TTile.width), (y * TTile.height) )
      
   Return Tileneu

End Function

End Type


Repeat
Cls

   mouseposX = MouseX() / 32
   mouseposY = MouseY() / 32

   
   If a = 1 Then
   
      For y = 0 To dimy - 1
      
         For x = 0 To dimx - 1
            
            Tile[x, y] = TTile.Create(x, y)
            
         Next
      
         x = 1
         
      Next
      
   ElseIf a = 0 Then
      
      For y = 0 To dimy - 1
      
         For x = 0 To dimx - 1
            
            DrawImage(Tile[x, y].image, (x * TTile.width), (y * TTile.height) )
            
            If mouseposX = x And mouseposY = y And MouseHit(1) Then
               
               'Mir ist klar, dass der Code hier nicht viel Sinn ergibt, aber ich wollte ein paar unterschiedliche Varianten testen
               Tile[x, y].image = LoadImage("leer.bmp")
               ListRemove(mylist, Tile[x, y])
               Print CountList(mylist)
               
            EndIf
            
         Next
      
         x = 1
         
      Next
      
   EndIf
   
   a = 0
   
   
Flip
Until AppTerminate() Or KeyHit(KEY_ESCAPE)


Der Code an sich läuft soweit, nur an der Stelle "ListRemove(mylist, Tile[x, y])" wird der Eintrag nicht aus der Liste entfernt. "Print CountList(mylist)" gibt immer 81 aus und ich verstehe irgendwie nicht woran das liegt. Kann mir hier jemand auf die Sprünge helfen?

FireballFlame

BeitragDo, Jan 14, 2016 2:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Da kann ich nur vermuten, dass der Fehler im "unwesentlichen" Teil deines Codes oder in der Mausabfrage liegt.
Denn der Code, denn du hier eingefügt hast, müsste, soweit ich das beurteilen kann, eigentlich funktionieren. Wenn ich die Max2D-Befehle ausbaue und die Mausabfrage durch ein einfaches "If True" ersetze, werden alle 81 Tiles bei mir auch wieder aus der Liste entfernt.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Midimaster

BeitragDo, Jan 14, 2016 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es daran liegen, dass mouseposX und mouseposY als FLOAT und nicht als INT definiert sind? Besser wäre solch ein Code:

BlitzMax: [AUSKLAPPEN]
Global mouseposX:Int,  mouseposY:Int


Seltsamerweise gibt es das für mouseXgrid, dass aber im ganzen Code nicht auftaucht...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

sackboy

BeitragFr, Jan 15, 2016 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, bei mouseXgrid habe ich mich hier beim reinkopieren vertan, ich habe tatsächlich aber mouseposX und Y als Int definiert.

Hm, ich verstehe nur irgendwie nicht, warum der Code in die If-Abfrage mit MouseHit(1) reingeht (Print wird ausgegeben und wenn ich das neue Tile[x, y].image zeichne, wird es auch korrekt dargestellt), aber nichts aus der Liste nimmt. Könntest Du mir vielleicht beispielhaft zeigen, wie Du den Code abgeändert hast, FireballFlame? Ich bin da leider noch nicht so vertraut mit der Sprache.

Der Code in meinem ersten Post enthält die komplette Hauptschleife. In dem abgebildeten Type sind noch ein paar mehr Konstanten und Felder enthalten. In der Create-Funktion in dem Type weise ich diesen Feldern noch Werte zu, die Grafiken werden per Zufallszahl und If-Abfragen ermittelt (die werden auch alle korrekt gezeichnet). ListAddLast, DrawImage und Return sind auch die letzten Einträge in dem Type. Ansonsten hatte ich noch an anderen Types mit Methoden rumgebastelt, die rufe ich aber tatsächlich nicht auf.

Edit: Habe gerade mal testweise versucht "ListRemove(mylist, Tile[x, y]) " direkt unter "Tile[x, y] = TTile.Create(x, y)" zu kopieren, aber selbst da wird nur zur Liste hinzugefügt, aber nicht entfernt.
  • Zuletzt bearbeitet von sackboy am Fr, Jan 15, 2016 0:37, insgesamt einmal bearbeitet

DAK

BeitragFr, Jan 15, 2016 0:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Sowas lässt sich manchmal leichter debuggen, wenn man mal alles rund herum wegnimmt, bis es funktioniert. Versuch quasi einen minimalen Fall zu basteln, der deinen Fehler noch beinhaltet. Dann lässt es sich leichter sehen, was man falsch gemacht hat.

Oder nimm den Debugger, setze einen Breakpoint direkt in das IF rein, und schau, wie sich die Variablen da verändern.
Gewinner der 6. und der 68. BlitzCodeCompo

FireballFlame

BeitragFr, Jan 15, 2016 2:24
Antworten mit Zitat
Benutzer-Profile anzeigen
sackboy hat Folgendes geschrieben:
Könntest Du mir vielleicht beispielhaft zeigen, wie Du den Code abgeändert hast, FireballFlame? Ich bin da leider noch nicht so vertraut mit der Sprache.

Code: [AUSKLAPPEN]
Framework BRL.LinkedList
Import BRL.StandardIO


Const dimx:Int = 9
Const dimy:Int = 9

Global Tile:TTile[dimx, dimy]
Global a:Int = 1

Global mouseXgrid:Int
Global mouseYgrid:Int

Global mylist:TList = New TList


Type TTile

   Const Tilewidth:Int = 32
   Const Tileheight:Int = 32
   
   'Field image:TImage
   
   Function Create:TTile(x:Int, y:Int)
      
      Local Tileneu:TTile = New TTile
      'Tileneu.image = LoadImage("bla.bmp")
   
      ListAddLast(mylist, Tileneu)
        
      'DrawImage(Tileneu.image, (x * TTile.width), (y * TTile.height) )
        
      Return Tileneu
   
   End Function

End Type


Repeat
'Cls

   'mouseposX = MouseX() / 32
   'mouseposY = MouseY() / 32

   
   If a = 1 Then
   
      For y = 0 To dimy - 1
     
         For x = 0 To dimx - 1
           
            Tile[x, y] = TTile.Create(x, y)
           
         Next
     
         x = 1
         
      Next
     
   ElseIf a = 0 Then
     
      For y = 0 To dimy - 1
     
         For x = 0 To dimx - 1
           
            'DrawImage(Tile[x, y].image, (x * TTile.width), (y * TTile.height) )
           
            If True 'mouseposX = x And mouseposY = y And MouseHit(1) Then
               
               'Mir ist klar, dass der Code hier nicht viel Sinn ergibt, aber ich wollte ein paar unterschiedliche Varianten testen
               'Tile[x, y].image = LoadImage("leer.bmp")
               ListRemove(mylist, Tile[x, y])
               Print CountList(mylist)
               
            EndIf
           
         Next
     
         x = 1
         
      Next
     
   EndIf
   
   a = 0
   
   
'Flip
Until mylist.IsEmpty() 'AppTerminate() Or KeyHit(KEY_ESCAPE)
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Midimaster

BeitragFr, Jan 15, 2016 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Sackboy, ich habe den Code aus deinem ersten posting laufen lassen und bei mir werden die Tiles entfernt!
BlitzMax: [AUSKLAPPEN]
Const dimx:Int = 9
Const dimy:Int = 9

Global Tile:TTile[dimx, dimy]
Global a:Int = 1

Global mouseXgrid:Int
Global mouseYgrid:Int

Global mylist:TList = New TList
Graphics 800,600

Global Testbild:TImage, LeerBild:TImage
Cls

DrawOval 1,1,30,30

Testbild=CreateImage(640,480,1,DYNAMICIMAGE|MASKEDIMAGE)
GrabImage TestBild,0,0
Cls

DrawLine 1,1,30,30
DrawLine 1,30,30,1

LeerBild=CreateImage(640,480,1,DYNAMICIMAGE|MASKEDIMAGE)
GrabImage LeerBild,0,0




Type TTile
Const Width:Int = 32
Const Height:Int = 32
Field image:TImage

Function Create:TTile(x:Int, y:Int)

Local Tileneu:TTile = New TTile
Tileneu.image = TestBild '=LoadImage("bla.bmp")
ListAddLast(mylist, Tileneu)
DrawImage(Tileneu.image, (x * TTile.width), (y * TTile.height) )
Return Tileneu
End Function
End Type


Repeat
Cls

Local mouseposX% = MouseX() / 32
Local mouseposY% = MouseY() / 32

If a = 1 Then
For y = 0 To dimy - 1
For x = 0 To dimx - 1
Tile[x, y] = TTile.Create(x, y)
Next
x = 1
Next
ElseIf a = 0 Then
For y = 0 To dimy - 1
For x = 0 To dimx - 1
DrawImage(Tile[x, y].image, (x * TTile.width), (y * TTile.height) )
If mouseposX = x And mouseposY = y And MouseHit(1) Then
Tile[x, y].image = LeerBild
ListRemove(mylist, Tile[x, y])
Print "Removed Grid " + mouseposX + "/" + mouseposY
Print "Anzahl=" + CountList(mylist)
EndIf
Next
x = 1
Next
EndIf
a = 0
Flip
Until AppTerminate() Or KeyHit(KEY_ESCAPE)



Möglicherweise stört Dich, dass die Bilder nicht vom Bildschirm verschwinden? Deine Objekte sind ja zweimal vorhanden. Einmal in der mylist und zum anderen im Array. Du löscht sie nur aus der Liste, malst aber aus dem Array.

Lass meinen TestCode mal so wie er ist laufen. Ich erzeuge zwei Testbilder. Beim Klicken wird das Objekt aus der Liste gelöscht, die Anzahl ändert sich und der Kreis wird durch ein Kreuz ersetzt.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

sackboy

BeitragFr, Jan 15, 2016 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vielen Dank für Eure Unterstützung! Ich habe mir mal DAKs rat zu Herzen genommen und habe nach und nach Teile des Codes entfernt. Letztenendes lag es daran, dass ich in dem Type noch eine Methode mit Namen "Compare" drin hatte, die ich allerdings nie aktiv aufgerufen habe. Scheint aber wohl etwas globales hinter zu stecken, was mir nicht bewusst war. Als ich die Methode entfernt hatte lief der Code plötzlich, wie ich es wollte. Smile

Also Danke noch mal an Euch alle!

Xeres

Moderator

BeitragFr, Jan 15, 2016 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Remove Methode verwendet Compare um alle Objekte mit dem gesuchten zu vergleichen. Wenn da nie raus kommt, dass die Objekte gleich sind, wird es auch nie aus der Liste entfernt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group