Type-Instanzen in Type.Function erstellen/damit arbeiten?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Eschenbach

Betreff: Type-Instanzen in Type.Function erstellen/damit arbeiten?

BeitragMi, Dez 03, 2008 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute!
ich habe in moment ein Problem mit Types in Blitzmax, und zwar will ich in einer statischen Funktion eines Types eine bzw. mehrere Instanzen eines Types erstellen und dann damit arbeiten, aber irgendwie klappt das nicht ganz, hier ein Beispiel-Code, um mein Problem zu zeigen:

Code: [AUSKLAPPEN]
Type TmeinType
   Field testtext:String = "Standard"
   
   Function Create:TmeinType()
      Local bla:TmeinType = New TmeinType
      bla.testtext = "Funtion TmeinType.Create() funktioniert!"
      Return bla
   End Function
   
   Function erstelle_und_bearbeite()
      Global meinType:TmeinType = TmeinType.Create()
      meinType.testtext = "erstellen und bearbeiten funktioniert!"
   End Function
   
End Type

TmeinType.erstelle_und_bearbeite()
Print meinType.testtext


nochmal zum erklären: in der Funktion "erstelle_und_bearbeite"(im richtigen Code hat sie nicht sonen langen Namen Smile ) werden eigentlich mithilfe eines Timers alle 2-3 sekunden –die Funktion wird bei jedem Hauptschleifendurchlauf aufgerufen– eine Instanz erstellt und bei jedem Schleifendurchgang aktualisiert, das heißt ein Bild bewegt sich auf dem Bildschirm und es werden jedesmal die Koordinaten erneuert und auf Kollision geprüft.
Im Beispiel wird die Instanz wohl erstellt, aber man kann außerhalb des Types nicht mehr darauf zugreifen, kann jemand helfen?
Gruß, Eschenbach

Xeres

Moderator

BeitragMi, Dez 03, 2008 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
erstelle_und_bearbeite() muss auch das erstellte Teil zurückliefern, so wie Create...

Edit:
Global innerhalb der Funktion bedeutet, dass der Wert bis zum nächsten Funktionsaufruf gespeichert wird, im Hauptprogramm ist "meinType" nicht bekannt.

Code: [AUSKLAPPEN]
Type TmeinType
   Field testtext:String = "Standard"
   
   Function Create:TmeinType()
      Local mt:TmeinType = New TmeinType
      mt.testtext = "Funtion TmeinType.Create() funktioniert!"
      Return mt
   End Function
   
   Function erstelle_und_bearbeite:TmeinType()
      Local mt:TmeinType = TmeinType.Create()
      mt.testtext = "erstellen und bearbeiten funktioniert!"
     Return mt
   End Function
   
End Type

Local meinType:TmeinType = TmeinType.erstelle_und_bearbeite()
Print meinType.testtext
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)

Jolinah

Betreff: Re: Type-Instanzen in Type.Function erstellen/damit arbeiten

BeitragMi, Dez 03, 2008 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Eschenbach hat Folgendes geschrieben:
... eine Instanz erstellt und bei jedem Schleifendurchgang aktualisiert, das heißt ein Bild bewegt sich auf dem Bildschirm und es werden jedesmal die Koordinaten erneuert und auf Kollision geprüft. ...


Warum erstellst du denn dazu jedesmal ne neue Instanz? Du kannst ja auch die selbe Instanz immer und immer wieder aktualisieren:


Code: [AUSKLAPPEN]

Type TMeinType
   Field testtext:String

   Function Create:TMeinType()
      Local tm:TMeinType = new TMeinType
      tm.testtext = "Startwert"
      return tm
   End Function

   Method Update(newtext:String)
      testtext = newtext
   End Method
End Type

Local tm:TMeinType = TMeinType.Create()
Print tm.testtext

tm.Update("Neuer Wert")
Print tm.testtext

tm.Update("Anderer Wert")
Print tm.testtext
 

Eschenbach

