Hilfe für Shoot 'em up in GLbasic

Coden in GLBasic
Antworten
Autor
Nachricht
Benutzeravatar
felix330
Forum Team
Forum Team
Beiträge: 505
Registriert: Do Mär 13, 2008 15:30

Hilfe für Shoot 'em up in GLbasic

#1 Beitrag von felix330 » Mi Okt 27, 2010 19:45

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: Alles auswählen

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?

Benutzeravatar
Chris_S
8 Bit
Beiträge: 346
Registriert: Mo Dez 14, 2009 17:53
Wohnort: Remptendorf
Kontaktdaten:

Re: Hilfe für Shoot 'em up in GLbasic

#2 Beitrag von Chris_S » Mi Okt 27, 2010 19:55

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
"Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren." Benjamin Franklin


going indie : www.roughnightsoftwares.de check it out!

Benutzeravatar
kuru
10 Bit
Beiträge: 1032
Registriert: Do Dez 04, 2008 09:13

Re: Hilfe für Shoot 'em up in GLbasic

#3 Beitrag von kuru » Do Okt 28, 2010 00:52

felix330 hat geschrieben:(...)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
SpoilerShow

Code: Alles auswählen

//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



Benutzeravatar
felix330
Forum Team
Forum Team
Beiträge: 505
Registriert: Do Mär 13, 2008 15:30

Re: Hilfe für Shoot 'em up in GLbasic

#4 Beitrag von felix330 » Do Okt 28, 2010 13:57

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!

Benutzeravatar
kuru
10 Bit
Beiträge: 1032
Registriert: Do Dez 04, 2008 09:13

Re: Hilfe für Shoot 'em up in GLbasic

#5 Beitrag von kuru » Do Okt 28, 2010 16:41

ha, in die richtige Richtung geraten, bitte gerne :)

einserbubi
8 Bit
Beiträge: 274
Registriert: So Dez 26, 2010 15:14

Re: Hilfe für Shoot 'em up in GLbasic

#6 Beitrag von einserbubi » Mo Dez 27, 2010 19:14

kann man die Spiele per E-Mail schicken?

Würd mich freuen...

Benutzeravatar
kuru
10 Bit
Beiträge: 1032
Registriert: Do Dez 04, 2008 09:13

Re: Hilfe für Shoot 'em up in GLbasic

#7 Beitrag von kuru » Di Dez 28, 2010 05:26

Ich hab keinen Strich mehr daran getan. Es fehlen noch Player, Kollision uvm. Setze mich vielleicht nächstes Jahr wieder mal ran.

Antworten

Zurück zu „GLBasic“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast