Page 1 of 3

Well you CAN do something useful with Engine3d

Posted: Thu Oct 04, 2007 3:06 am
by dracflamloc
Check out this FP shooter accuracy tester:
http://dracsoft.com/zips/FPSTester.zip

Posted: Thu Oct 04, 2007 4:06 am
by byo
Ha!

I like it. :lol:
I can imagine what we'll be able to do with the updated OGRE engine in a next PB update.

Re: Well you CAN do something useful with Engine3d

Posted: Thu Oct 04, 2007 4:25 am
by PB
Wow, that's pretty impressive! I didn't expect to see something that good! :shock:
Has the same feel as the Quake games, which is a great achievement. 8)

You're saving BMPs with a PNG extension though, as reported by IrfanView:

Code: Select all

---------------------------
IrfanView
---------------------------
Warning !
The file: "E:\~ Temp ~\2007-10-4 1191507307\shot1.png" is a BMP file with incorrect extension !
Rename ?
---------------------------
Yes   No
---------------------------

Posted: Thu Oct 04, 2007 4:26 am
by dracflamloc
Oh yea I forgot to add that png constant. Thanks for noticing

Posted: Sun Oct 07, 2007 6:15 pm
by Ollivier
Hi dracflamloc,

There's no source! It's a commercial project?

Posted: Sun Oct 07, 2007 6:54 pm
by Kaeru Gaman
is it duty nowadays to put sources to non-commercial projects? :shock:

Posted: Sun Oct 07, 2007 7:46 pm
by dracflamloc
THe source would make your eyes bleed. Trust me its for your own good.

But in case you want to torture yourself:

Code: Select all

;FPSTrainer - Copyright 2007 DracSoft - License: GNU GPL (www.gnu.org)

;todo - 'session log' of screenshots of every shot fired in a datetimed directory
;todo - 'onscreen accuraccy + totals

Define.f KeyX, KeyY, MouseX, MouseY

#RobotMesh    = 90
#RobotTexture = 90
#Robot        = 90

movex.f = Random(100)/100+0.5
movez.f = Random(100)/100+0.5
movey.f = Random(100)/100+0.5

scTerSize = 1024
mLwasdown = 0

isfullscreen=Val(ProgramParameter())
maxTime = Val(ProgramParameter())  

startMs = ElapsedMilliseconds()
shotsFired.f=0
shotsHit.f=0
shotCounter=0
sessionFolder.s=Str(Year(Date()))+"-"+Str(Month(Date()))+"-"+Str(Day(Date()))+" "+Str(Date())
  
