Type Problem

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Leroy

Betreff: Type Problem

BeitragSa, Jun 16, 2007 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
und wiedereinmal habe ich eine Frage zu BM...
irgendwie habe nich Probleme mit den Types....!
Ich musste feststellen das der Befehl Each nicht mehr funktioniert... aber irgendwie gibt es jetzt EachIn... könnt ihr mir vielleicht kurz erklären wo hier mein Fehler liegt:

Code: [AUSKLAPPEN]
   info = New objekt
       objekt_x = Rnd(0,800)
       objekt_y = Rnd(0,600)

For info=EachIn objekt
objekt_x = objekt_x - 1
Next


aus irgendeinem Grund klappt das irgendwie net... ?

BladeRunner

Moderator

BeitragSa, Jun 16, 2007 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst eine Instanz mit dem Bezeichner info, versuchst aber - mit dem falschen Separator (. wäre richtig, _ ist falsch) auf die Variable der Typeschablone (also Objekt) zuzugreifen. Das hätte so auch nicht unter BB funktioniert.

Zudem vermisse ich bei Dir die Typeschablone als solches.

Ausserdem gibt es unter Bmax keine separate Typeliste mehr, sondern Du must dich selbst um eine Liste kümmern in der Du die Types speicherst.

Beispiel:

Code: [AUSKLAPPEN]
Type Test
    field bla
    global testlist:tlist = new tlist

    method new()
        testlist.addlast(self)
    end method

end type

local a:test = new test
a.bla = 23

for local b:test = eachin testlist
    print b.bla
next
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

Leroy

BeitragSo, Jun 17, 2007 0:22
Antworten mit Zitat
Benutzer-Profile anzeigen
soll das heißen es gibt keine richtige Types mehr in BM?
Also Types die so einfach zu steuern sind... geht das echt et mehr einfacher?
 

#Reaper

Newsposter

BeitragSo, Jun 17, 2007 0:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne, man braucht solch eine Liste mit den eingetragenen "Typelinks"
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Leroy

BeitragSo, Jun 17, 2007 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
puh... da hatte ich gerade mal die Types in BB verstanden da werden sie in BM auch schon wieder komplizierter... gibt es irgendwo nen (German) Tut für Types? Verstehe das alles irgendwie net wie die jetzt aufgebaut sind; was z.B. diese methode soll etc... voll komisch irgendwie?

Mfg.
Leroy
 

#Reaper

Newsposter

BeitragSo, Jun 17, 2007 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Öm... Embarassed
Ich weiß selbst nicht mehr, wie ich die Types in BMax gelernt habe...^^
(vermutlich auch durch Ausfragen im irc.. Wink Wink )

Eventuell hilft dir das Tutorial, da Methoden was mit OOP zu tuen haben:
https://www.blitzforum.de/foru...hp?t=18397
Schau da vielleicht einfach mal rein Wink

Ansonsten findest du hier im Forum auch noch einige gute Tuts, z.B. die Anfändertutorials.

(Sry, mehr weiß ich nun auch nicht mehr Embarassed )
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Leroy

BeitragSo, Jun 17, 2007 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
mh... könntest du mir folgenden Quellcode bitte mal nach BMax umschreiben damit ich ein Beispiel dafür habe wie es funktioniert:

Code: [AUSKLAPPEN]
type objekt
  field objekt_x
  field objekt_y
end type


   info.objekt = new objekt
       info\objekt_x = Rnd(0,800)
       info\objekt_y = Rnd(0,600)


  for info.objekt = each objekt                    ; für jedes objekt
        info\objekt_y = info\objekt_y +1       ;bewegen
        oval info\objekt_x,info\objekt_y,5,5   ;objekt zeichnen
  next


Währe Nett wenn du mir den Quellcode mal zu BMax umschreiben köntest,
damit ich ein übersichtliches Beispiel habe... vielleicht mit ein paar Kommentaren dazu? ^^
Danke! Währe echt nett!

Mfg.
Leroy
 

#Reaper

Newsposter

BeitragSo, Jun 17, 2007 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type objekt
  Global list:TList = New TList      
   Rem
      Die list beinhaltet alle Einträge (Links) vom Type und wird für die schleifen benötigt.
      Nebenbei:
      Man kann in einem Type auch Globals setzen, welche sozusagen für jeden
      Eintrag im Type gleich sind, im gegensatz zu den Fields.
   End Rem

  Field objekt_x
  Field objekt_y
