3D-Spaceshooter

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

3D-Spaceshooter

Beitrag 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
Zuletzt geändert von Darie am 30.01.2010 14:38, insgesamt 1-mal geändert.
Repeat
PureBasic
ForEver
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: 3D-Spaceshooter

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: 3D-Spaceshooter

Beitrag von Darie »

Sorry, hoffe es klappt jetzt
Repeat
PureBasic
ForEver
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: 3D-Spaceshooter

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: 3D-Spaceshooter

Beitrag von Darie »

Tja, schade dass es kein Feedback gibt. Werde das Ganze mal mit dem N3XTD-Wrapper ausprobieren...
Repeat
PureBasic
ForEver
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: 3D-Spaceshooter

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: 3D-Spaceshooter

Beitrag 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???
Repeat
PureBasic
ForEver
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: 3D-Spaceshooter

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: 3D-Spaceshooter

Beitrag 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
Repeat
PureBasic
ForEver
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: 3D-Spaceshooter

Beitrag 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)
Repeat
PureBasic
ForEver
Antworten