Objekte

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

krux

Betreff: Objekte

BeitragMi, Sep 07, 2005 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mal nen bissel blitz max geproggt, aber das mit den Objekten ist jetzt ja nen bissel anders und es gibt nicht mehr den delete befehl, deshalb meine frage:

wie kann man Viele objekte des gleichen Types erschaffen, bei denen immer wieder in unregelmäsigen Abständen welche zerstört werden und neue erzeugt werden? So eine änliche situation wie mit den Einheiten in Strategiespielen.

Vertex

BeitragMi, Sep 07, 2005 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle unreferenzierten Objekte werden nach FlushMem entfernt. Siehe hirzu die Hilfe, da steht alles drinn.

Etwas gewöhnungsbedürftig, aber dafür schneller.

mfg olli
vertex.dreamfall.at | GitHub

bruZard

BeitragMi, Sep 07, 2005 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@vertex: Du hast wohl die Frage falsch verstanden, kann ja mal vorkommen Wink

@krux:

Du musst ein Type mit einer Liste verknüpfen:
Code: [AUSKLAPPEN]

Type TMyType
  Global _list:TList ' mit dieser Liste erzeugen wir beliebig viele Refs

  Rem
    Die Methode "New" wird, sofern vorhanden, automatisch
    aufgerufen wenn eine Instanz der Klasse erzeugt wird
  EndRem
  Method New()
    if _list:TList = Null Then _list:Tlist = New TList
    _list.AddLast(Self)  ' Wir hängen das neue Objekt an das Ende der Liste 
  End Method

  Method Kill()
    _list.Remove(Self)
  End Method
End Type


um nun ein neues Element (bspw. eine neue RTS Einheit) zu erzeugen einfach myUnit:TMyType = New TMyType aufrufen.

Um ein bestimmtes Objekt zu löschen einfach die Methode Kill() der jeweiligen Instanz aufrufen.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

krux

BeitragMi, Sep 07, 2005 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
ok und wie kann ich jetzt für alle objekte dieses types eine Method durchführen?

Jolinah

BeitragMi, Sep 07, 2005 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Um beim Beispiel von Bruzard zu bleiben:
Code: [AUSKLAPPEN]
For Local var:TMyType = Eachin TMyType._list
  var.Kill() 'würde jetzt alle Objekte aus der Liste entfernen
Next
 

krux

BeitragMi, Sep 07, 2005 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke alles klar
 

krux

BeitragMi, Sep 07, 2005 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
klappt aber irgendwie immer noch nicht, hier ist mein Lern code

Code: [AUSKLAPPEN]
Global liste:TList ' mit dieser Liste erzeugen wir beliebig viele Refs


Type Flamme   
   Field posx# = 400
   Field posy# = 300
   Field posrotation# = 0
   Field speedx# = (MouseX()-400)/100
   Field speedy# =(MouseY()-300)/100
   Field speedrotation# = 5
   Field alpha# = 1
   
   
   Method update()
      alpha:-0.01
      posx:+speedx
      posy:+speedy
      posrotation:+speedrotation
      
      SetBlend (alphablend)
      SetRotation(posrotation)
      SetAlpha(alpha)
      SetHandle(5,5)
      SetColor 255,0,0
      
      DrawRect(posx,posy,10,10)
      
   EndMethod
   
   Method Neu()
       If liste:TList = Null Then liste:TList = New TList
            liste.AddLast(Self)  ' Wir hängen das neue Objekt an das Ende der Liste
     End Method

     Method Kill()
       liste.Remove(Self)
     End Method

EndType


SetBlend (alphablend)

Graphics 800,600