End Type


   info:objekt = New objekt            ' die "info" variable muss mit :objekt passend deklariert werden,
                              ' wie z.b. :Int oder :String
       info.objekt_x = Rnd(0,800)
       info.objekt_y = Rnd(0,600)
       ListAddLast objekt.list, info   ' "verlinkt" das info-objekt in einem Listeintrag


  For i:objekt = EachIn objekt.list     ' geht jeden Eintrag in der Liste durch, in welcher der Type-Eintrag "verlinkt" ist
                              ' (hier auch wieder :objekt
        i.objekt_y = info.objekt_y +1   ' bewegen
        DrawOval info.objekt_x, info.objekt_y, 5, 5    ' objekt zeichnen
        'Oval heißt nun DrawOval ;)
  Next


Ich hoffe ich konnte es einigermassen verständlich beschreiben und hoffe das es so richtig ausgedrückt ist und so..^^
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Leroy

BeitragSo, Jun 17, 2007 1:38
Antworten mit Zitat
Benutzer-Profile anzeigen
thx... denke es wird mir helfen!

Leroy

BeitragSo, Jun 17, 2007 5:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich sitze nun schon bis um 05:00 Uhr Morgends an diesem *sorry* Scheiß Code!
Hier der Code wie er im moment ist:

Code: [AUSKLAPPEN]

      AppTitle = "- Types in BMax - "
      Graphics 800,600,0
      back = LoadImage ("back.bmp")
      cut = LoadImage ("cut.bmp")
      ball = LoadImage ("ball.bmp")
      
      
      
      SetBlend Alphablend
      
      vari#= 0.5
      zu = 1
      anzahl = 0
      
               Type objekt
                 Global list:TList = New TList
                  Rem
                  EndRem
                  Field objekt_x
               Field objekt_Y
               EndType
               
               
               
               
               
               
      
      
      Repeat
      Flip
      Cls
      
      
               info:objekt = New objekt           
               info.objekt_x = Rnd(300,450)
                   info.objekt_y = Rnd(0,400)
                   ListAddLast objekt.list, info   

  For i:objekt = EachIn objekt.list     
  info.objekt_y = info.objekt_y + 1
  Next
      
      
      
      SetColor 0,255,0
      SetAlpha 1.0
      DrawImage back,0,0
      

      
      SetColor 0,255,255
      SetAlpha vari#
            
      
      DrawText " - TYPES IN BLIZ-MAX > ARE VERY EASY! - ", 200,150
      SetMaskColor 255,255,255
      
      SetAlpha 0.4
        DrawRect info.objekt_x, info.objekt_y, 5, 5
      
      SetAlpha 0.2
      SetColor 255,255,255
      DrawImage cut,0,550
      
      
      If ab = 1 Then
      vari# = vari# - 0.1
      EndIf
      
      If zu = 1 Then
      vari# = vari# + 0.1
      EndIf
      
         If vari# > 1.0 Then
         ab = 1
         zu = 0
         EndIf
         
         If vari# < 0.0 Then
         ab = 0
         zu = 1
         EndIf
         
                              
      
      
      
      
      
      
      Until KeyHit (Key_ESCAPE)
      End


Meine derzeitigen Probleme:

Die Types bewegen sich nicht wirklich weiter runter... eigentlich soll er die Types erstellen und diese sollen dann wiederrum vom Himmel runterfallen... nur das ich auf dem Bildschirm sehe ist ein wilder Schneesturm net mehr...
das klappt schonmal net und mein 2. Problem:
Wie funktioniert der Delete Befehl in BMax?

Mfg.
Leroy

> Kein Bog mehr, gehe jetzt schlafen boah...

BladeRunner

Moderator

BeitragSo, Jun 17, 2007 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Was Reaper dir gezeigt hat ist schonmal nicht verkehrt, allerdings fährst Du mit meinem Beispiel da glaube ich besser. Die Methode die ich im Type habe ist der Befehl new, d.h. immer wenn Du einen neuen Type machst wird sie aufgerufen. In dieser Methode habe ich das hinzufügen zur Liste gemacht, daher musst Du Dich später nicht mehr darum kümmern, es wird automatisch gemacht wenn Du new aufrufst.

