3D-Spaceshooter
Verfasst: 30.01.2010 13:46
Hallo Leute !!!
Da ich mal ausprobieren wollte was mit der Ogre-Implementierung drin ist, hab ich angefangen einen kleinen 3D-Spaceshooter zu programmieren.
Nun wollte ich zwei Partikelemitter als Rückstrahl fürs Schiff verwenden und habe versucht den Strahl mit ParticleEmitterDirection so zu fixieren, dass
er beim Lenken nicht immer nachzieht. Leider klappt das nicht so, wie ich es mir vorgestellt habe :
Hier ist der Download-Link: http://rapidshare.com/files/343343475/Stryder.rar
EasyMirror: http://easymirror.net/files/0GE47GUQ/Stryder.rar
Hat jemand vielleicht eine Idee, wie man den Rückstrahl vernünftig realisieren könnte ??? Eventuell einen Pixel/Texture-Shader oder sowas ???
Weiss jemand ob man Entities irgendwie langsam ausblenden kann ??? Als nächsten Schritt wollte ich den ersten Gegner hinzufügen und die Kollisionsabfrage proggen.
Mache mir ausserdem Gedanken darüber, wie ich Explosionen und Treffer realisieren soll.
Ich hoffe ja immer noch, das Fred irgendwann an der Ogre-Implementierung weiterarbeitet.
Grüsse
Alexander
Da ich mal ausprobieren wollte was mit der Ogre-Implementierung drin ist, hab ich angefangen einen kleinen 3D-Spaceshooter zu programmieren.
Nun wollte ich zwei Partikelemitter als Rückstrahl fürs Schiff verwenden und habe versucht den Strahl mit ParticleEmitterDirection so zu fixieren, dass
er beim Lenken nicht immer nachzieht. Leider klappt das nicht so, wie ich es mir vorgestellt habe :
Code: Alles auswählen
;
; STRYDER 3D GAME 2010 by Alexander Diaconu
;
Structure Bullet
ID.i
life.i
x.f
y.f
z.f
s.f
xd.f
yd.f
EndStructure
Structure P
EndStructure
Global sx.f, sz.f, vx.f , vz.f , sa.f, ca.f
Global NewList Bullet.Bullet()
Global CamSpeed = 20 , CamMode = 0, RenderMode = 0, FullScreen = 1
Global KeyX, KeyY, RollZ, RotX, RotY, MouseX, MouseY, FPS, VSync = 1
Global TimeGap, Timer, TimerDuration = 1000 / 60
Declare InitGame()
Declare Keyboard()
Declare AddBullet()
Declare BulletDo()
Procedure InitGame()
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
Add3DArchive("\", #PB_3DArchive_FileSystem)
AntialiasingMode(#PB_AntialiasingMode_x6)
If Not FullScreen
OpenWindow(0,0,0,1024,768,"Stryder",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0,VSync)
Else
ExamineDesktops()
OpenScreen(DesktopWidth(0),DesktopHeight(0),32,"Stryder",VSync)
EndIf
LoadMesh(0,"kanal.mesh")
LoadMesh(1,"ship.mesh")
LoadMesh(2, "bullet.mesh")
LoadTexture(0,"kanal2.png")
LoadTexture(1,"ship2.png")
LoadTexture(2, "flare.png")
LoadTexture(3, "bullet.png")
CreateMaterial(0,TextureID(0))
CreateMaterial(1,TextureID(1))
CreateMaterial(2, TextureID(2))
CreateMaterial(3, TextureID(3))
CreateEntity(0,MeshID(0),MaterialID(0)) : ;CreateEntity(2,MeshID(0),MaterialID(0))
CreateEntity(1,MeshID(1),MaterialID(1))
; Ship
EntityLocate(1,0,-9,0)
RotateEntity(1, 0, 180, 0 ,#PB_Absolute)
MaterialDiffuseColor(1, $ffffff)
;MaterialBlendingMode(1, #PB_Material_Add)
;MaterialFilteringMode(1,#PB_Material_Trilinear)
;MaterialShadingMode(1, #PB_Material_Phong) ;#pb_material_flat ;#pb_material_gouraud
;ResizeEntity(1,0.9,0.9,0.9)
;ScaleEntity(1,0.9,0.9,0.9)
; Kanal
EntityLocate(0,0,-1.6,3400) : ;EntityLocate(2,0,150,3400) : RotateEntity(2,0,0,180)
ScrollMaterial(0,0,-0.06,#PB_Material_Animated)
MaterialFilteringMode(0,#PB_Material_Trilinear)
DisableMaterialLighting(0, 0)
;Scaleentity(0,1.4,1,5)
;Bullet
MaterialBlendingMode(3, #PB_Material_Color)
CreateCamera(0, 0, 0, 100, 100) ;camerafov(0,70)
CameraLocate(0,0,20,-47)
CameraLookAt(0,EntityX(1),EntityY(1),EntityZ(1))
RotateCamera(0,17,0,0, #PB_Relative)
SkyDome("hd.jpg",0)
CreateLight(0,$ffffff,-40,20,40)
Fog($000000,180, 400, 7000)
;Ambientcolor($ffffff)
;Parse3DScripts()
; Partikel-Emitter Schiff
CreateParticleEmitter(2, 0, 0, 0, #PB_Particle_Point , -2.8, -9, -8)
CreateParticleEmitter(3, 0, 0, 0, #PB_Particle_Point, 2.8, -9, -8)
ParticleEmitterDirection(2, 0, -0.3,-2.3)
ParticleEmitterDirection(3, 0, -0.3,-2.3)
ParticleMaterial (2, MaterialID(2))
ParticleMaterial (3, MaterialID(2))
ParticleTimeToLive (2, 0.4,0.4)
ParticleTimeToLive (3, 0.4,0.4)
ParticleEmissionRate(2, 50)
ParticleEmissionRate(3, 50)
ParticleSize (2, 2, 2)
ParticleSize (3, 2,2)
ParticleColorRange (2, $2220DD,$2ECDD1)
ParticleColorRange (3, $2220DD,$2ECDD1)
;ParticleVelocity(2,-100,-100)
;ParticleVelocity(3,1,1)
;Hintergrund
CreateParticleEmitter(1, 5000, 400 ,40, #PB_Particle_Box , 0, 0, 6000)
ParticleEmitterDirection(1, 0, 0, -10)
ParticleMaterial (1, MaterialID(2))
ParticleTimeToLive (1, 10, 10)
ParticleEmissionRate(1, 880)
ParticleSize (1, 9,9)
ParticleColorRange (1, $000000,$FFFFFF)
ParticleVelocity(1,00,10)
MaterialBlendingMode(2, #PB_Material_Add)
DisableMaterialLighting(2, 1)
EndProcedure
Procedure Keyboard()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
keyx = -1 : vx + 0.25
If sa < 26 : sa + 1.5 : EndIf
If sx < 121 : ca + 0.7 : EndIf
ElseIf KeyboardPushed(#PB_Key_Right)
keyx = 1 : vx + 0.25
If sa > -26 : sa - 1.5 : EndIf
If sx > -121 : ca - 0.7 : EndIf
ElseIf cammode = #True
keyx = 0
EndIf
If KeyboardReleased(#PB_Key_Left)
;RotateCamera(0,0,0,0.4,#PB_Relative)
ElseIf KeyboardReleased(#PB_Key_Right)
RotateCamera(0,0,0,-0.4,#PB_Relative)
EndIf
If KeyboardPushed(#PB_Key_Up)
keyy = -1 : vz + 0.1
If sz < 115 : ScaleEntity(1, 1.002,1.002,1.002) : EndIf
ElseIf KeyboardPushed(#PB_Key_Down)
keyy = 1 : vz + 0.1
If sz > 0 : ScaleEntity(1, 0.998,0.998,0.998) : EndIf
ElseIf cammode = #True
keyy = 0
EndIf
If KeyboardPushed(#PB_Key_PageUp)
rollz = 1
ElseIf KeyboardPushed(#PB_Key_PageDown)
rollz = 0
EndIf
If KeyboardReleased(#PB_Key_Space)
AddBullet()
EndIf
If KeyboardReleased(#PB_Key_F1)
EndIf
If KeyboardReleased(#PB_Key_F2)
Rendermode = Rendermode + 1
Select Rendermode
Case 0 : CameraRenderMode(0, #PB_Camera_Textured)
Case 1 : CameraRenderMode(0, #PB_Camera_Wireframe)
Case 2 : CameraRenderMode(0, #PB_Camera_Plot)
EndSelect
If Rendermode = 2 : Rendermode = -1 : EndIf
EndIf
If KeyboardReleased(#PB_Key_F3)
If CamMode = #True : CamMode = #False : Else : CamMode = #True : EndIf
EndIf
ExamineMouse()
rotx = 0 : roty = 0
mousex = -MouseDeltaX()
mousey = -MouseDeltaY()
If MouseButton(#PB_MouseButton_Right)
rotx = mousey
roty = mousex
mousex = 0
mousey = 0
EndIf
EndProcedure
Procedure AddBullet()
s = Random(2) : If s = 2 : s = -1 : EndIf
a = Random (9000)+1000 : dx.f = (100 / a) : dx.f = dx.f - Int(dx.f) * s
s = Random(2) : If s = 2 : s = -1 : EndIf
a = Random (9000)+1000 : dy.f = (100/ a) : dy.f = dy.f - Int(dy.f) * s
AddElement(Bullet()) : Bullet()\s = 8 + Random(5) : Bullet()\xd = dx.f * 2.2 : Bullet()\yd = dy.f * 2.2 : Bullet()\life = 10 + Random(90)
Bullet()\x = EntityX(1) - 2.8 : Bullet()\y = EntityY(1) : Bullet()\z = EntityZ(1)
Bullet()\ID = CreateEntity(#PB_Any, MeshID(2),MaterialID(3), Bullet()\x, Bullet()\y, Bullet()\z)
ResizeEntity(Bullet()\ID,0.35,0.35,0.4)
AddElement(Bullet()) : Bullet()\s = 8 + Random(5) : Bullet()\xd = dx.f * 2.2 : Bullet()\yd = dy.f * 2.2 : Bullet()\life = 10 + Random(90)
Bullet()\x = EntityX(1) + 2.8 : Bullet()\y = EntityY(1) : Bullet()\z = EntityZ(1)
Bullet()\ID = CreateEntity(#PB_Any, MeshID(2),MaterialID(3), Bullet()\x, Bullet()\y, Bullet()\z)
ResizeEntity(Bullet()\ID,0.35,0.35,0.4)
EndProcedure
Procedure BulletDo()
ResetList(Bullet())
While NextElement(Bullet())
;If EntityZ(Bullet()\ID) < 600
If Bullet()\life > 0
Bullet()\life - 1
Bullet()\z + Bullet()\s
Bullet()\x + Bullet()\xd
Bullet()\y + Bullet()\yd
EntityLocate(Bullet()\ID,Bullet()\x,Bullet()\y,Bullet()\z)
ScaleEntity(Bullet()\ID,1.015,1.015,1.015)
Else
FreeEntity(Bullet()\ID)
DeleteElement(Bullet(),1)
EndIf
Wend
EndProcedure
InitGame()
Repeat
;Timer = ElapsedMilliseconds()
If Not Fullscreen
Select WaitWindowEvent(1)
Case #PB_Event_CloseWindow
Quit = #True
EndSelect
EndIf
Keyboard()
If Not CamMode
sx = EntityX(1) + keyx * - vx
sz = EntityZ(1) + keyy * - vz
If sx > 121 : sx = 121 : EndIf
If sx < -121 : sx = -121 : EndIf
If sz > 115 : sz = 115 : EndIf
If sz < 0 : sz = 0 : EndIf
ParticleEmitterLocate(2, sx+2.8, -9, sz-5)
ParticleEmitterLocate(3, sx-2.8, -9, sz-5)
ParticleEmitterDirection(2, 0, 0,-1)
ParticleEmitterDirection(3, 0, 0,-1)
EntityLocate(1, sx,-9, sz) : RotateEntity(1, 0,180, sa, #PB_Absolute) : RotateCamera(0,-17,180,ca,#PB_Absolute)
vx * 0.97 : vz * 0.97 : sa * 0.97 : ca * 0.97
BulletDo()
CameraLocate (0, sx, CameraY(0),CameraZ(0))
Else
RotateCamera(0, mousey, mousex, 0, #PB_Relative)
MoveCamera (0, keyx*CamSpeed, 0, keyy*CamSpeed)
EndIf
FPS = Engine3DFrameRate(#PB_Engine3D_Current)
RenderWorld()
;TimeGap = TimerDuration - (ElapsedMilliseconds() - Timer)
;If TimeGap > 16 : Delay( TimeGap-10) : EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = #True
EasyMirror: http://easymirror.net/files/0GE47GUQ/Stryder.rar
Hat jemand vielleicht eine Idee, wie man den Rückstrahl vernünftig realisieren könnte ??? Eventuell einen Pixel/Texture-Shader oder sowas ???
Weiss jemand ob man Entities irgendwie langsam ausblenden kann ??? Als nächsten Schritt wollte ich den ersten Gegner hinzufügen und die Kollisionsabfrage proggen.
Mache mir ausserdem Gedanken darüber, wie ich Explosionen und Treffer realisieren soll.
Ich hoffe ja immer noch, das Fred irgendwann an der Ogre-Implementierung weiterarbeitet.
Grüsse
Alexander