Flugbahn - bitte schön der Reihe nach

Previous topic - Next topic

Quentin

nun ja, irgendwie komme ich über das Space-Shooter-Stadium nicht so richtig hinaus. Jetzt habe ich mich gefragt, wie die das bei den alten Shooter-Spielen so hinbekommen haben, daß die Gegner nicht einfach plump auf einen zufliegen, sondern mehr oder minder kunstvolle Flugfiguren darstellen.

Nach etlichem probieren ist das hier rausgekommen, was ich jetzt mal als Grundlage für meine weiteren "Forschungen" auf diesem Gebiet nehme ;)

Dargestellt werden 10 "Raumschiffe", die auf einer kreisförmigen Bahn in den Bildschirm einfliegen, dann dort dreimal im Kreis fliegen und den Bildschirm wieder verlassen. Vielleicht hat ja jemand einen Tip, wie man das eleganter lösen könnte.


Code (glbasic) Select
// flight course
TYPE t_course
  x
  y
ENDTYPE
LOCAL newcourse AS t_course
LOCAL course[] AS t_course

// the enemies
TYPE t_enemy
  sprite
  course_index
ENDTYPE
LOCAL newenemy AS t_enemy
LOCAL enemy[] AS t_enemy


LOCAL scx, scy
GETSCREENSIZE scx, scy

// create a new course
LOCAL i
FOR i = 0 TO 89 STEP 2           // flight into the screen
  newcourse.x = scx / 2 * SIN(i+270) + scx / 2
  newcourse.y = scy / 2 * COS(i+270) + scy / 4
  DIMPUSH course[], newcourse
NEXT

LOCAL count
FOR count = 0 TO 2               // then do a circle three times
  FOR i = 0 TO 359 STEP 3        // in the center of the screen
    newcourse.x = scy / 4 * SIN(i) + scx / 2
    newcourse.y = scy / 4 * COS(i) + scy / 2
    DIMPUSH course[], newcourse
  NEXT
NEXT

FOR i = 0 TO 89 STEP 2           // and say good bye
  newcourse.x = scx / 2 * SIN(i) + scx / 2
  newcourse.y = scy / 2 * COS(i) + scy / 4
  DIMPUSH course[], newcourse
NEXT

// simple enemy sprite
DRAWRECT 0, 0, 20, 20, RGB(196, 196, 196)
GRABSPRITE 0, 0, 0, 20, 20

LOCAL index = 0, delay
LOCAL max_idx = LEN(course[]) - 1
LOCAL max_enemy = 10, count_enemy = 0

// mail loop
WHILE TRUE

  // create a new enemy every 350 ms but not more than 10 totally
  IF GETTIMERALL() > delay AND count_enemy <= max_enemy
    INC count_enemy, 1
    newenemy.sprite = 0
    newenemy.course_index = 0
    DIMPUSH enemy[], newenemy
    delay = GETTIMERALL() + 350
  ENDIF

  // display enemy sprites
  FOREACH e IN enemy[]
    DRAWSPRITE e.sprite, course[e.course_index].x, course[e.course_index].y
    INC e.course_index, 1
    IF e.course_index > max_idx THEN DELETE e
  NEXT

  // start again if all enemies of the previos wave have left
  IF LEN(enemy[]) = 0 THEN count_enemy = 0

  SHOWSCREEN

WEND

sechsrad

wenn die raumschiffe auch die drehrichtung des kreises einschlagen bzw das raumschiff immer in die fahrtrichtung zeigt wo es hinfliegt..machbar auch mit der sin/cos fun ktion und die sprites mit rotosprite darstellen. das ist die steigerung.

mfg

Schranz0r

Das du dich überhaupt noch hier her traust....
Er hat Sin und Cos drin mensch...
Nörgel net immer an anderen rum, mach selber mal sowas, und zeig uns dein Kunstwerk!
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

Kitty Hello

Code (glbasic) Select
FOR i = 0 TO 89 STEP 2           // flight into the screen
  newcourse.x = scx / 2 * SIN(i+270) + scx / 2
  newcourse.y = scy / 2 * COS(i+270) + scy / 4
  newcourse.phi = 180 + i // glaube ich
NEXT
...
ROTOSPRITE crs.x, crs.y, crs.phi

Quentin

jaja eins nach dem anderen. Geht mir ja erst einmal nur um die Flugbahnen, das andere ist die Kür ;)

Wobei man bei ROTOSPRITE je nach Form der verwendeten Sprites wieder Probleme mit der Kollisionserkennung bekommt. Aber da hat Freund Schranzor ja schon mal was geschrieben dazu. Muss ich mir noch mal ansehen.

Schranz0r

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

Hmm da würd ich eher ein Anim-Sprite nehmen :D
Gabs ja zu der Zeit noch net.
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

sechsrad

mach mal 1 bild, das in der form sehr ungleichmässig ist, zacken usw.
und teste mein programm mit createscreen und usescreen. auch gedrehte bilder werden pixelgenau erkannt.
die seiten von createscreen müssen das  1,5fache der längsten seite vom bild sprite sein (mein bild ist hier 64 pixel) und das bild muss dann immer in die mitte vom createscreen gesetzt werden.
das sprite wird dann gedreht in den createscreen gepackt und ist dann das collisionssprite pixelgenau.

Code (glbasic) Select
LOADSPRITE "test.bmp", 0
LOADSPRITE "test.bmp", 1

b=64*1.5
CREATESCREEN 2,2,b,b
USESCREEN 2
ROTOSPRITE 0,0,0,pi
USESCREEN -1

WHILE TRUE
  IF KEY(208)
       my=my+2
    ENDIF

    IF KEY(200)
       my=my-2
    ENDIF

    IF KEY(203)
      mx=mx-2
    ENDIF

    IF KEY(205)
      mx=mx+2
    ENDIF

    IF KEY(42)
      pi=pi+1
      CREATESCREEN 2,2,b,b
      USESCREEN 2
      ROTOSPRITE 0,0,0,pi
      USESCREEN -1
    ENDIF

    IF KEY(54)
      pi=pi-1
      CREATESCREEN 2,2,b,b
      USESCREEN 2
      ROTOSPRITE 0,0,0,pi
      USESCREEN -1
    ENDIF

 DRAWSPRITE 2, mx, my
 DRAWSPRITE 1, 160, 120

 IF SPRCOLL (2, mx, my, 1, 160,120)
  PRINT "peng...", 10, 10
 ENDIF

 SHOWSCREEN
WEND

Kitty Hello


Quentin

cool. klappt hervorragend. Gute Idee!

@sechsrad
vielleicht kannst du das noch mal als extra Code-Schnipsel eintragen, scheint mir sehr nützlich zu sein.

Schranz0r

LOL, hatter vom Gernot geklaut :/
Das hatten wir schonmal in einen Thread, also weder clever noch überragend....
Und das in einen Createscreen packen und dann als ein Sprite verwenden ist .....naja.... gut, aber auch nicht clever ;)

Sagt was ihr wollt, aber meins ist besser :P
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