Zu deinem Problem: Du durchläufst zwar alle TypeInstanzen zu Beginn in einer Schleife und erhöhst ihr y um 1, ABER: beim Zeichnen machst Du das nicht. Dort wird nur eine Instanz gezeichnet (Und zwar die letzte, neu erstellte, da sie die letzte ist die innerhalb der Schleife durchlaufen wurde.)
Um alle anzuzeigen musst Du auch hier mit for eachin durch die ganze Liste gehen.

Btw: Die Types in Bmax sind eher 'richtig' als die in BB. Denn wenn man sich ein wenig einarbeitet ist es mehr als sinnvoll dass man selbst die Verwaltung übernimmt. Wo in BB nur eine globale Liste da war, kann man in BMax kleine lokale Listen erzeugen etc. Du kannst also zB jedem deiner Raumschifftypes eine Liste der Waffen mitgeben die er besitzt. Das wäre unter BB recht mühsam gewesen.

Zu Delete: BMax hat einen Garbage Collector, d.h. es kümmert sich automatisch um Objekte die nicht mehr benutzt werden. Damit BMax weiss dass es etwas löschen kann musst du nur sämtliche Verweise auf das Objekt auf 'Null' setzen.
Wenn Dein Type noch in einer Liste ist musst Du ihn mit Listremove entfernen.

Beispiel (Ich verwende wieder eine Methode IM Type, auch dass ist sehr praktisch, denn jeder Type kann so seinen eigenen Befehlsssatz mit sich führen. Du kannst hier Methoden und Funktionen nutzen. Methoden wirken immer nur auf ein Objekt, Funktionen hingegen wirken auf die Typeklasse, d.h. Du brauchst keine Instanz um sie aufzurufen):

Code: [AUSKLAPPEN]
SuperStrict   'Volle Variablen- und Gültigkeitsprüfung. Sehr zu empfehlen, zwingt zu sauberem Arbeiten.
SeedRnd MilliSecs() 'Zufallsgenerator gestartet.
Type test
   
   Global Testlist:Tlist = New Tlist
   Field blub:Int
   
   Method New()      'überschreibt das normale new und sorgt für den Listeneintrag
      Testlist.addlast(Self)   'ruft die eintragemethode der Liste auf und fügt ihr das aktuelle Objekt (=self) zu.
      self.blub = Rand(0,100)
      Print "Instanz generiert. blub zufaellig auf "+self.blub+" gesetzt."
   End Method
   
   Method Destroy()   'löscht die aktuelle Instanz. Delete lässt sich hier leider nicht verwenden, das Schlüsselwort ist
                  'schon reserviert, aber noch nicht benutzt.
      Testlist.remove(Self)   's.o. ruft eine interne Methode der Liste auf, die den Eintrag entfernt.
      Print "Instanz zerstoert."
   End Method
   
   Method Showblub()   'Zeigt blub an.
      Print "Blub ist hier " + self.blub + " !"
   End Method
   
End Type

For Local a:Int = 1 To Rand(25) 'erstelle eine zufällige Anzahl von Instanzen
   Local b:test = New test   'hier werden sie geschaffen, in die Liste iengetragen, kriegen einen Wert.
Next

For Local b:Test = EachIn Test.Testlist 'kurzes Leben: hier werden die Instanzen zerstoert.
   b.showblub()   'aber vorher dürfen sie ihren Wert noch einmal verkünden.
   b.destroy()
Next


Ich kann Dir nur empfehlen mal durch die Hilfe von BMax zu stöbern, und Dir die Sourcecodes der Module anzusehen. Viele der Befehlsmöglichkeiten liegen leider etwas versteckt. Bmax ist aber eine sehr mächtige Sprache.
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
 

#Reaper

Newsposter

BeitragSo, Jun 17, 2007 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
O K................

Also wer mir verraten kann, warum in dem folgendem Code weder Delay und Print bei angeschaltetem Debugger geht, der bekommt nen Keks................


