Hilfe für Shoot 'em up in GLbasic


felix330

Active Member
Staff member
Joined
Mar 13, 2008
Messages
511
Ich bin gerade dabei in GLbasic ein kleines Shoot 'em up für den Wiz zu programmieren. Fast alles läuft gut, aber ich habe ein Problem. Meine Funktion für einen Schuss der vom Spieler geschossen wird, sieht so aus:
Code:
FUNCTION spielerschuss:

LOCAL schuesse[] AS SCHUSS 
LOCAL schuss AS SCHUSS
LOCAL warten

IF KEY(B) AND warten<GETTIMERALL()
schuss.y=spielery
schuss.x=spielerx+10
DIMPUSH schuesse[], schuss
warten = GETTIMERALL()+200

ENDIF

FOREACH laser IN schuesse[]
DEC laser.y, 5
IF laser.y < 0 THEN DELETE laser
DRAWSPRITE 1,laser.x,laser.y

NEXT



ENDFUNCTION
Hab mir schon viele Tutorials durchgelesen, und kann hier eigentlich keine Fehler entdecken. Allerdings bewegt sich der Schuss im Spiel überhaupt nicht, sondern blinkt nur an einer Stelle auf, und verschwindet wieder, wenn man die Taste loslässt. Bewegen tut er sich garnicht. Kann irgendjemand meinen Fehler entdecken?
 
Hi,
ich hab das eigentlich immer so gemacht das ich eine Funktion habe mit der ih einen neuen Schuss auslöse, und eine die durch das Gesamte Schuss-Array iteriert und diese bewegt. Vllt hilft dir das weiter.
MfG
 
felix330 said:
(...)Kann irgendjemand meinen Fehler entdecken?
Wie und wann rufst Du diese Funktion auf? LOCAL Sachen beziehen sich laut der Hilfe nicht auf eine Funktion, sondern auf die SUB/das Hauptprogramm. Kann es sein, dass Du das Array schuesse immer wieder neu anlegst, einen ersten Schuss drin speicherst und dann wieder überschreibst?

Warum fallen die Laserschüsse eigentlich nach unten aus dem Bildschirm (DEC laser.y, 5) bevor sie gelöscht werden?
Sollten die nicht nach rechts fliegen (spielerx+10 usw.)?

Der Tip von Dr.DamnFist ist ratsam, macht die Sache übersichtlicher. Eine Funktion zum Initialisieren von Zeugs, eine zum Abfragen der Steuerung, eine zur Beeinflussung;

Edit: Vielleicht magst Dir einen meiner Gehversuche ansehen
Code:
//2D Homework
//todo: ship sprite

GLOBAL IMG$ = "ball2.bmp", comets[] AS typeComet
LOCAL i = 0, n = 10, speed = 1, dtime, fps, delay, showfps
DIM comets[n]

TYPE typeComet
	id
	startx
	starty
	x
	y
	ballr
	speed
	sy
	rMod
	maxAngle
	minAngle
ENDTYPE

TYPE typeShip
	x
	y
ENDTYPE

//initialize comets
FOREACH c IN comets[]
	c = newComet(i)
	i = i + 1
NEXT


WHILE KEY(57) <> 1


//and move them
	FOREACH c IN comets[]
		c = moveComet(c)


//reset offscreen comets
		IF c.x < - 55 OR c.y < -55 OR c.y > 480
//			LOADSPRITE "", c.id
			c = newComet(c.id)
//			DIMDEL
		ENDIF
	NEXT


//debug

 dtime = GETTIMER()
 fps = ((1000/dtime)+fps)/2
 delay=delay+dtime
 IF delay>500
  delay=0
  showfps=fps
 ENDIF
 PRINT "FPS: "+showfps+" dtime:"+dtime, 5, 420
	PRINT "  TIME  "+GETTIMERALL()/1000,5,430
	PRINT "     X  "+comets[0].x,5,440
	PRINT "     Y  "+comets[0].y,5,450
	PRINT " SPEED  "+comets[0].speed,5,460
	SHOWSCREEN

WEND


FUNCTION newComet AS typeComet: id
	LOCAL myComet AS typeComet
	LOADSPRITE IMG$, id

//set the id, randomize spawn location and rotation state

	myComet.id = id
	myComet.startx = 640+RND(800)
	myComet.starty = -200+RND(880)
	myComet.x = myComet.startx
	myComet.y = myComet.starty
	myComet.ballr = RND(358)
	myComet.rMod = 1 + (1+(-5+RND(10))/10.0)
	myComet.speed = 2 * (1+(-3+RND(6))/10.0)

//calc min/maxAngle depending on spawn position

	myComet.maxAngle = ATAN(myComet.starty,myComet.startx)
	myComet.minAngle = ATAN(480-myComet.starty,myComet.startx)
	myComet.maxAngle = -myComet.minAngle +RND(myComet.minAngle+myComet.maxAngle)

	RETURN myComet
ENDFUNCTION



FUNCTION moveComet AS typeComet: item AS typeComet

//rotation
	IF item.ballr > 358
		item.ballr = 1
	ELSE
		item.ballr = item.ballr + item.rMod
	ENDIF

//determine y-pos, move, buffer

	item.sy = SIN(item.maxAngle) * (item.startx - item.x) / COS(item.maxAngle)
	item.y = item.starty - item.sy
	item.x = item.x - item.speed
	ROTOSPRITE item.id, item.x, item.y, item.ballr


RETURN item
ENDFUNCTION


//not visualized yet:
FUNCTION moveShip AS typeShip: item AS typeShip
	IF KEY(205)
		item.x = item.x + 2
	ENDIF
	IF KEY(203)
		item.x = item.x - 2
	ENDIF
	IF KEY(200)
		item.y = item.y + 2
	ENDIF
	IF KEY(208)
		item.y = item.y - 2
	ENDIF
RETURN item
ENDFUNCTION
 
Wie und wann rufst Du diese Funktion auf? LOCAL Sachen beziehen sich laut der Hilfe nicht auf eine Funktion, sondern auf die SUB/das Hauptprogramm. Kann es sein, dass Du das Array schuesse immer wieder neu anlegst, einen ersten Schuss drin speicherst und dann wieder überschreibst?
Danke, dass Problem war tatsächlich, dass ich die Variablen als LOCAL angegeben habe. Wenn man sie in GLOBAL umändert funktioniert alles perfekt. Ich bin hier eben noch ein ziemlicher Anfänger.
Warum fallen die Laserschüsse eigentlich nach unten aus dem Bildschirm (DEC laser.y, 5) bevor sie gelöscht werden?
Das ist schon richtig so, bei GLbasic befindet sich Y=0 am oberen Rand, die Schüsse fliegen also nach oben, wie es auch sein soll.

Danke für die Hilfe!
 
Ich hab keinen Strich mehr daran getan. Es fehlen noch Player, Kollision uvm. Setze mich vielleicht nächstes Jahr wieder mal ran.
 
Back
Top