Seite 1 von 3

In Ogre Kugel "Werfen"

Verfasst: 04.02.2009 08:45
von kob
Hallo ich möchte ein spiel schreiben , das wie ein ego-shoter ist .
wollte ich schonmal hat aber nicht so wirklich geklapt . Daraus habe
ich gelernt erst einmal die purebasic 3ddemos zu verunstalten . jetzt möchte ich das wenn ich den linken mouse button drücke , ein entity
von der kameraposition zu der position fliegt wo sie hin schaut .

PS: Sorry für die vormulirung .

Verfasst: 05.02.2009 23:19
von xperience2003
neja, das entity an der camera erstellen, in den gleichen winkel wie die blickrichtung der camera drehen und dann vorwaerz bewegen

Meine ich anders

Verfasst: 09.02.2009 18:10
von kob
die kugel soll j aunendlich weiterfliegen . soll so sein wie bei
einem shoter . damit möchte ich kuken auf welches enety der player greade schaut und dan " schaden verursachen "

Verfasst: 09.02.2009 18:25
von Kaeru Gaman
dann mach lieber eine strahlenberechnung.
dafür eine entity zu bewegen ist overkill, braucht viel zu viel rechenkapazitäten.

also mal abstrakt:
du hast den richtungsvektor deines players und seine ortskoordinaten.
den richtungsvektor kannst du beliebig verlängern,
und wenn der eine andere entity berührt dann wird diese getroffen.

eigentlich solltest du das uach nicht händisch machen brauchen,
eine Engine sollte eine Funktion für sowas mitliefern.

So ähnlich

Verfasst: 11.02.2009 13:18
von kob
Ich habe aber leider nur die Kamerarotationen wie berechne ich nun die bewegungs vektoren ? bin in sowas nicht sehr helle , aber wen ich es verstanden habe (was nicht lange dauert) das leuft es !

Verfasst: 11.02.2009 13:47
von Kaeru Gaman
wie gesagt, eigentlich sollte die Engine funktionen dafür mitbringen.
hab mich noch nicht eingehend mit der OGRE in PB 4.3 auseinandergesetzt,
vielleicht weiß ja jemand anderes mehr.



erklären kann ichs dir mal schnell als 2D beispiel:

nehmen wir mal an, nach oben ist 0° drehung.
du drehst dein objekt 30° nach rechts.
dann musst du Sin(30°) = 0.5 nach rechts und Cos(30°) = 0.866 nach oben gehen,
wenn du das objekt in dieser richtung bewegen willst.
das ist sein bewegungsvektor oder richtungsvektor. (0.5, 0.866)

wenn es sich jetzt am Ort x=500 y=300 befindet, ist sein Ortsvektor (500,300)
also rechnest du, wenn du das objekt bewegst,
in jedem Schritt x + 0.5 * Speed : y + 0.866 * Speed um den neuen ort zu erhalten.
also (500,300) + (0.5, 0.866) = (500.5, 300.866)
(achtung: das ist jetzt mathematisch, bei nem Screen ist die y-achse umgedreht.)

anstatt jetzt das objekt zu bewegen, kannst du auch immer wieder den richtungsvektur dazuaddieren,
um zu testen, ob in der bewegungs- oder schussrichtung vom objekt aus ein anderes objekt liegt.


weitergehend kannst du auch aus der Bewegungsrichtung eine Gerade berechnen,
und dann ausrechnen, ob diese Gerade eine Schnittmenge mit der BoundingBox des Zieles hat.
das ist letztendlich auch die Funktion, die bei der Engine mit drin sein sollte.

Verfasst: 11.02.2009 19:21
von Kevin
vieleicht kann dir das helfen
kopiere denn code in das verzeichnis der PB beispiele

du brauchst für den code PB4.3

Code: Alles auswählen

#CameraSpeed = 5


Define.f KeyX, KeyY, MouseX, MouseY

InitEngine3D()
  Add3DArchive("DATA", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  glob_screen_w=1024
  glob_screen_h=768
  
OpenScreen(glob_screen_w,glob_screen_h,16,"test")

Global GlobalID.l  
 GlobalID=1000
 
Structure Shot
 x.f
 y.f
 z.f
 xx.f
 yy.f
 zz.f
 c.w
 id.w
 cc.w
EndStructure
 Global NewList Shot.Shot()
Procedure AddShot(x.f,y.f,z.f,xx.f,yy.f,zz.f)
 AddElement(Shot())
 Shot()\x=x
 Shot()\y=y
 Shot()\z=z
 Shot()\xx=xx*2
 Shot()\yy=yy*2
 Shot()\zz=zz*2
EndProcedure

CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), #PB_Material_Add)
CreateTerrain("terrain.png", MaterialID(0), 16, 1, 16, 1)

LoadTexture(5, "Flare.png")

