Type Problem
Übersicht

![]() |
LeroyBetreff: Type Problem |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... ? |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Öm... ![]() Ich weiß selbst nicht mehr, wie ich die Types in BMax gelernt habe...^^ (vermutlich auch durch Ausfragen im irc.. ![]() ![]() 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 ![]() Ansonsten findest du hier im Forum auch noch einige gute Tuts, z.B. die Anfändertutorials. (Sry, mehr weiß ich nun auch nicht mehr ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
thx... denke es wird mir helfen! | ||
![]() |
Leroy |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() ![]() ![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! ![]() 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 ![]() Hoffe ihr habt verständniss für meine vielen Probleme, nur BMax ist doch sehr viel anders als BBasic ^^ Mfg. Leroy |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sollte so funktionieren, aber das "Else ~nix" kannst du dir auch sparen. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group