Seite 1 von 3

3D-Spaceshooter

Verfasst: 30.01.2010 13:46
von Darie
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 :

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

Re: 3D-Spaceshooter

Verfasst: 30.01.2010 14:00
von RSBasic
@Darie
Kannst du bitte den EasyMirror benutzen? (Siehe OffTopic)

Ich habe garkeine Möglichkeit, deine Datei zu downloaden:
Rapidshare hat geschrieben:Leider sind unsere Server derzeit überlastet und es sind keine weiteren Download-Plätze für Nicht-Mitglieder verfügbar. Sie können den Download jedoch später noch einmal probieren.

Re: 3D-Spaceshooter

Verfasst: 30.01.2010 14:52
von Darie
Sorry, hoffe es klappt jetzt

Re: 3D-Spaceshooter

Verfasst: 30.01.2010 15:06
von RSBasic
Zwar meinte ich eigentlich http://em.q-soft.ch, aber ist auch okay, trotzdem danke fürs Neuuploaden :)

@All:
Für diejenigen, die nicht lange warten möchten: http://www.rsbasic.q-soft.ch/backupprog ... tryder.rar

Re: 3D-Spaceshooter

Verfasst: 31.01.2010 19:18
von Darie
Tja, schade dass es kein Feedback gibt. Werde das Ganze mal mit dem N3XTD-Wrapper ausprobieren...

Re: 3D-Spaceshooter

Verfasst: 31.01.2010 19:24
von DarkDragon
Aus "Ogre.log":
18:23:27: OGRE EXCEPTION(3:RenderingAPIException): Failed to create Direct3D9 Device: Invalid call in D3D9RenderWindow::createD3DResources at OgreD3D9RenderWindow.cpp (line 606)
Es crasht, mehr macht es nicht.

Re: 3D-Spaceshooter

Verfasst: 31.01.2010 19:49
von Darie
Merkwürdig, bei mir und bei einem Freund von mir gibt's keine Probleme.
Was könnte denn das Problem sein ??? Bereits bei InitEngine3D ?!? Hast du ne NVidia oder ATI Karte???

Re: 3D-Spaceshooter

Verfasst: 31.01.2010 19:54
von DarkDragon
Also mit der anderen Grafikkarte gehts, obwohl die eine auch völlig DX9 kompatibel sein sollte.
Das erinnert mich aber stark an meinen Space Shooter von damals :lol: . Hab den leider garnichtmehr. Es fehlen bei dir aber noch Feinde und die Partikeldichte könnte höher sein und generell ruckelts häufig etwas.

Re: 3D-Spaceshooter

Verfasst: 31.01.2010 20:06
von Darie
Na hab mir gedacht so ein Shooter ist das simpelste was man in 3D proggen kann und ist auch alles noch provisorisch (Texturen etc.). Gegner kommen auch noch rein. Mal sehen wie die Kollionsabfragen so arbeiten. Dass es bei dir ruckelt ist schon mal kein gutes Zeichen. Würdest du mir eventuell dein Ogre.log zukommen lassen. Wann ruckelts denn bei dir ??? Wahrscheinlich beim Schiessen, oder???

Alexander

Re: 3D-Spaceshooter

Verfasst: 31.01.2010 20:18
von Darie
Na hab mir gedacht so ein Shooter ist das simpelste was man in 3D proggen kann und ist auch alles noch provisorisch (Texturen etc.). Gegner kommen auch noch rein. Mal sehen wie die Kollionsabfragen so arbeiten. Dass es bei dir ruckelt ist schon mal kein gutes Zeichen. Würdest du mir eventuell dein Ogre.log zukommen lassen. Wann ruckelts denn bei dir ??? Wahrscheinlich beim Schiessen, oder???

Alexander

Vielleicht hat das Schiff auch zuviele Polygone (ca 3600), aber bei nem Freund von mir läufts auch ruckelfrei mit nem alten AthlonXP und ner Nvidia 6200gs (oder so)