CreateMesh(9,100) 
SetMeshData(9,#PB_Mesh_Vertex|#PB_Mesh_Normal|#PB_Mesh_UVCoordinate,?CubePoints,16) 
SetMeshData(9,#PB_Mesh_Face,?CubeTriangles,12) 

LoadMesh   (55 , "robot.mesh")
LoadTexture(55, "r2skin.jpg")
CreateMaterial(55, TextureID(55))
CreateEntity(55, MeshID(55), MaterialID(55),256,256,256)
EntityMaterial(55, MaterialID(55))

AnimateEntity(55, "Walk")

CreateMaterial(5, TextureID(5))
;DisableMaterialLighting(5, 1)
;MaterialBlendingMode(5, #PB_Material_Add)
CreateParticleEmitter(0, 10, 1, 1, 0,256,25,256)
ParticleMaterial(0, MaterialID(5))
ParticleTimeToLive(0, 0.1, 1)
ParticleEmissionRate(0,5)
ParticleSize(0,5,5)
ParticleColorRange(0, RGB(255,0,0), RGB(64,0,0))
    
    AmbientColor(RGB(255,255,255))
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 512, 256, 512)
    
   SkyDome("clouds.jpg",10)
  
   Repeat
    FlipBuffers()
    ExamineKeyboard()
    ExamineMouse()
    
    RenderWorld()
    
  If MouseButton(1)
   mb1=4
  Else
   If mb1>0
    mb1-1
   EndIf
  EndIf

  If MouseButton(2)
   mb2=4
  Else
   If mb2>0
    mb2-1
   EndIf
  EndIf

            
ForEach Shot()
If Shot()\c=0
Shot()\c=1
GlobalID+1
Shot()\id=GlobalID
CreateEntity(100+Shot()\id,MeshID(9),MaterialID(5),Shot()\x,Shot()\y,Shot()\z)
buf=100+Shot()\id
bufx=EntityX(buf);+Shot()\xx
bufy=EntityY(buf);+Shot()\yy
bufz=EntityZ(buf);+Shot()\zz  
bufy+TerrainHeight(bufx,bufz)+10  
EntityLocate(buf,bufx,bufy,bufz)
EndIf
MoveEntity(100+Shot()\id,Shot()\xx,Shot()\yy,Shot()\zz)
Shot()\cc+1
If Shot()\cc>500
FreeEntity(100+Shot()\id)
DeleteElement(Shot())
EndIf
Next
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      
      Height.f = TerrainHeight(CameraX(0), CameraZ(0))
      
      RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
      MoveCamera  (0, KeyX, -CameraY(0)+Height+50, KeyY)

If mb1=1
If  PointPick(0,glob_screen_w/2,glob_screen_h/2);PointPick(0,MouseX(),MouseY())
AddShot(CameraX(0),-CameraY(0)+Height+80,CameraZ(0),PickX(),PickY(),PickZ())
EndIf
EndIf


    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
 End

#SQRT13 = 0.57735026

DataSection
CubePoints: 
Data.f -0.5,-0.5,-0.5 
Data.f -0.5,0,-0.5 
Data.f 0,1 
Data.f -0.5,-0.5,0.5 
Data.f -0.5,0,0.5 
Data.f 1,1 
Data.f 0.5,-0.5,0.5 
Data.f 0.5,0,0.5 
Data.f 0,1 
Data.f 0.5,-0.5,-0.5 
Data.f 0.5,0,-0.5 
Data.f 1,1 
Data.f -0.5,0.5,-0.5 
Data.f -0.5,0,-0.5 
Data.f 0,0 
Data.f -0.5,0.5,0.5 
Data.f -0.5,0,0.5 
Data.f 1,0 
Data.f 0.5,0.5,0.5 
Data.f 0.5,0,0.5 
Data.f 0,0 
Data.f 0.5,0.5,-0.5 
Data.f 0.5,0,-0.5 
Data.f 1,0 
Data.f -0.5,-0.5,-0.5 
Data.f 0,1,0 
Data.f 0,0 
Data.f -0.5,-0.5,0.5 
Data.f 0,1,0 
Data.f 1,0 
Data.f 0.5,-0.5,0.5 
Data.f 0,1,0 
Data.f 1,1 
Data.f 0.5,-0.5,-0.5 
Data.f 0,1,0 
Data.f 0,1 
Data.f -0.5,0.5,-0.5 
Data.f 0,-1,0 
Data.f 0,0 
Data.f -0.5,0.5,0.5 
Data.f 0,-1,0 
Data.f 1,0 
Data.f 0.5,0.5,0.5 
Data.f 0,-1,0 
Data.f 1,1 
Data.f 0.5,0.5,-0.5 
Data.f 0,-1,0 
Data.f 0,1 
CubeTriangles: 
Data.w 0,4,7 
Data.w 0,7,3 
Data.w 1,5,4 
Data.w 1,4,0 
Data.w 2,6,5 
Data.w 2,5,1 
Data.w 3,7,6 
Data.w 3,6,2 
Data.w 9,8,11 
Data.w 9,11,10 
Data.w 12,13,14 
Data.w 12,14,15 
EndDataSection

THX

Verfasst: 14.02.2009 01:41
von kob
Dankeder code hat mir geholfen , habe mir gleich mal die dem von
pb4.3 geladen , fand ich gut das die die engine geupdatet haben .
was ich aber doof finde ist das die hin und wieder befele rausnehmen .
da darfst du dein ganzen code umschreiben , die solten das lieber abwertzkomaktibel machen .

Verfasst: 14.02.2009 02:37
von Kaeru Gaman
Abwärtskompatibilität wird fürchterlich überschätzt.
das ist nur ne Kugel an 'ner Kette, wirklich brauchen tuts keiner.
... würde mich mal interessieren, was dir denn jetzt gefehlt hat in der neuen Version...
kann mich nicht entsinnen, dass so viel rausgenommen wurde...

im Endeffekt musst du dich einfach entscheiden
brauchst du die Befehle, die neu sind, dann musst du ein paar Sachen anders machen als vorher.
hast du bestehenden Code, bei dem es zu viel Aufwand ist, den Anzupassen, dann bleib bei der alten Version.
du kannst so viele PB-Versionen wie du lustig bist parallel installieren.

ja schon

Verfasst: 14.02.2009 15:27
von kob
Ich weis das ich mehrere versionen gleihzeitig laufen lassen kan .
ich fende es aber doof das es z.b. den befehl CountList() nicht mehr gibt .
Abwärtzkompaktibilität benutzt sogar DirectX . Und doof von Fantasysoftware finde ich auch das ich mit den update beschissen wurde . da
kauft man sich mal was , freut sich das man 10Jahre updates hat und dan kan man die einfach nicht laden . Toll