Code: [AUSKLAPPEN]


      Print "bldfsöf"
      AppTitle = "- Types in BMax - "
      Graphics 800,600
      back = LoadImage ("back.bmp")
      cut = LoadImage ("cut.bmp")
      ball = LoadImage ("ball.bmp")
      
      
      
      SetBlend Alphablend
      
      vari#= 0.5
      zu = 1
      anzahl = 0
      
               Type objekt
                 Global list:TList = New TList
                  Field objekt_x
                  Field objekt_Y
               EndType
               
               
               
               
               
               

      
      Repeat
      
      Flip 1
      Cls
      
      
      
               info:objekt = New objekt           
               info.objekt_x = Rnd(300,450)
                   info.objekt_y = Rnd(0,400)
                   ListAddLast objekt.list, info   ' "verlinkt" das info-objekt in einem Listeintrag

      
      
      
      SetColor 0,255,0
      SetAlpha 1.0
      DrawImage back,0,0
      

      
      SetColor 0,255,255
      SetAlpha vari#
            
      
      DrawText " - TYPES IN BLIZ-MAX > ARE VERY EASY! - ", 200,150
      SetMaskColor 255,255,255
      
      Print "count: "+objekt.list.count()
      For i:objekt = EachIn objekt.list     
         i.objekt_y = i.objekt_y + 1         'hier i.objekt, nicht info.objekt wie vorher, weil in der schleife i: ist ;)
         SetAlpha 0.4
           DrawRect i.objekt_x, info.objekt_y, 5, 5
         Print "o:" + i.objekt_x
      Next
      Delay 1000
      
      SetAlpha 0.2
      SetColor 255,255,255
      DrawImage cut,0,550
      
      
      If ab = 1 Then
      vari# = vari# - 0.1
      EndIf
      
      If zu = 1 Then
      vari# = vari# + 0.1
      EndIf
      
         If vari# > 1.0 Then
         ab = 1
         zu = 0
         EndIf
         
         If vari# < 0.0 Then
         ab = 0
         zu = 1
         EndIf
         
               
               


 

               
                                 
                              
                              'If ImagesCollide (ball,objekt_x,objekt_y,0,cut,0,550,0) Then
                               
                              'EndIf
                              
      
      
      
      
      
      
      Until KeyHit (Key_ESCAPE)
      End
      



Ich versteh das einfach nicht Shocked Shocked Shocked Shocked
Ohne Debugger geht dann das Delay und auch Print o_O
Die Schleife geht er auch nur ohne Debugger durch O_O

Hat jemand ne Ahnung..?



EDIT:
Wenn man den Code hier rauskopiert, geht er! Auch mit Debugger! Der einzigste Unterschied liegt bei den Einrückungen, im gepostetem Code werden Leerzeichen verwendet anstatt Tabs..?!?!


EDIT 2:
o_O Ich hab nunmal den Code (mit Tabs) kopiert und nochmals eingefühgt... es geht nun...Vielleicht ist Datei von Leroy ein falsches ASCII zeichen, was BMax nicht verarbeiten kann :-/


Edit 3:
Also ich fühle mich von BMax nun verarscht... -.-
Die Datei heißt "Types.bmx", wenn ich die umbenenne, geht es, wenn ich die dann wieder Types.bmx nenne, geht es wieder nicht...-.-
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Leroy

BeitragSo, Jun 17, 2007 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo das ist schon irgendwie alles komisch ^^

Ich habe nun nurnoch 3 kleine Probleme:
Ich bin jetzt erstmal auf die Lösung von #Reaper eingegangen,
da ich die einfach besser verstanden habe! Trozdem Danke BladeRunner!
Very Happy
Nun hier ist mein Aktueller Code:


Code: [AUSKLAPPEN]
   Graphics 800,600,0
   SetBlend ALPHABLEND
   
    Type objekt
    Global list:TList = New TList
    Field objekt_x
    Field objekt_y
    EndType
   
   
    Repeat
    Flip 1
    Cls
   
    info:objekt = New objekt
    info.objekt_x = Rnd(0,800)
    info.objekt_y = Rnd(0,600)
    ListAddLast objekt.list, info   
   
       For i:objekt = EachIn objekt.list
         i.objekt_y = i.objekt_y + 0.1
         SetAlpha 0.4
         DrawRect i.objekt_x, info.objekt_y, 5, 5
       Next
      
   
   
    Until KeyHit (KEY_ESCAPE)
    End
   


Ich muss nur noch 3 Dinge Lösen dann kann ich endlich anfangen zu arbeiten und muss euch net mehr nerven ^^