BeitragMi, Dez 03, 2008 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ich erstelle immer neue instanzen, weil zu manchen Zeitpunkten mehrere Instanzen existieren, es geht um ein kleines Spiel, wo Dinge von oben herunterfallen und man diese als Spieler einsammeln muss(das Spiel gibts schon sehr häufig, aber is ja nur ne Übung für mich). Und dieses Type is dazu da, diese Dinge, die herunterfallen, bei mir sind es Eier, zu reprsäsentieren/verwalten. Ansonsten wüsste ich ja auch, dass es unsinnig wäre, jedesmal eine neue Insatnz zu erstellen.

@Xerxes: das mit dem zurückliefern ist schlecht, das hätte ich mit einer Instanz auch gemacht, aber ich will mit dieser Funktion alle gerade existierenden Eier updaten, d.h. die y-Position aktualisieren, die eingefangen Eier löschen, und die heruntergefallenen Eier als kaputte Eier darstellen(und nach einiger Zeit löschen). Geht das irgendwie mit statischen Funktionen in Types zu lösen oder wäre es besser eine Funktion außerhalb des Types zu schreiben oder direkt ins Hauptprogramm?

danke für eure Hilfe!
Gruß, Eschenbach

Jolinah

BeitragMi, Dez 03, 2008 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso, dann hab ich dich falsch verstanden, sorry Wink

Vielleicht hilft dir das weiter?

Code: [AUSKLAPPEN]
Type TMeinType
    Global list:TList

    Function Create:TMeinType()
        Local tm:TMeinType = new TMeinType
        If list = Null Then list = new TList
        list.AddLast(tm)
        return tm
    End Function


    Function Update()
        If list = Null Then Return
        For local tm:TMeinType = EachIn list
            'Aktualisiere Objekt
        Next
    End Function
End Type


Hier werden alle Instanzen in einer statischen Liste gespeichert. Innerhalb einer statischen Funktion kann man diese Liste dann abarbeiten. Nicht mehr benötigte Instanzen kannst du dann mit Remove einfach aus der Liste entfernen.
 

Eschenbach

BeitragMi, Dez 03, 2008 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, also viel weiter geholfen hat das nicht, denn so weit war ich in etwa auch schon, sorry
oder wenn ich weiter drüber nachdenke vielleicht doch Wink ich will ja, dass in der update-funktion alle x sekunden ein neues ei erstellt wird(das mit den sekunden krieg ich schon hin Razz ), jetzt ist nur die frage, ob die instanzen, die ich in der update funktion per
Code: [AUSKLAPPEN]
TmeinType.create()
oder per
Code: [AUSKLAPPEN]
mt.TmeinType = New Type
erstellt habe und gleich danach in die List gesetzt habe, auch noch beim späteren aufrufen der Funktion bzw. auch außerhalb der funktion/des types zugreifbar sind
Gruß, Eschenbach

Jolinah

BeitragMi, Dez 03, 2008 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das geht dann auch von Aussen, da die Liste als statisch definiert wurde (global).

Code: [AUSKLAPPEN]
Local tm:TMeinType = TMeinType.Create()
tm = TMeinType.Create()

For tm = EachIn TMeinType.list
  'Alle Instanzen durchgehen
Next


Die Liste bleibt also erhalten und ist auch beim nächsten Update noch da, so wie du es ursprünglich geplant hattest Wink

Xeres

Moderator

BeitragDo, Dez 04, 2008 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Für ein Blitzbasic-Type-like verhalten kann man eine Liste für den Type erstellen und die New Methode überladen:
Code: [AUSKLAPPEN]
SuperStrict

Type Ttest
   Field wert:Int
   
   Global list:TList = CreateList()
   
   Method New()
      list.AddLast(Self)
   End Method
   
   Function Create:Ttest(fw:Int)
      Local t:Ttest = New Ttest
      Return t
   End Function
   
   Function UpdateAll()
      For Local t:Ttest = EachIn Ttest.list
         Print t.wert
      Next
   End Function
End Type

Bei jedem Aufruf von Create wird eine Instanz erstellt und in der Liste abgelegt. Die Liste kann beliebig abgearbeitet werden...
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)
 

Eschenbach

BeitragDo, Dez 04, 2008 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, also dass das mit den lists dann wie in BB ist, war jetzt nichts neues für mich, aber trotzdem danke für deinen Hinweis und für eure Hilfe;)
Gruß, Eschenbach

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group