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
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