1.)
Die Objekte fallen viel viel zu schnell vom Himmel... ich möchte da sie in ganz normaler voll sichtbaren Geschwidigkeit vom oben herunterfallen! Also schön flüßig und nicht zu schnell. Meine Ansätze bisher wahren es mit nem Delay oder ne Variable zu probieren... klappt aber irgendwie nicht!
Das währe Nummer eins....

2.)
Ich habe versucht die Anzahl an Objekten die gezeichnet werden dürfen zu begrenzen nur das funktioniert leider auch nicht. Also so das die Objekte z.B. niemals 20 Überschreiten und sobald eines über >600 ist wird es gelöscht und verlässt den Bildschirm.

3.)
Die ganze Rand Sache gefällt mir überhaupt nicht... die Objekte werden (ich weiß nicht ob es nur wegen der Geschwindigkeit so ausieht) alle Gleichmäßig in einer Linie gezeichnet und laufen dann runter... ich möchte das sie auf dem Bildschirm gleichmäßig verteilt sind und quasi so wie Schnellflocken (vielleicht hilft das der Vorstelllung ein wenig ^^) den Bildschirm hinunterfallen.

Ich möchte mich schonmal für die bisherige Hilfe bedanken! Wirklich net Smile
Hoffe ihr habt verständniss für meine vielen Probleme, nur BMax ist doch sehr viel anders als BBasic ^^

Mfg.
Leroy

BladeRunner

Moderator

BeitragSo, Jun 17, 2007 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber die Problemlösung für deine Fragen gestaltet sich unter BB nicht anders als unter bmax.
Du erstellst einen Timer mit millisecs() und bewegst entsprechend dieses Timers. Den kannst Du ja als field mit auf den Weg geben.
Die Menge zu Begrenzen ist auch recht einfach - schau dir mal in der Hilfe die Methoden von Tlist an. Da gibt es unter anderem ein count() - dies gibt Dir die Anzahl Einträge in einer liste zurück.
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

Leroy

BeitragSo, Jun 17, 2007 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Du erstellst einen Timer mit millisecs() und bewegst entsprechend dieses Timers

Wie erstelle ich diesen Timer?
Wie soll ich Anhand dieses Timers bewegen?

Zitat:
schau dir mal in der Hilfe die Methoden von Tlist an. Da gibt es unter anderem ein count()

Gefunden ja, verstanden wie nein...

BladeRunner

Moderator

BeitragSo, Jun 17, 2007 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Immer wenn Du mit new eine neue TList erzeugst erhält sie auch einige Methoden mit auf den Weg, darunter zB. count.
Wenn du diese Methode aufrufst erhälst Du die Anzahl der Einträge in der Liste.

Bsp:
Code: [AUSKLAPPEN]
local liste:tlist = new Tlist
print liste.count()


Um mehr musst Du dich da nicht kümmern - die Funktionalität ist einfach da.

Wie Du den Timer erzeugst ? Gegenfrage: wie hast Du es denn in Blitzbasic gemacht ? Denn es funktioniert unter BB nicht anders als unter BM, nur die Syntax ist ein wenig anders.
Bemüh dazu bitte auch die Forensuche, dieses Thema gab es schon bis zum Erbrechen, da lässt sich sicher was finden.
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

Leroy

BeitragSo, Jun 17, 2007 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja gut, aber du schreibst:

Code: [AUSKLAPPEN]

local liste:tlist = new Tlist
print liste.count()


Damit kenne ich zwar die Anzahl der Listen also somit Objekte quasi aber weiß ich trotzdem nicht wie ich die Anzahl begrenze?
Sry, aber der Count Befehl ist vollkommen neu für mich!?
 

Dreamora

BeitragSo, Jun 17, 2007 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
wie du es begrenzt? wenn count > grenze dann nix mehr hinzufügen und fertig ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Leroy

BeitragSo, Jun 17, 2007 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Also z.B:

If liste.count() < 20 Then
~Hinzufügen
Else
~nix
Endif
Somit dürfte er ja net mehr also 20 Stück erstellen richtig?
 

ChristianK

BeitragSo, Jun 17, 2007 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollte so funktionieren, aber das "Else ~nix" kannst du dir auch sparen. Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group