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.
// 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
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
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!
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
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.
hab ich ? :D
hast du!
nimm das:
http://www.glbasic.com/forum/viewtopic.php?id=932
Hmm da würd ich eher ein Anim-Sprite nehmen :D
Gabs ja zu der Zeit noch net.
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.
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
Clever!
cool. klappt hervorragend. Gute Idee!
@sechsrad
vielleicht kannst du das noch mal als extra Code-Schnipsel eintragen, scheint mir sehr nützlich zu sein.
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