Vorhandene Entity bewegung bekommen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Vorhandene Entity bewegung bekommen

Beitrag 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 :(
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: Vorhandene Entity bewegung bekommen

Beitrag 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

Repeat
PureBasic
ForEver
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Vorhandene Entity bewegung bekommen

Beitrag von DarkDragon »

Um an die vorhandene Entitybewegung zu kommen kannst du ja EntityXYZ(#Entity) - alter Wert (letzter Frame) von EntityXYZ(#Entity) berechnen.
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
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Vorhandene Entity bewegung bekommen

Beitrag von The_Dark_Zim-.- »

Okey mal sehen ob mich das weiterbringt danke euch schonmal ;)
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten