Guten Abend Leute,
ich versuche heute Abend, für ein Mini-Game einen Type mit Gegnern zu erzeugen. Dabei werde ich bemeckert mit "wrong argument type" vom Compiler. Anscheinend funzen die Types in GLB ein wenig anders, als ich es gewohnt bin. In dem in der Demo enthaltenen Tutorium ist nach meinem Verständnis nicht direkt zu ersehen, wie ich einen Type abklappere, der aus einfachen Variablen besteht un nicht aus einem Array. Ich hab es wie folgt gemacht:
Die Zeile, die der Compiler bemeckert, habe ich hier mit ->>>>>> markiert. Da soll noch nicht viel passieren in dem Type. Erstmal soll der Zugriff auf den Type funzen. Wie wäre es denn richtig?
LOADFONT "arial11.bmp", 0
SETFONT 0
GLOBAL player_x = 0
GLOBAL befreite = 0
SETTRANSPARENCY RGB(0,0,0)
LOADSPRITE "cop.png", 0
LOADSPRITE "wall_bottom.bmp", 1
LOADSPRITE "prisoner.bmp", 2
LOADSPRITE "wall_top.bmp", 3
GLOBAL cop_spwanspeed = 10
TYPE cop
cop_x = 0
cop_y
ENDTYPE
startzeit = GETTIMERALL()
WHILE KEY(1) = 0
jetztzeit = GETTIMERALL()
spielzeit = INTEGER((jetztzeit - startzeit) / 1000)
IF spielzeit / 5 = INTEGER(spielzeit/5) ;
GLOBAL aufpasser AS cop
obenunten = RND(1)
IF obenunten = 0 THEN aufpasser.cop_y = 75
IF obenunten = 1 THEN aufpasser.cop_y = 200
END IF
IF KEY(205) AND player_x < 295 THEN player_x = player_x + 1
IF KEY(203) AND player_x >=0 THEN player_x = player_x - 1
IF player_x >= 295 ; befreite = befreite + 1 ; player_x = 0 ; ENDIF
->>>> FOREACH bulle IN aufpasser <<<<<<<-
IF bulle.cop_y = 75 THEN DRAWSPRITE 0, bulle.cop_x, bulle.cop_y
IF bulle.cop_x > 330 THEN DELETE bulle
NEXT
DRAWSPRITE 1, 0, 170
DRAWSPRITE 2, player_x, 135
DRAWSPRITE 3, 0, 90
FOREACH bulle IN aufpasser
IF bulle.cop_y = 200 THEN DRAWSPRITE 0, bulle.cop_x, bulle.cop_y
NEXT
PRINT "spielzeit: " + spielzeit, 180,227
PRINT befreite, 260,10
SHOWSCREEN
WEND
Viele Grüße,
4pac
TYPE T
x
ENDTYPE
LOCAL t[] AS T // ein *Feld* von Ts
FOREACH ttt IN t[]
PRINT ttt.x, 0,0
NEXT
Muss ein Feld sein, und [] Klammern vergessen.
Hi 4pac..
2 nein eher 3 fehler sind drin und zwar:
TYPE cop
cop_x = 0
cop_y
ENDTYPE
GLOBAL cops[] AS cop // Das array für die cops
und das ist gleich 2 mal falsch im Code:
FOREACH bulle IN cops[]
sollte dann so gehen...
ahhh Gernot war schneller.... :(
Äch so... na, danke euch beiden. Ich bin halt vorbelastet... BB.... da funzen die Types anders... da ist jede Instanz eines Types an sich schon eine Art Array, ohne das man das extra so deklarieren muss.
Viele Grüße,
4pac
ja und deshalb sind die auch scheisse langsam im BB ;)
Nee, haut bei mir nicht hin. Grummel... ist aber auch nicht so wichtig, am besten wir vergessen das Thema. Types sind für die Art von Spielen, die mit GLB gecodet werden, glaube ich auch nicht wirklich wichtig (ebenso wie in BB). Ich kenne ne Menge Coder aus der Szene, die gute Games gebaut haben, von denen ich weiß, dass sie ohne Types arbeiten.
Ärgert mich nur, weil Types halt ein paar Bequemlichkeiten bieten, wenn man sie erstmal gecheckt hat, und in BB hatte ich sie gerade gecheckt.
Ich mach jetzt erstmal mit Arrays weiter.
Danke & Grüße,
4pac
ENDIF statt END IF!!!!
Hier der Code wie er geht - ich weiß net ob Du das so haben willst.
LOADFONT "arial11.bmp", 0
SETFONT 0
GLOBAL player_x = 0
GLOBAL befreite = 0
SETTRANSPARENCY RGB(0,0,0)
LOADSPRITE "cop.png", 0
LOADSPRITE "wall_bottom.bmp", 1
LOADSPRITE "prisoner.bmp", 2
LOADSPRITE "wall_top.bmp", 3
GLOBAL cop_spwanspeed = 10
TYPE Tcop
cop_x = 0
cop_y
ENDTYPE
GLOBAL aufpasser[] AS Tcop
startzeit = GETTIMERALL()
WHILE KEY(1) = 0
jetztzeit = GETTIMERALL()
spielzeit = INTEGER((jetztzeit - startzeit) / 1000)
IF spielzeit / 5 = INTEGER(spielzeit/5) ;
LOCAL aufp AS Tcop
obenunten = RND(1)
IF obenunten = 0 THEN aufp.cop_y = 75
IF obenunten = 1 THEN aufp.cop_y = 200
DIMPUSH aufpasser[], aufp
ENDIF
IF KEY(205) AND player_x < 295 THEN player_x = player_x + 1
IF KEY(203) AND player_x >=0 THEN player_x = player_x - 1
IF player_x >= 295 ; befreite = befreite + 1 ; player_x = 0 ; ENDIF
FOREACH bulle IN aufpasser[]
IF bulle.cop_y = 75 THEN DRAWSPRITE 0, bulle.cop_x, bulle.cop_y
IF bulle.cop_x > 330 THEN DELETE bulle
NEXT
DRAWSPRITE 1, 0, 170
DRAWSPRITE 2, player_x, 135
DRAWSPRITE 3, 0, 90
FOREACH bulle IN aufpasser[]
IF bulle.cop_y = 200 THEN DRAWSPRITE 0, bulle.cop_x, bulle.cop_y
NEXT
PRINT "spielzeit: " + spielzeit, 180,227
PRINT befreite, 260,10
SHOWSCREEN
WEND
Na in GLB kann man wunderbar Types benutzen, da sie sogar schneller sind als im vergleich eine FOR-NEXT-Schleife für normale Arrays...
Hat mir mal Gernot gesteckt, soll wohl am FOREACH liegen, nur keinen Plan warum :D
Jo, jo, jo... jetzt funzt das :-) vielen Dank euch beiden, Gernot für das Codezurechtbiegen. Ich war glaube ich schon zu müde gestern Abend. Mit ENDIF / END IF hab ich mir vor paar Tagen schonmal einen Abend unnötige Arbeit gemacht.