Seite 1 von 1

Vorhandene Entity bewegung bekommen

Verfasst: 05.02.2012 02:06
von The_Dark_Zim-.-
Hey ho
Habe gerade wieder angefangen mit PB zu Programmieren und versuch mich gerade in die 3D-Programmierung ein zu arbeiten.
Nun Wollte ich einen Ball haben welchen ich bewegen kann, mit der Tastatur. Funktioniert soweit auch ganz gut.

Ich benutze zurzeit MoveEntity() um eine bewegung des Balles zu erzeugen. Wie bekomme ich aber die vorhandene Bewegung abgefragt? Damit ich eine Flüssigere beweung erzeugen kann mit ausrollen und damit ich die Physik-Engine nicht komplett ausschalte.

Ich hoffe ihr könnt mir weiterhelfen.

Gruß Zim

EDIT: Scheinen sich ja nicht viele im 3D bereich aus zu kennen :(

Re: Vorhandene Entity bewegung bekommen

Verfasst: 12.02.2012 00:07
von Darie
Hallo DarkZim,

ist eigentlich nicht das, was du gerne haben wolltest, aber auch ganz lustig. Hab ein bisschen "geschummelt" und die Physikbefehle benutzt, also
den Ball mit AddEntityImpulse beschleunigt. Entweder du berechnest die Richtung und die Beschleunigung deiner Kugel anhand von Vektoren selber oder überlässt die ganze Arbeit den Physikbefehlen von PB.

Komischerweise bleibt die Kugel nie ganz liegen, sie rollt immer ein wenig weiter :shock:
Hier zum downloaden des Ganzen : http://www.file-upload.net/download-410 ... l.zip.html

Grüsse
Alexander



Nicht erschrecken, ist ganz wild zusammengeschustert:

Code: Alles auswählen

Enumeration
 #i0
 #i1
 #i2
 #i3
 #i4
 #i5
 #t0
 #t1
 #t2
 #t3
 #t4
 #t5
 #m1
 #m2
 #m3
 #m4
 #m5
EndEnumeration

Define sx.f
Define sz.f

Global xa,ya,za, cubeSize = 2, Ground = 2 , tilesize = 64


Declare LoadBuilding(filename.s)
Declare CreateCubes()

Procedure LoadBuilding(filename.s)
  
 File$ = filename
 ;File$ = OpenFileRequester("Load Building ", GetCurrentDirectory() , "txt (*.txt) | *.txt", 0)
 
 If ReadFile(0, File$) 
   
  MapSize$ = ReadString(0)  
  Dummy$   = ReadString(0)
  xa = Val(StringField(MapSize$, 1, "x"))    
  ya = Val(StringField(MapSize$, 2, "x"))     
  za = Val(StringField(MapSize$, 3, "x"))     
  
  Global Dim MapArray(xa, ya, za) 
  
  While ii < za + 1    
  Layer$ = ReadString(0) 
  Repeat
    iy + 1
    line$ = ReadString(0)
    If Line$ = Chr(10) Or Len(Line$) <> xa
      iy = 0 : ii + 1
      Break 
    Else
     For ix = 1 To Len(Line$) 
       Select Mid(Line$,ix,1)
       Case " "
       MapArray(ix,iy,ii) = 0 
       Case "#"
       MapArray(ix,iy,ii) = 0     
       Case "D"
       MapArray(ix,iy,ii) = 1
       Case "W"
       MapArray(ix,iy,ii) = 2 
       Case "L"
       MapArray(ix,iy,ii) = 3 
       Case "T"
       MapArray(ix,iy,ii) = 4 
       Case "G"
       MapArray(ix,iy,ii) = 5
       EndSelect
     Next ix
   EndIf  
 ForEver
 Wend
  CloseFile(0)             
 Else
  ProcedureReturn
   ;MessageRequester("Error","Could Not Open File !")
   Debug "FileError"
 EndIf

EndProcedure

Procedure CreateCubes()

CatchImage(#i1, ?i1)
CatchImage(#i2, ?i2)
CatchImage(#i3, ?i3)
CatchImage(#i4, ?i4)
CatchImage(#i5, ?i5)

CreateTexture(#t1, tilesize, tilesize)
CreateTexture(#t2, tilesize, tilesize)
CreateTexture(#t3, tilesize, tilesize)
CreateTexture(#t4, tilesize, tilesize)
CreateTexture(#t5, tilesize, tilesize)

StartDrawing(TextureOutput(#t1))
DrawImage(ImageID(#i1),0,0)
StopDrawing()
StartDrawing(TextureOutput(#t2))
DrawImage(ImageID(#i2),0,0)
StopDrawing()
StartDrawing(TextureOutput(#t3))
DrawImage(ImageID(#i3),0,0)
StopDrawing()
StartDrawing(TextureOutput(#t4))
DrawImage(ImageID(#i4),0,0)
StopDrawing()
StartDrawing(TextureOutput(#t5))
DrawImage(ImageID(#i5),0,0)
StopDrawing()

CreateMaterial(#m1,TextureID(#t1))
CreateMaterial(#m2,TextureID(#t2))
CreateMaterial(#m3,TextureID(#t3))
CreateMaterial(#m4,TextureID(#t4))
CreateMaterial(#m5,TextureID(#t5))
MaterialBlendingMode(#m5, #PB_Material_Add)

CreateCube(1,cubeSize)

CreateEntity(1, MeshID(1),MaterialID(#m1))
CreateEntity(2, MeshID(1),MaterialID(#m2))
CreateEntity(3, MeshID(1),MaterialID(#m3))
CreateEntity(4, MeshID(1),MaterialID(#m4))
CreateEntity(5, MeshID(1),MaterialID(#m5))

  
;CreateStaticGeometry(0, xa * cubeSize, ya * cubeSize, (za+1) * cubeSize, 0) 
 
 For z = 0 To za  
  For y = 1 To ya
   For x = 1 To xa
    id = MapArray(x,y,z)
    xm = (x * cubeSize) - (xa * cubeSize / 2)
    ym = (y * cubeSize) - (ya * cubeSize / 2)
    zm = (z * cubeSize) + Ground
    ;If Not id = 0 : AddStaticGeometryEntity(0, EntityID(id), xm, zm, ym) : EndIf
    If Not id = 0 
    If id = 4
    ;AddStaticGeometryEntity(0, EntityID(id), xm, zm, ym,0.2,0.8,0.2)
    Else
    e = CopyEntity(id,#PB_Any)
    ScaleEntity(e,1,1.5,1)
    EntityLocate(e,xm,zm,ym)
    EntityPhysicBody(e, #PB_Entity_StaticBody) 
    EndIf
    EndIf
   Next x
  Next y
 Next z
 
 ;BuildStaticGeometry(0)
 
 FreeEntity(1)
 FreeEntity(2)
 FreeEntity(3)
 FreeEntity(4)
 FreeEntity(5)

EndProcedure



InitEngine3D() 
InitSprite()
InitKeyboard()
InitMouse()
EnableWorldPhysics(1)
UsePNGImageDecoder()

FullScreen = 1
CamMode = 0

If Not FullScreen
  OpenWindow(0,0,0,1280,960,"Kugel",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  OpenWindowedScreen(WindowID(0),0,0,1280,960,0,0,0)
 Else
  ExamineDesktops()
  OpenScreen(DesktopWidth(0),DesktopHeight(0),32,"")
EndIf

Add3DArchive("\", #PB_3DArchive_FileSystem) 
AntialiasingMode(#PB_AntialiasingMode_x6)
Parse3DScripts()


CreateTexture(1,128, 128)
StartDrawing(TextureOutput(1))
;Box(0, 0, 128, 128, $50FFF8)
BackColor($00FFFF)
FrontColor($FF0000)
CircularGradient(100, 100, 100)     
Circle(100, 100, 100)
CircularGradient(350, 100, 75)
Circle(300, 100, 100)
StopDrawing()

LoadTexture(0,"block0.png")
CreateMaterial(0,TextureID(0))
CreateMaterial(1,TextureID(1))

CreatePlane(0, 150, 150, 50, 50, 50, 50)
CreateEntity(0,MeshID(0), MaterialID(0), 0, 0, 0)
ScaleEntity(0,5,5,5)
EntityPhysicBody(0, #PB_Entity_StaticBody)   

CreateSphere(1, 3)
sphere = CreateEntity(#PB_Any,MeshID(1), MaterialID(1), -10, 4, 0)
ResizeEntity(sphere,0.5,0.5,0.5)
;WorldGravity(0)
EntityPhysicBody(sphere, #PB_Entity_SphereBody,1,1,1)   

CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 0, 80,-40)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))

CreateLight(0,$FFFFFF,0,80,0,#PB_Light_Spot)
SpotLightRange(0,0, 90, 0) 
;AmbientColor($FFFFFF)

CreateLine3D(2, 0, 0, 0, $45AE06, 0, 30, 0, $45AE06)

LoadBuilding("maze.txt")
CreateCubes()


 
Repeat 
  
 If Not Fullscreen
 Select WaitWindowEvent(1) 
 Case #PB_Event_CloseWindow 
 Quit = #True 
 EndSelect 
 EndIf
 

ExamineKeyboard()
     
If KeyboardPushed(#PB_Key_Left) 
  keyx = 1 
 ElseIf KeyboardPushed(#PB_Key_Right) 
  keyx = -1 
Else 
 keyx = 0
EndIf

If KeyboardPushed(#PB_Key_Up) 
  keyy = 1  
ElseIf KeyboardPushed(#PB_Key_Down)
  keyy = -1 
Else
 keyy = 0
EndIf


ExamineMouse()
     
mousex = -MouseDeltaX()
mousey = -MouseDeltaY()

sx = keyx * 1.25 : sz = keyy * 1.25
ApplyEntityImpulse(sphere, sx, 0, sz)

CameraLocate (0, EntityX(sphere), CameraY(0),EntityZ(sphere)-45)  
;CameraLocate (0, 0,100,0)  
CameraLookAt(0,EntityX(sphere),EntityY(sphere),EntityZ(sphere))
;MoveCamera  (0, keyx*2, 0, keyy*2) 
;RotateCamera(0, mousey, mousex, 0, #PB_Relative) 


RenderWorld() 
FlipBuffers()
 
Until KeyboardPushed(#PB_Key_Escape) Or Quit = #True

DataSection
 i0:
 IncludeBinary "block0.png"
 i1:
 IncludeBinary "block1.png"
 i2:
 IncludeBinary "block2.png"
 i3:
 IncludeBinary "block3.png"
 i4:
 IncludeBinary "block4.png"
 i5:
 IncludeBinary "block5.png"
EndDataSection


Re: Vorhandene Entity bewegung bekommen

Verfasst: 12.02.2012 10:03
von DarkDragon
Um an die vorhandene Entitybewegung zu kommen kannst du ja EntityXYZ(#Entity) - alter Wert (letzter Frame) von EntityXYZ(#Entity) berechnen.

Re: Vorhandene Entity bewegung bekommen

Verfasst: 18.02.2012 22:18
von The_Dark_Zim-.-
Okey mal sehen ob mich das weiterbringt danke euch schonmal ;)