Seite 1 von 2

Marble Beetzyness 2D

Verfasst: 31.07.2008 11:07
von bEEtzY
Moin Leute,

hier mal ein kleines 2D Murmelspiel bei dem man sich selbst, in einem Texteditor, die Karten bauen kann.
Angelehnt an den C-64 Klassiker MarbleMadness.
Probleme habe ich noch mit der Framerate im Fenstermodus sowie mit der korrekten Wandkollision!
www.ABeetz.de

Verfasst: 31.07.2008 11:18
von STARGÅTE
Spielprinzip macht spaß, nur habe ich ein paar probleme:

Die kollisionen sind wirklich seltsam, an einigen stellen, liegt vermutlich daran das du den "Abprall" erst berechnet wenn die Kugel bereits "in" der Wand steckt,sodass du dann manchmal ein falsches resultat erhältst.

Des weiteren finde ich die Kontraste im Spiel nicht gut gewählt, auch wenn du dich vllt an den C64-Klassiger halten wolltest, aber dieses Rote-Weiße Karomuster nervt schon, vorallem wenn die Schrift darauf ist ...

Verfasst: 31.07.2008 11:31
von bEEtzY
Kollision: ich berechne die neue Position und prüfe dann die Kollision mittels der 9 Segmente aus http://www.purebasic.fr/german/viewtopi ... 234#129234, ist nicht perfekt mir fällt aber momentan auch nix besseres ein.
Was die Grafik und Sound angeht, so ist das nicht wirklich mein Gebiet, falls jemand ein schöneres "Theme" bauen könnte wäre ich froh drum ;-)

Verfasst: 31.07.2008 11:40
von Andreas_S
Die Kollision zwischen Kugel und Wand geht ganz einfach:

Du unterteilst den Geschwindigkeitsvektor in zwei komponente: eine steht normal auf die Wand und die zweite ist parallel zur Wand.
Dann kehrst du den der auf die Wand normal steht (mit -).

Fertig.

Da deine Wände immer parallel zur x und y Achse stehen ist das ganze ja noch vereinfacht...

Verfasst: 31.07.2008 14:22
von bEEtzY
D.h. es muss als nächstes erstmal heraus gefunden werden mit welcher Begrenzung des Tiles der Geschwindigkeitsvektor sich schneidet!?

Verfasst: 31.07.2008 14:38
von Fluid Byte
Ich glaube was er meint is die gute alte "Breakout-Kollsion"! :mrgreen:

Code: Alles auswählen

InitSprite() : InitKeyboard() : InitSprite3D()

OpenWindow(0,0,0,640,480,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)

CreateSprite(0,50,50)
StartDrawing(SpriteOutput(0))
Ellipse(25,25,25,25,#Red)
StopDrawing()

#Accel = 0.5

SpeedX.f = 3
SpeedY.f = 4
BallX = 320
BallY = 240

Repeat
	EventID = WindowEvent()
		
	ClearScreen(0)
	
	ExamineKeyboard()

	If KeyboardPushed(#PB_Key_Left) : SpeedX.f - #Accel : EndIf
	If KeyboardPushed(#PB_Key_Right) : SpeedX.f + #Accel : EndIf	
	If KeyboardPushed(#PB_Key_Up) : SpeedY.f - #Accel : EndIf
	If KeyboardPushed(#PB_Key_Down) : SpeedY.f + #Accel : EndIf
	
	If BallX <= 0 Or BallX >= 590 : SpeedX = -SpeedX : EndIf
	If BallY <= 0 Or BallY >= 430 : SpeedY = -SpeedY : EndIf
	
	BallX + SpeedX : BallY + SpeedY
	
	DisplaySprite(0,BallX,BallY)
	
	FlipBuffers()
Until KeyboardPushed(1) Or EventID = #WM_CLOSE

Verfasst: 31.07.2008 14:52
von Andreas_S
bEEtzY hat geschrieben:D.h. es muss als nächstes erstmal heraus gefunden werden mit welcher Begrenzung des Tiles der Geschwindigkeitsvektor sich schneidet!?
>> !?
:freak:

1.) Vektoren können sich nicht schneiden! Sie sind überall.

2.) Wenn du wissen willst wann sich die Kugel mit der Mauer schneidet, dann betrachte die Gerade zwischen dem Mittelpunkt jetzt und zur nächste Zeiteinheit und Berechne den Schnittpunkt zur Geraden der Mauer!

Verfasst: 31.07.2008 14:58
von DrShrek
Gibt es auch einen Screenshot?

Verfasst: 31.07.2008 15:00
von Andreas_S
Beim Link vil. :?

Verfasst: 31.07.2008 15:00
von Deeem2031
Andreas_S hat geschrieben:1.) Vektoren können sich nicht schneiden! Sie sind überall.

2.) Wenn du wissen willst wann sich die Kugel mit der Mauer schneidet, dann betrachte die Gerade zwischen dem Mittelpunkt jetzt und zur nächste Zeiteinheit und Berechne den Schnittpunkt zur Geraden der Mauer!
Eine Gerade ist nicht zwischen irgendwas, sie ist endlos lang. Was du meinst ist eine Strecke... :P