If InitEngine3D()

  Add3DArchive("\", #PB_3DArchive_FileSystem)
  
  InitSound()
  InitSprite()
  UsePNGImageDecoder()
  UsePNGImageEncoder()
  UseOGGSoundDecoder()
  InitKeyboard()
  InitMouse()
  
  LoadSound(0,"./hit.ogg")
  LoadSound(1,"./miss.wav")
  
  If isfullscreen
    OpenScreen(640,480,32,"FPS Trainer")
  Else 
    OpenWindow(0,0,0,640,480,"FPS Trainer",#PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_Minimize|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)  
    OpenWindowedScreen(WindowID(0),0,0,640,480,1,0,0)
  EndIf 
  If 1=1
    LoadSprite(1,"gun.PNG")
    LoadSprite(2,"gunfire.PNG")
    EnableWorldPhysics(1)
    EnableWorldCollisions(1)
    
    WorldShadows(#PB_Shadow_Additive)
    WorldGravity(30)    
    
    AmbientColor(RGB(255,255,255))
    
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
    
    CreateTerrain("Terrain.png", MaterialID(0), 1,1,1, 4)

    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 128, 25, 128)
    
    SkyDome("Clouds.jpg",10)    
    
    LoadMesh   (#RobotMesh   , "Robot.mesh")
    LoadTexture(#RobotTexture, "skin.jpg")
    LoadTexture(#RobotTexture+1, "skinhit.jpg")
    
    CreateMaterial(0, TextureID(#RobotTexture))
    CreateMaterial(1, TextureID(#RobotTexture+1))
    
    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(0))
    ScaleEntity(#robot,0.1,0.1,0.1)
    SetEntityMass(#robot,69)
    EntityMaterial(#Robot, MaterialID(0))
    EntityLocate(#robot,100,TerrainHeight(100,100),100)
    EntityRenderMode(#robot,#PB_Entity_CastShadow)
    
    EntityPhysicBody(#Robot,#PB_Entity_BoxBody)
    AnimateEntity(#Robot, "Walk")
    
    DisableMaterialLighting(0, 1)
    
    MaterialAmbientColor(0, RGB(100, 100, 100))
    MaterialSpecularColor(0, RGB(255, 255, 255))
    ScrollMaterial(0, 0.15, 0, 1)
        
    CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
    LightSpecularColor(0, RGB(255, 0, 0))
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0,scTerSize/2,TerrainHeight(scTerSize/2,scTerSize/2)+10,scTerSize/2)
    CameraLookAt(0,EntityX(#robot),EntityY(#robot),EntityZ(#robot))
    ; CameraBackColor(0, RGB(0, 0, 255))
      
    Repeat
      event=WindowEvent()
      
      
      If setphys
        EnableWorldPhysics(1)
        EntityPhysicBody(#Robot,#PB_Entity_BoxBody)
        SetEntityMass(#robot,69)
        setphys=0
      EndIf 

      ClearScreen(RGB(0, 0, 0))
            
      If ExamineKeyboard()
      
        If KeyboardPushed(#PB_Key_A)
          KeyX = -2
        ElseIf KeyboardPushed(#PB_Key_D)
          KeyX = 2
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_W)
          KeyY = -2
        ElseIf KeyboardPushed(#PB_Key_S)
          KeyY = 2
        Else
          KeyY = 0
        EndIf
                
        If KeyboardPushed(#PB_Key_Add)
          Frame.f+0.005
        EndIf
        
      EndIf
      
      If ExamineMouse()
        MouseX = -MouseDeltaX()/5 
        MouseY = -MouseDeltaY()/5
      EndIf
      
      RotateEntity(#Robot, 1, 0, 0)
      RotateCamera(0, MouseX, MouseY, 0)
      MoveCamera  (0, KeyX, 0, KeyY)
      CameraLocate(0,CameraX(0),TerrainHeight(CameraX(0),CameraZ(0))+10,CameraZ(0))
      
      EntityLocate(#robot,EntityX(#robot)+movex,EntityY(#robot)+movey,EntityZ(#robot)+movez)
            
      If EntityY(#robot)<=TerrainHeight(EntityX(#robot),EntityZ(#robot)) Or prevEX < 0 Or prevEX > scTerSize Or prevEZ < 0 Or prevEZ > scTerSize
        ;EntityLocate(#robot,EntityX(#robot),TerrainHeight(EntityX(#robot),EntityY(#robot)),EntityZ(#robot))
        ex=Random(scTerSize/2)
        ez=Random(scTerSize/2)
        EntityLocate(#robot,ex,TerrainHeight(ex,ez),ez)
        EnableWorldPhysics(0)
        movex.f = Random(100)/100+0.5
        movez.f = Random(100)/100+0.5
        movey.f = Random(100)/100+0.5
        setphys=1
        EntityMaterial(#robot,MaterialID(0))
      EndIf 
      
      RenderWorld()
      
      If MouseButton(1) And mlwasDown=0
        DisplayTransparentSprite(2,0,0) ;fire!
      Else 
        DisplayTransparentSprite(1,0,0) ;normal
      EndIf 
      
      StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(RGB(255,255,255))
        DrawText(10,10,"Loc: "+Str(CameraX(0))+", "+Str(CameraZ(0)))
        DrawText(10,25,"Fired: "+Str(shotsFired))
        DrawText(10,40,"Hit: "+Str(shotsHit))
        If shotsfired>0
          DrawText(10,55,"Acc%: "+Str((shotsHit/shotsFired)*100.0))
        Else
          DrawText(10,70,"Acc%: n/a")
        EndIf 
        DrawText(10,85,"Time: "+Str((ElapsedMilliseconds()-startms)/1000)+" s")
      StopDrawing()
      
      FlipBuffers()
      
      If MouseButton(1) And mlwasDown=0
        GrabSprite(3,295,215,50,50)
        StartDrawing(SpriteOutput(3))
        shotsfired+1
        For i = 23 To 27
          For j = 23 To 27
            p=Point(i,j)
            If Red(p)>230 And Green(p)<10 And Blue(p)<10
              EntityMaterial(#robot,MaterialID(1))
              hitStr.s="H"
              PlaySound(0)
              Break 
            EndIf 
          Next 
        Next 
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(22,22,6,6,RGB(0,255,0))
        StopDrawing()
        
        If hitStr="H"
          shotshit+1
        Else
          PlaySound(1)
        EndIf 
        
        If shotsfired=1
          CreateDirectory("./"+sessionFolder)
        EndIf 
        SaveSprite(3,"./"+sessionFolder+"/shot"+Str(shotsFired)+hitStr.s+".png")
        hitStr.s = ""
        mlwasDown=1
      EndIf         
      
      If MouseButton(1)
        mLwasdown=1
      Else 
        mLwasdown=0
      EndIf 
      
      prevEX = EntityX(#robot)
      prevEY = EntityY(#robot)
      prevEZ = EntityZ(#robot)
      
      If (ElapsedMilliseconds()-startms)/1000 >= maxTime And maxtime>0
        Quit=1
      EndIf 
      
      Delay(10) ;60+fps
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

If shotsfired>0  
  fid=CreateFile(#PB_Any,"./"+sessionFolder+"/stats.log")
  If fid<>0
    WriteStringN(fid,"Fired: "+Str(shotsFired))
    WriteStringN(fid,"Hit: "+Str(shotsHit))
    WriteStringN(fid,"Acc%: "+Str((shotsHit/shotsFired)*100.0))
    WriteStringN(fid,"Time (s): "+Str((ElapsedMilliseconds()-startms)/1000))
    CloseFile(fid)
  EndIf
EndIf 
 
End
; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 229
; FirstLine = 199
; Folding = -
; Executable = FPSTrainer.exe
; DisableDebugger

Posted: Sun Oct 07, 2007 7:59 pm
by Ollivier
2 kaeru

Where have you seen such a obligation !?

Posted: Sun Oct 07, 2007 8:01 pm
by Kaeru Gaman
Ollivier wrote:There's no source! It's a commercial project?

Posted: Sun Oct 07, 2007 8:16 pm
by Ollivier
2 drac

Thanks! I will directly change 2, 3 lines and sell it!

>> It's really good to encourage using Ogre. I'm searching to pitch movements. But I didn't find X, Y and Z rotation values with the misc handles available. It could be certainly a simple calcul, like a cardan' rotation simulation.
I ask you the source too in order to know if there is many architectures of main loop with native statements. If there is only one, my 3D game' editor is in the good way! (Opensource, comme d'hab)

Posted: Sun Oct 07, 2007 8:20 pm
by Ollivier
2 kaeru

There's no bread! Does the baker fall ill?

Posted: Sun Oct 07, 2007 9:25 pm
by Irene
Ollivier wrote:2 kaeru

There's no bread! Does the baker fall ill?
No because the baker will most likely bake new bread ^o^

There are many free as in free beer products, meaning they are free to use but the source code isn't available for them. Open-Source <> Free @_@

Posted: Sun Oct 07, 2007 9:41 pm
by Ollivier
@drac

I changed sound and keys (Why not key arrows?). I hope you won't kill me...

Tschüss!

Code: Select all

;FPSTrainer - Copyright 2007 DracSoft - License: GNU GPL (www.gnu.org) 
;3D engine : OGRE. License : See www.ogre3d.org

;FPSTrainer - Copyright 2007 DracSoft - License: GNU GPL (www.gnu.org) 
;3D engine : OGRE. License : See www.ogre3d.org 

Global m_hMidiOut,m_MIDIOpen.b 


Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l) 
  dwFlags.l = nStatus | nCanal | (nData1 << 8 ) | (nData2 << 16) 
  temp.l = midiOutShortMsg_ (m_hMidiOut,dwFlags) ; 
   If temp<>0 
     MessageRequester ( "Problème" , "Erreur dans l'envoi du message MIDI" ,0) 
   EndIf 
EndProcedure 
Procedure MIDIOpen() 
   If m_MIDIOpen = 0 
     If midiOutOpen_ (@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0 
       MessageRequester ( "Problème" , "Impossible d'ouvrir le périphérique MIDI" ,0) 
     Else 
      SendMIDIMessage($C0,0,0,0) 
      m_MIDIOpen = 1 
     EndIf 
   EndIf 
EndProcedure 
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b) 
   If m_MIDIOpen 
    SendMIDIMessage($80 | Canal,0,Note,VelociteDown) 
    SendMIDIMessage($90 | Canal,0,Note,VelociteUp) 
   EndIf 
EndProcedure 
Procedure ChargeInstrument(Canal.b,Instrument.b) 
   If m_MIDIOpen 
    SendMIDIMessage($C0 | Canal,0,Instrument,0) 
   EndIf 
EndProcedure 

MIDIOpen() 

ChargeInstrument(0,127) ; canal , instrument 
;FPSTrainer - Copyright 2007 DracSoft 

;todo - 'session log' of screenshots of every shot fired in a datetimed directory 
;todo - 'onscreen accuraccy + totals 

Define.f KeyX, KeyY, MouseX, MouseY 

#RobotMesh    = 90 
#RobotTexture = 90 
#Robot        = 90 

movex.f = Random(100)/100+0.5 
movez.f = Random(100)/100+0.5 
movey.f = Random(100)/100+0.5 

scTerSize = 1024 
mLwasdown = 0 

isfullscreen=Val(ProgramParameter()) 
maxTime = Val(ProgramParameter())  

startMs = ElapsedMilliseconds() 
shotsFired.f=0 
shotsHit.f=0 
shotCounter=0 
sessionFolder.s=Str(Year(Date()))+"-"+Str(Month(Date()))+"-"+Str(Day(Date()))+" "+Str(Date()) 
  
If InitEngine3D() 

  Add3DArchive("E:\FPS\", #PB_3DArchive_FileSystem) 
  
  InitSound() 
  InitSprite() 
  UsePNGImageDecoder() 
  UsePNGImageEncoder() 
  UseOGGSoundDecoder() 
  InitKeyboard() 
  InitMouse() 
  
;  LoadSound(0,"./hit.ogg") 
;  LoadSound(1,"./miss.wav") 
  
  If isfullscreen 
    OpenScreen(640,480,32,"FPS Trainer") 
  Else 
    OpenWindow(0,0,0,640,480,"FPS Trainer",#PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_Minimize|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)  
    OpenWindowedScreen(WindowID(0),0,0,640,480,1,0,0) 
  EndIf 
  If 1=1 
    LoadSprite(1,"E:\FPS\gun.PNG") 
    LoadSprite(2,"E:\FPS\gunfire.PNG") 
    EnableWorldPhysics(1) 
    EnableWorldCollisions(1) 
    
    WorldShadows(#PB_Shadow_Additive) 
    WorldGravity(30)    
    
    AmbientColor(RGB(255,255,255)) 
    
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg")) 
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1) 
    
    CreateTerrain("Terrain.png", MaterialID(0), 1,1,1, 4) 

    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0, 128, 25, 128) 
    
    SkyDome("Clouds.jpg",10)    
    
    LoadMesh   (#RobotMesh   , "Robot.mesh") 
    LoadTexture(#RobotTexture, "skin.jpg") 
    LoadTexture(#RobotTexture+1, "skinhit.jpg") 
    
    CreateMaterial(0, TextureID(#RobotTexture)) 
    CreateMaterial(1, TextureID(#RobotTexture+1)) 
    
    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(0)) 
    ScaleEntity(#robot,0.1,0.1,0.1) 
    SetEntityMass(#robot,69) 
    EntityMaterial(#Robot, MaterialID(0)) 
    EntityLocate(#robot,100,TerrainHeight(100,100),100) 
    EntityRenderMode(#robot,#PB_Entity_CastShadow) 
    
    EntityPhysicBody(#Robot,#PB_Entity_BoxBody) 
    AnimateEntity(#Robot, "Walk") 
    
    DisableMaterialLighting(0, 1) 
    
    MaterialAmbientColor(0, RGB(100, 100, 100)) 
    MaterialSpecularColor(0, RGB(255, 255, 255)) 
    ScrollMaterial(0, 0.15, 0, 1) 
        
    CreateLight(0, RGB(0,0,255), 100.0, 0, 0) 
    LightSpecularColor(0, RGB(255, 0, 0)) 
    
    CreateCamera(0, 0, 0, 100, 100) 
    CameraLocate(0,scTerSize/2,TerrainHeight(scTerSize/2,scTerSize/2)+10,scTerSize/2) 
    CameraLookAt(0,EntityX(#robot),EntityY(#robot),EntityZ(#robot)) 
    ; CameraBackColor(0, RGB(0, 0, 255)) 
      
    Repeat 
      event=WindowEvent() 
      
      
      If setphys 
        EnableWorldPhysics(1) 
        EntityPhysicBody(#Robot,#PB_Entity_BoxBody) 
        SetEntityMass(#robot,69) 
        setphys=0 
      EndIf 

      ClearScreen(RGB(0, 0, 0)) 
            
      If ExamineKeyboard() 
      
        If KeyboardPushed(#PB_Key_Left) 
          KeyX = -2 
        ElseIf KeyboardPushed(#PB_Key_Right) 
          KeyX = 2 
        Else 
          KeyX = 0 
        EndIf 
        
        If KeyboardPushed(#PB_Key_Up) 
          KeyY = -2 
        ElseIf KeyboardPushed(#PB_Key_Down) 
          KeyY = 2 
        Else 
          KeyY = 0 
        EndIf 
                
        If KeyboardPushed(#PB_Key_Add) 
          Frame.f+0.005 
        EndIf 
        
      EndIf 
      
      If ExamineMouse() 
        MouseX = -MouseDeltaX()/5 
        MouseY = -MouseDeltaY()/5 
      EndIf 
      
      RotateEntity(#Robot, 1, 0, 0) 
      RotateCamera(0, MouseX, MouseY, 0) 
      MoveCamera  (0, KeyX, 0, KeyY) 
      CameraLocate(0,CameraX(0),TerrainHeight(CameraX(0),CameraZ(0))+10,CameraZ(0)) 
      
      EntityLocate(#robot,EntityX(#robot)+movex,EntityY(#robot)+movey,EntityZ(#robot)+movez) 
            
      If EntityY(#robot)<=TerrainHeight(EntityX(#robot),EntityZ(#robot)) Or prevEX < 0 Or prevEX > scTerSize Or prevEZ < 0 Or prevEZ > scTerSize 
        ;EntityLocate(#robot,EntityX(#robot),TerrainHeight(EntityX(#robot),EntityY(#robot)),EntityZ(#robot)) 
        ex=Random(scTerSize/2) 
        ez=Random(scTerSize/2) 
        EntityLocate(#robot,ex,TerrainHeight(ex,ez),ez) 
        EnableWorldPhysics(0) 
        movex.f = Random(100)/100+0.5 
        movez.f = Random(100)/100+0.5 
        movey.f = Random(100)/100+0.5 
        setphys=1 
        EntityMaterial(#robot,MaterialID(0)) 
      EndIf 
      
      RenderWorld() 
      
      If MouseButton(1) And mlwasDown=0 
        DisplayTransparentSprite(2,0,0) ;fire! 
      Else 
        DisplayTransparentSprite(1,0,0) ;normal 
      EndIf 
      
      StartDrawing(ScreenOutput()) 
        DrawingMode(1) 
        FrontColor(RGB(255,255,255)) 
        DrawText(10,10,"Loc: "+Str(CameraX(0))+", "+Str(CameraZ(0))) 
        DrawText(10,25,"Fired: "+Str(shotsFired)) 
        DrawText(10,40,"Hit: "+Str(shotsHit)) 
        If shotsfired>0 
          DrawText(10,55,"Acc%: "+Str((shotsHit/shotsFired)*100.0)) 
        Else 
          DrawText(10,70,"Acc%: n/a") 
        EndIf 
        DrawText(10,85,"Time: "+Str((ElapsedMilliseconds()-startms)/1000)+" s") 
      StopDrawing() 
      
      FlipBuffers() 
      
      If MouseButton(1) And mlwasDown=0 
        GrabSprite(3,295,215,50,50) 
        StartDrawing(SpriteOutput(3)) 
        shotsfired+1 
        For i = 23 To 27 
          For j = 23 To 27 
            p=Point(i,j) 
            If Red(p)>230 And Green(p)<10 And Blue(p)<10 
              EntityMaterial(#robot,MaterialID(1)) 
              hitStr.s="H" 
              PlayNoteMIDI(0,50, 127, 80) 
              Break 
            EndIf 
          Next 
        Next 
        DrawingMode(#PB_2DDrawing_Outlined) 
        Box(22,22,6,6,RGB(0,255,0)) 
        StopDrawing() 
        
        If hitStr="H" 
          shotshit+1 
        Else 
          PlayNoteMIDI(0,50, 127, 80) 
        EndIf 
        
        hitStr.s = "" 
        mlwasDown=1 
      EndIf          
      
      If MouseButton(1) 
        mLwasdown=1 
      Else 
        mLwasdown=0 
      EndIf 
      
      prevEX = EntityX(#robot) 
      prevEY = EntityY(#robot) 
      prevEZ = EntityZ(#robot) 
      
      If (ElapsedMilliseconds()-startms)/1000 >= maxTime And maxtime>0 
        Quit=1 
      EndIf 
      
      Delay(10) ;60+fps 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1 
  EndIf 
    
Else 
  MessageRequester("Error", "The 3D Engine can't be initialized",0) 
EndIf 

  
End 

Posted: Sun Oct 07, 2007 10:04 pm
by dracflamloc
Btw I forgot to put a license on that code above, though I did have my copyright on it. It will be licensed under the GPL.

Posted: Sun Oct 07, 2007 10:41 pm
by Ollivier
Fixed!