Type Problem

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

Matthias

BeitragDi, Sep 25, 2007 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Leider bin ich auch einer der sorte die mit den Types unter BMax nicht zurecht kommen.

Habe mal das Beispiel aufgegriffen und verstehe nicht warum die Einträge nicht weniger werden wenn ich ein Eintrag auf null setze.




Code: [AUSKLAPPEN]

Graphics 800,600,0
   SetBlend ALPHABLEND
   
    Type objekt
    Global list:TList = New TList
    Field objekt_x#
    Field objekt_y#
    EndType

For N=0 To 100
   info:objekt = New objekt
    info.objekt_x = Rand(0,800)
    info.objekt_y =Rand(0,600)
    ListAddLast objekt.list, info     
    Next


    Repeat
   
    Cls
   
   
    SetAlpha 0.4
  For i:objekt = EachIn objekt.list
        i.objekt_y = i.objekt_y + 1
          DrawRect i.objekt_x, i.objekt_y, 5, 5
         
           If i.objekt_y>590 Then
              ListRemove(objekt.list,i:objekt)
             'Löscht den Eintrag aus der Liste
              i:objekt=Null 'Löscht den Eintrag
           End If
       Next
    SetAlpha 1

   DrawText CountList(objekt.list),10,10

    Flip
   
    Until KeyHit (KEY_ESCAPE)
    End

Hoffe mir kann jemand helfen bei diesem Problem.
Gibt es vieleicht auch eine möglichkeit eine Bestimmte schneefllocke anzusprechen. Also ein Handle. (BB)

(Edit: Wurde verbessert)
  • Zuletzt bearbeitet von Matthias am Di, Sep 25, 2007 14:20, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDi, Sep 25, 2007 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau Dir bitte nochmal die Beispiele auf der ersten Seite an, dann sollte das klar werden. Du setzt zwar den Inhalt des Objektes auf Null (und wenn es in einer Variablen gespeichert wäre würde der Garbage Collector das auch brav entsorgen), aber Du lässt den Verweis auf das genullte Objekt als Eintrag in der Liste.
Die Liste interessiert es nicht ob ein Eintrag Inhalt hat - er ist eingeschrieben also wird er gezählt.
Listremove hilft hier.
Sowieso möchte ich anraten wie ich verfahren bin die wichtigen Funktionalitäten im Type als Methoden zu verankern. Man kann new() ohne weiteres überladen, und ebenso eine destroy()-Methode implementieren welche das löschen von Objekten automatisiert. Wie es geht ist auf seite 1 dieses Threads zu sehen, mit ausführlichen Kommentaren.


Eine bestimmte Schneeflocke ansprechen:
Nur über Umwege, du könntest den Tlink der Flocke in der TList speichern. Allerdings sollte das nur selten nötig sein, denn der Sinn von Listen ist es ja grade größere Massen von Objekten gleich abzuarbeiten. Wenn Du nur einzelne bearbeiten willst solltest Du vielleicht überlegen ein Unterscheidungskriterium zu den anderen auszuarbeiten und anhand dem zu entscheiden wer bearbeitet wird ODER die 'besonderen' einfach in eine separate 2e Liste einzutragen. Darin liegt ein großer Teil der Macht von Bmax - im Gegensatz zu BB bestimmst Du selber was wo gespeichert wird. Mehr Macht, aber auch mehr Verantwortung.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Matthias

BeitragDi, Sep 25, 2007 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@BladeRunner
Danke für deinen Tipp.
ListRemove ist genau der Befehl den ich suchte.

Mh. Das mit dem Handles ist aber garnicht gut.
Wie soll ich denn jetzt zb die Schneeflocke einen KristallTyp zuweisen.

Also ich stelle mir das so vor das jede schneeflocke so gesprekelte Punkte hat das dann zb den KristallTyp darstellen soll.


Code: [AUSKLAPPEN]

Graphics 800,600,0
   SetBlend ALPHABLEND
   
    Type objekt
    Global list:TList = New TList
   
    Field objekt_x#
    Field objekt_y#
   
    EndType

For N=0 To 100
   info:objekt = New objekt
    info.objekt_x = Rand(0,800)
    info.objekt_y =Rand(0,600)
    info.KristallTyp=Rand(0,19)
    ListAddLast objekt.list, info     
 Next

Type Kristall
Field FarbR,FarbG,FarbB
Field KPunkteX#[30]
Field KPunkteY#[30]
End Type






For L=0 To 20
K:Kristall = New Kristall
K.FarbR=Rand(100,255)
K.FarbG=Rand(100,255)
K.FarbB=Rand(100,255)
For S=0 To 29
K.KPunkteX[S]=Rnd(-10,10)
K.KPunkteY[S]=Rnd(-10,10)
Next  Next



    Repeat
   
    Cls
   
   
    SetAlpha 0.4
 

       For i:objekt = EachIn objekt.list
        i.objekt_y = i.objekt_y + 1
          DrawRect i.objekt_x, i.objekt_y, 5, 5
         


           If i.objekt_y>590 Then
              ListRemove(objekt.list,i:objekt)
             'Löscht den Eintrag aus der Liste
              i:objekt=Null 'Löscht den Eintrag
           End If
       Next

       SetAlpha 1




   DrawText CountList(objekt.list),10,10

    Flip
   
    Until KeyHit (KEY_ESCAPE)
    End


Wie kann mann das den jetzt am besten verlinken??

BladeRunner

Moderator

BeitragDi, Sep 25, 2007 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn jede Flocke sowieso alle genannten Eigenschaften hat, warum machst Du die Kristallfelder nicht teil des Flocken-Types ?
Und wenn es ein separater Type bleiben soll: Du kannst ja in objekt ein field k:Kristall machen, d.h. eine Typeinstanz zum Bestandteil des Types erklären.
Also

Code: [AUSKLAPPEN]
type Bla
    field blub:test
end type

type test
   field zomg:int
end type


local a:bla = new bla
local b:test = new test
b.zomg = 23
a.blub = test

print a.blub.zomg
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Matthias

BeitragDi, Sep 25, 2007 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh. Stimmt. Razz
Das geht ja auch.
Danke für deine Tips.

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group