BASIC

Author Topic: Types und Foreach  (Read 2583 times)

4pac

  • Guest
Types und Foreach
« on: 2007-Dec-25 »
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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10683
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Types und Foreach
« Reply #1 on: 2007-Dec-25 »
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.

Online Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5009
  • O Rly?
    • View Profile
Types und Foreach
« Reply #2 on: 2007-Dec-25 »
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 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Online Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5009
  • O Rly?
    • View Profile
Types und Foreach
« Reply #3 on: 2007-Dec-25 »
ahhh Gernot war schneller.... :(
I <3 DGArray's :D

PC:
AMD RYzen 7 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

4pac

  • Guest
Types und Foreach
« Reply #4 on: 2007-Dec-25 »
Ä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

Online Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5009
  • O Rly?
    • View Profile
Types und Foreach
« Reply #5 on: 2007-Dec-25 »
ja und deshalb sind die auch scheisse langsam im BB ;)
I <3 DGArray's :D

PC:
AMD RYzen 7 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

4pac

  • Guest
Types und Foreach
« Reply #6 on: 2007-Dec-26 »
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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10683
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Types und Foreach
« Reply #7 on: 2007-Dec-26 »
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

Online Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5009
  • O Rly?
    • View Profile
Types und Foreach
« Reply #8 on: 2007-Dec-26 »
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 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

4pac

  • Guest
Types und Foreach
« Reply #9 on: 2007-Dec-26 »
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.