Repeat
   Cls
   
   SetAlpha(1)
   SetColor(255,255,255)
   SetRotation(0)
   SetHandle(0,0)
   DrawRect(380,280,40,40)
   
   Local f:Flamme
   
   If MouseDown(1)
      f.Neu()
   EndIf
   
   If liste <> Null
   For f:Flamme = EachIn liste
      
      f.update()
      
      If f.posx < 0 Or f.posx > 640 Then f.kill()
      If f.posy < 0 Or f.posy > 480 Then f.kill()
      
   Next
   EndIf
      
      
      
   Flip
Until KeyHit(key_escape)

End
[/syntax]

rema

BeitragMi, Sep 07, 2005 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
reicht da nicht ein:

_list = null

flushmem()

aus? Oder werden die Referenzen innerhalb dieser Liste nicht freigegeben?

TheShadow

Moderator

BeitragMi, Sep 07, 2005 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
so wie es bruzard gemacht hat - gibt es keine Garantie, dass es auch gelöscht wurde... Das ist das Fatale an BlitzMax...


Code: [AUSKLAPPEN]

Type ttype
  Global list:TList

  Method New()
    If list:TList = Null Then list:TList = New TList
    list.addlast(Self)
  End Method

  Method kill()
    list.remove(Self)
  End Method

   Field blub:Int
End Type

Local dummy:ttype=New ttype
Local clondummy:ttype=dummy

dummy.blub=123 '<<< test wert

Print dummy.blub
dummy.kill()
FlushMem()
Print dummy.blub

Print clondummy.blub
clondummy.kill()
FlushMem()
Print clondummy.blub


dummy=Null
clondummy=Null
FlushMem()
If dummy=Null Then Print "NULL - geloescht!"



Ich persönlich bin kein wirklicher fan davon - was ist wenn man ein fester hat und es löschen will - inkl. aller objekte - das wird niemals ganz, solange man irgendwo im hauptprogramm eine type-variable hat, die dadrauf referenziert ist es sein denn man verwendet "imaginäre handles" oder man setzt diese auf null... das ist unhandlich


Hätte Mark es anders gemacht - dann wäre BBmax eine perfekte Sprache - so zweifle ich bisschen dadran... Bei alten BBasics - haben alle variable nach dem löschen eines tyües autom. ihre werte verloren - das war sehr schön...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
  • Zuletzt bearbeitet von TheShadow am Mi, Sep 07, 2005 20:26, insgesamt einmal bearbeitet

Jolinah

BeitragMi, Sep 07, 2005 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Neu() ist eine Methode, das heisst es muss bereits ein Objekt existieren wo du diese Methode aufrufen kannst.

Also entweder:
Code: [AUSKLAPPEN]
Local f:Flamme = new Flamme


oder eine Funktion machen:
Code: [AUSKLAPPEN]
Type Flamme
...
Function Neu:Flamme()
  If liste = Null then liste = new TList
  Local f:Flamme = new Flamme
  liste.AddLast(f)
  return f
End Function
...
End Type


Dann:
Code: [AUSKLAPPEN]
Local f:Flamme
...
If MouseDown(1)
  f = Flamme.Neu()
Endif
...



@TS: Da Variablen nur in einem gewissen Scope gültig sind werden die Objekte aber spätestens nach dem 2. Schleifendurchgang aus dem Speicher gelöscht (das Flushmem im selben Durchgang wirkt noch nicht wenn die Vars nicht auf Null sind, beim zweiten Durchgang werden neue Vars erstellt, die alten Objekte werden gelöscht). Und auf Objekte die man gelöscht hat kann man ja eh nicht mehr zugreifen, somit sollte man alle Variablen auf Null setzen um Memory Exceptions zu vermeiden. Wenn man das macht klappt auch Flushmem Wink

bruZard

BeitragDo, Sep 08, 2005 7:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@TS:

Ich mache das immer so und hatte noch nie Probleme ... evtl. solltest Du vermeiden einfach mal nebenbei ein Objekt zu kopieren oder unmotiviert mit den Objekten zu handlen.

Ein guter Programmierer sollte immer wissen wo welche Daten benötigt werden Wink Wink
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group