Objekte
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
kruxBetreff: Objekte |
Mi, Sep 07, 2005 15:49 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Sep 07, 2005 16:15 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Sep 07, 2005 16:47 Antworten mit Zitat |
|
---|---|---|
@vertex: Du hast wohl die Frage falsch verstanden, kann ja mal vorkommen
@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 |
Mi, Sep 07, 2005 18:43 Antworten mit Zitat |
|
---|---|---|
ok und wie kann ich jetzt für alle objekte dieses types eine Method durchführen? | ||
Jolinah |
Mi, Sep 07, 2005 18:50 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Sep 07, 2005 18:52 Antworten mit Zitat |
|
---|---|---|
Danke alles klar | ||
krux |
Mi, Sep 07, 2005 19:03 Antworten mit Zitat |
|
---|---|---|
klappt aber irgendwie immer noch nicht, hier ist mein Lern code
Code: [AUSKLAPPEN] Global liste:TList ' mit dieser Liste erzeugen wir beliebig viele Refs
[/syntax]
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 |
||
rema |
Mi, Sep 07, 2005 19:42 Antworten mit Zitat |
|
---|---|---|
reicht da nicht ein:
_list = null flushmem() aus? Oder werden die Referenzen innerhalb dieser Liste nicht freigegeben? |
||
TheShadowModerator |
Mi, Sep 07, 2005 20:24 Antworten mit Zitat |
|
---|---|---|
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 |
Mi, Sep 07, 2005 20:25 Antworten mit Zitat |
|
---|---|---|
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 |
||
bruZard |
Do, Sep 08, 2005 7:13 Antworten mit Zitat |
|
---|---|---|
@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 |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group