Types und Foreach

Previous topic - Next topic

4pac

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?

Code (glbasic) Select
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

Kitty Hello

Code (glbasic) Select
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.

Schranz0r

Hi 4pac..


2 nein eher 3 fehler sind drin und zwar:

Code (glbasic) Select
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:
Code (glbasic) Select
FOREACH bulle IN cops[]sollte dann so gehen...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

ahhh Gernot war schneller.... :(
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

4pac

Ä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

Schranz0r

ja und deshalb sind die auch scheisse langsam im BB ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

4pac

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

Kitty Hello

ENDIF statt END IF!!!!

Hier der Code wie er geht - ich weiß net ob Du das so haben willst.
Code (glbasic) Select
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

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

4pac

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.