Erste Gehversuche mit BMax.

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Smily

Betreff: Erste Gehversuche mit BMax.

BeitragMi, Jul 25, 2007 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Soo ich hab mich heute mal an blitzmax herangetraut.
Folgendes kam bei den ersten spielerrein raus.
Die Meisten Fragen konnte ich mir selbst mit Try&Error bzw mit der Hilfe lösen.
Aber einwas blieb mir schleierhaft: Wieso werden die objecte nicht gelöcht, wenn e auf 0 ist?

btw: Sollte es ein paar "grobe Fahrlässigkeiten" an meinem Programmierstil geben bitte ich auch darrauf hinzuweisen. Wie schon gesagt ist das mein erster Gehversuch, und ich habe ehrlich gesagt keinen plan, wie man bei OOP ein Programm richtig Strukturiert. Ich habe mich hier einfach auf meinen Bauch verlassen Laughing

Code: [AUSKLAPPEN]
Strict
Type spark
   Field x:Float
   Field y:Float
   Field e:Int
   Field ri:Int
   Field s:Float
   Field gr:Float
   Field R, G, B
   Global list:Tlist = CreateList()
         
   Method New()
      Repeat   
         r = Rand(0,1) * 255
         g = Rand(0,1) * 255
         b = Rand(0,1) * 255
      Until r+g+b
      x = MouseX()
      y = MouseY()
      e = 100
      ri = Rand(0,360)
      s = Rnd(0,4)
      List.AddLast(Self)
   End Method

   Method del()
      Local obj:TLink
      obj = list.findlink(Self)
      list.remove(obj)   
   End Method
   
   Method update()
      e = e - 3
      SetColor r,g,b
      SetAlpha e/100.0
      DrawOval x-4,y-4,8,8
      x = x + Sin(ri)*s
      y = y + Cos(ri)*s + gr
      gr = gr + 0.1
      If e <= 0 del()
   End Method
End Type

Graphics 800,600
Local a:spark
Local count:Int
SetBlend alphablend

Repeat
   Cls
   For a:spark = EachIn(spark.list)
      a.update
   Next
   If MouseHit(1) Or MouseDown(2) New spark   
   If MouseHit(3)
      For count = 0 To 999
         New spark
      Next
   End If
   Flip
Until KeyHit(27)
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Dreamora

BeitragMi, Jul 25, 2007 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
1.

Code: [AUSKLAPPEN]

Method del()
      Local obj:TLink
      obj = list.findlink(Self)
      list.remove(obj)   
   End Method

sollte sein

Code: [AUSKLAPPEN]
Method del()
      Local obj:TLink
      obj = list.findlink(Self)
      obj.remove()
   End Method


oder
Code: [AUSKLAPPEN]
Method del()
      list.remove(Self)
   End Method


macht keinen sinn zu suchen und dann nochmal zu suchen.
Am besten machst du aber in die Klasse selbst ein field link:TLink und dann beim New link = List.AddLast(self)
dann kannst du in Del einfach link.remove() ohne überhaupt suchen zu müssen.


Ansonsten hats bei mir keine Probleme, es wird alles sauber entsorgt.

Hier der gesamte Source:

Code: [AUSKLAPPEN]
Strict
Type spark
   Global list:TList = CreateList()

   Field link:TLink
   Field x:Float
   Field y:Float
   Field e:Int
   Field ri:Int
   Field s:Float
   Field gr:Float
   Field R, G, B

         
   Method New()
      Repeat   
         r = Rand(0,1) * 255
         g = Rand(0,1) * 255
         b = Rand(0,1) * 255
      Until r+g+b
      x = MouseX()
      y = MouseY()
      e = 100
      ri = Rand(0,360)
      s = Rnd(0,4)
      link = List.AddLast(Self)
   End Method

   Method del()
      link.remove()
   End Method
   
   Method update()
      e = e - 3
      SetColor r,g,b
      SetAlpha e/100.0
      DrawOval x-4,y-4,8,8
      x = x + Sin(ri)*s
      y = y + Cos(ri)*s + gr
      gr = gr + 0.1
      If e <= 0 del()
   End Method
End Type

Graphics 800,600
Local count:Int
SetBlend alphablend

Repeat
   Cls
   For Local a:spark = EachIn(spark.list)
      a.update
   Next
   If MouseHit(1) Or MouseDown(2) New spark   
   If MouseHit(3)
      For count = 0 To 999
         New spark
      Next
   End If

   SetColor 255,255,255
   SetAlpha 1
   DrawText "Count: " + spark.list.count(), 0, 0

   Flip
Until KeyHit(27)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

d-bug

BeitragMi, Jul 25, 2007 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type spark

   ...

   'Instanz aus Liste entfernen
   Method del()
      Spark.List.Remove(Self)
      Spark.Terminate (Self)
   End Method

   'Instanz löschen
   Function Terminate (obj:spark)
      obj = null
   End Function

   ...
End Type


Sei bitte ein lieber Smily0412 und benenne deine Types mit einem T vorne (z.B. TSpark), das hilft uns anderen deinen Code besser zu verstehen. Very Happy

Oder eben die Method del() so wie Dreamora es vorschlug.

@Dreamora, die Probleme die er hat, kommen bei manchmal auch vor, deswegen Nulle ich die Instanz lieber gleich noch mal. Auch wenn es theoretisch nichts bringt.

cheers
 

Dreamora

BeitragMi, Jul 25, 2007 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry d-bug aber dein Terminate ist total wertlos.

Du gibst eine Objektreferenz in eine Funktion und setzt sie drin Null.
Das ist total sinnfrei denn ausserhalb der Funktion ändert sich an der Referenz nix.

Hinzu kommt dass sie sowieso nur in der Liste gespeichert ist und deswegen mit dem Remove schon genullt ist.
wenn du noch probleme damit hast, dass das nicht geschieht hast du vermutlich nicht 1.24 mit SyncMod denn es gab früher einen Bug in TList speziell wenn man die Liste selbst nullte, welche verhinderte das die Objekte drin freigegeben wurden.

Aber hast recht, einen Fehler hat meinen Code.

In Del muss noch etwas zusätzlich rein und zwar:

link.remove()
link = NULL


Dann wirds korrekt freigegeben, sonst hält der Link das Objekt am leben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group