Code: Select all
;
;
;
; ------------------------------------------------------------
;
; PureBasic - RagDoll
;
; (c) 2002 - Fantaisie Software , bobobo
; OpenGL scheitert bei mir, das mag am Treiber liegen (Laptop)
; das Programm sollte im Verzeichnis \Examples\3D liegen
; weil es auf den Screenrequester und andere Daten dort zugreift
; alles ohne Gewähr
; ------------------------------------------------------------
; ApplyEntityImpulse without ÜPostion (causes the 3dEngine to stop v5.70)
#CameraSpeed = 0.5
IncludeFile "Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY ,rott, moveit
If InitEngine3D()
Add3DArchive(#PB_Compiler_Home + "/Examples/3D/" +"Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "/Examples/3D/" +"Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)
WorldShadows(#PB_Shadow_Additive )
SkyBox("desert07.jpg")
camera=CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(camera,0, 260 ,15, #PB_Absolute)
texture1t=CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texture1t))
Box(0, 0, 256, 256, RGBA(222,222,255, 200))
For l=0 To 128
Circle(Random(256),Random(256),Random(4)+1,RGBA(0,0,255,255))
Next l
StopDrawing()
texture1=CreateMaterial(#PB_Any, TextureID(texture1t))
ScaleMaterial(texture1,100,100)
texture2= CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texture2))
DrawingMode(#PB_2DDrawing_AllChannels )
Box(0,0,256,256,RGBA(80,80,80,18))
For l=0 To 400
Circle(Random(256),Random(256),Random(3)+1,RGBA(Random(5)+100,Random(5)+100,Random(5)+100,180))
Next l
DrawText(0,0,"ragdoll ®",RGBA(255,0,0,255),RGBA(80,80,80,222))
StopDrawing()
texture2=CreateMaterial(#PB_Any, TextureID(texture2))
Structure components
ball.i
limb.i
texture.i
Bodymesh.i
Body.i
HeadMesh.i
Head.i
arml.i
armlu.i
armr.i
armru.i
legl.i
leglu.i
legr.i
legru.i
ct_bodyhead.i
ct_arml.i
hinge_arml.i
ct_armr.i
hinge_armr.i
hinge_legl.i
hinge_leglu.i
hinge_legr.i
hinge_legru.i
posx.i
posy.i
posz.i
EndStructure
Define ragdoll.components
NewList ragdolls.components()
For r=1 To 3 ;3 Dinger
AddElement(ragdolls())
ragdolls()\posx=r*2-2
ragdolls()\posy=260
ragdolls()\posz=0
ragdolls()\texture=texture2;CreateMaterial(#PB_Any, TextureID(texture2))
;bodyparts
ragdolls()\Bodymesh=CreateCube(#PB_Any,1)
ragdolls()\Body=CreateEntity(#PB_Any,MeshID(ragdolls()\Bodymesh),MaterialID(ragdolls()\texture),ragdolls()\posx,ragdolls()\posy,ragdolls()\posz)
ScaleEntity(ragdolls()\Body,1.0,1,0.25)
ragdolls()\HeadMesh = CreateSphere(#PB_Any,0.5)
ragdolls()\limb = CreateCylinder(#PB_Any,0.1,0.80)
ragdolls()\Head = CreateEntity(#PB_Any,MeshID(ragdolls()\HeadMesh),MaterialID(ragdolls()\texture), ragdolls()\posx,ragdolls()\posy+1,ragdolls()\posz)
ragdolls()\arml = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.6,ragdolls()\posy,ragdolls()\posz)
ragdolls()\armlu = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.6,ragdolls()\posy-1,ragdolls()\posz)
ragdolls()\armr = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture) ,ragdolls()\posx+0.6,ragdolls()\posy,ragdolls()\posz)
ragdolls()\armru = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture) ,ragdolls()\posx+ 0.6,ragdolls()\posy-1,ragdolls()\posz)
ragdolls()\legl = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.3,ragdolls()\posy-1,ragdolls()\posz)
ragdolls()\legr = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture) ,ragdolls()\posx+ 0.3,ragdolls()\posy-1,ragdolls()\posz)
ragdolls()\leglu = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture),ragdolls()\posx-0.3,ragdolls()\posy-2,ragdolls()\posz)
ragdolls()\legru = CreateEntity(#PB_Any,MeshID(ragdolls()\limb),MaterialID(ragdolls()\texture),ragdolls()\posx+ 0.3,ragdolls()\posy-2,ragdolls()\posz)
;bodyPhysics
CreateEntityBody(ragdolls()\Body,#PB_Entity_BoxBody ,10, 0,1)
EntityRenderMode(ragdolls()\Body, #PB_Entity_CastShadow)
EntityRenderMode(ragdolls()\Head, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\Head, #PB_Entity_SphereBody, 5, 0.25, 1)
EntityRenderMode(ragdolls()\arml, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\arml, #PB_Entity_CylinderBody, 1, 0 ,1)
EntityRenderMode(ragdolls()\armlu, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\armlu, #PB_Entity_CylinderBody, 1, 0, 1)
EntityRenderMode(ragdolls()\armr, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\armr, #PB_Entity_CylinderBody, 1, 0, 1)
EntityRenderMode(ragdolls()\armru, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\armru, #PB_Entity_CylinderBody, 1, 0,1)
EntityRenderMode(ragdolls()\legl, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\legl, #PB_Entity_CylinderBody, 1, 0,1)
EntityRenderMode(ragdolls()\leglu, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\leglu, #PB_Entity_CylinderBody,1, 0,1)
EntityRenderMode(ragdolls()\legr, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\legr, #PB_Entity_CylinderBody, 1, 0,1)
EntityRenderMode(ragdolls()\legru, #PB_Entity_CastShadow)
CreateEntityBody(ragdolls()\legru, #PB_Entity_CylinderBody,1, 0,1)
;joints
ragdolls()\ct_bodyhead=ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body) , 0, 0.7,0,EntityID(ragdolls()\Head) ,0,-0.4,0)
ragdolls()\ct_arml = ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body),-0.6, 0.5 ,0,EntityID(ragdolls()\arml) , 0, 0.4,0)
ragdolls()\hinge_arml = HingeJoint(#PB_Any,EntityID(ragdolls()\arml) , 0, -0.45,0,1,0,0,EntityID(ragdolls()\armlu), 0,0.45,0,1,0,0)
ragdolls()\ct_armr = ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body), 0.6, 0.5,0,EntityID(ragdolls()\armr), 0, 0.4,0)
ragdolls()\hinge_armr = HingeJoint(#PB_Any,EntityID(ragdolls()\armr) , 0 ,-0.45,0,1,0,0,EntityID(ragdolls()\armru), 0,0.45,0,1,0,0)
ragdolls()\hinge_legl = HingeJoint(#PB_Any,EntityID(ragdolls()\Body) ,-0.3,-0.60,0,1,0,0,EntityID(ragdolls()\legl) , 0,0.40,0,1,0,0)
ragdolls()\hinge_legr = HingeJoint(#PB_Any,EntityID(ragdolls()\Body) , 0.3,-0.60,0,1,0,0,EntityID(ragdolls()\legr) , 0,0.40,0,1,0,0)
ragdolls()\hinge_leglu = HingeJoint(#PB_Any,EntityID(ragdolls()\legl) , 0,-0.45,0,1,0,0,EntityID(ragdolls()\leglu), 0,0.45,0,1,0,0)
ragdolls()\hinge_legru = HingeJoint(#PB_Any,EntityID(ragdolls()\legr) , 0,-0.45,0,1,0,0,EntityID(ragdolls()\legru), 0,0.45,0,1,0,0)
;joints attributes
SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_SwingSpan,0.25)
SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_SwingSpan2,0)
SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_TwistSpan,0.25)
; ;
SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_SwingSpan ,0.2);seitl
SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_SwingSpan2,1);dreh
SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_TwistSpan ,2);vorzurück
; ;
SetJointAttribute(ragdolls()\hinge_arml,#PB_HingeJoint_LowerLimit,0)
SetJointAttribute(ragdolls()\hinge_arml,#PB_HingeJoint_UpperLimit,120)
SetJointAttribute(ragdolls()\hinge_armr,#PB_HingeJoint_LowerLimit,0)
SetJointAttribute(ragdolls()\hinge_armr,#PB_HingeJoint_UpperLimit,120)
SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_SwingSpan,0.2);seitlich
SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_SwingSpan2,1);dreh
SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_TwistSpan,2);vorzurück
SetJointAttribute(ragdolls()\hinge_legl,#PB_HingeJoint_LowerLimit,-1)
SetJointAttribute(ragdolls()\hinge_legl,#PB_HingeJoint_UpperLimit,120)
SetJointAttribute(ragdolls()\hinge_legr,#PB_HingeJoint_LowerLimit,-1)
SetJointAttribute(ragdolls()\hinge_legr,#PB_HingeJoint_UpperLimit,120)
SetJointAttribute(ragdolls()\hinge_leglu,#PB_HingeJoint_LowerLimit,-120)
SetJointAttribute(ragdolls()\hinge_leglu,#PB_HingeJoint_UpperLimit,1)
SetJointAttribute(ragdolls()\hinge_legru,#PB_HingeJoint_LowerLimit,-120)
SetJointAttribute(ragdolls()\hinge_legru,#PB_HingeJoint_UpperLimit,1)
Next
;
plate=CreateCube(#PB_Any,1)
ScaleMaterial(texture1,0.5,0.5)
;Kartons (50kg)
; NewList plates()
; For xp=0 To 10
; For yp=0 To 10
; AddElement(plates())
; plates()=CreateEntity(#PB_Any,MeshID(plate),MaterialID(texture1),35+0.25*Random(100)-50,290,35+0.25*Random(100)-50)
; ScaleEntity(plates(),1,0.5+Random(1)/4,1)
; EntityRenderMode(plates(), #PB_Entity_CastShadow)
; EntityPhysicBody(plates(),#PB_Entity_BoxBody,50,0.3,0.5)
; Next yp
; Next xp
platte=CreateEntity(#PB_Any,MeshID(plate),MaterialID(texture1),0,0,0)
ScaleEntity(platte,50,0.01,50)
MoveEntity(platte,0,256,0)
EntityRenderMode(platte, #PB_Entity_CastShadow)
CreateEntityBody(platte,#PB_Entity_StaticBody,1000,1,0.5)
sun=CreateLight(#PB_Any,RGB(238, 173, 148),17830,12860,10930,#PB_Light_Point)
CameraLookAt(camera,EntityX(ragdolls()\Head),EntityY(ragdolls()\Head),EntityZ(ragdolls()\Head))
dance=1
hands=1
Repeat
Screen3DEvents()
If ExamineMouse()
MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
EndIf
If hands=1
hands=2
Debug hands
;Händchenhalten
sp=-0.5
tau.f=0
damp.f=0.5
SelectElement(ragdolls(),0)
jx=EntityX(ragdolls()\armru)
jy=EntityY(ragdolls()\armru)
jz=EntityZ(ragdolls()\armru)
id=EntityID(ragdolls()\armru)
SelectElement(ragdolls(),1)
jx1=EntityX(ragdolls()\armlu)
jy1=EntityY(ragdolls()\armlu)
jz1=EntityZ(ragdolls()\armlu)
id1=EntityID(ragdolls()\armlu)
knupf1=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
SetJointAttribute(knupf1,#PB_PointJoint_Damping,damp)
SetJointAttribute(knupf1,#PB_PointJoint_Tau,tau)
jx=EntityX(ragdolls()\armru)
jy=EntityY(ragdolls()\armru)
jz=EntityZ(ragdolls()\armru)
id=EntityID(ragdolls()\armru)
SelectElement(ragdolls(),2)
jx1=EntityX(ragdolls()\armlu)
jy1=EntityY(ragdolls()\armlu)
jz1=EntityZ(ragdolls()\armlu)
id1=EntityID(ragdolls()\armlu)
knupf2=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
SetJointAttribute(knupf2,#PB_PointJoint_Damping,damp)
SetJointAttribute(knupf2,#PB_PointJoint_Tau,tau)
EndIf
If hands=3
Debug hands
hands=0
If knupf1
FreeJoint(knupf1)
knupf1=0
EndIf
If knupf2
FreeJoint(knupf2)
knupf2=0
EndIf
If knupf3
FreeJoint(knupf3)
knupf3=0
EndIf
EndIf
If dance=1
ForEach ragdolls()
If EntityY(ragdolls()\Head)<259.5
ApplyEntityImpulse(ragdolls()\Head ,0, 9,0)
ApplyEntityImpulse(ragdolls()\legru ,0, -5,0)
ApplyEntityImpulse(ragdolls()\leglu ,0, -5,0)
If EntityY(ragdolls()\leglu)<256.8
ApplyEntityImpulse(ragdolls()\leglu,Random(2)-1,Random(8),Random(2)-1)
EndIf
If EntityY(ragdolls()\legru)<256.8
ApplyEntityImpulse(ragdolls()\legru,Random(2)-1,Random(8),Random(2)-1)
EndIf
ApplyEntityImpulse(ragdolls()\armlu,Random(2)-1,Random(2)-1,Random(2)-1)
ApplyEntityImpulse(ragdolls()\armru,Random(2)-1,Random(2)-1,Random(2)-1)
EndIf
Next
EndIf
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_P) Or KeyboardReleased(#PB_Key_R)
px.f=0
py.f=0
pz.f=0
ForEach ragdolls()
px+EntityX(ragdolls()\Body)
py+EntityY(ragdolls()\Body)
pz+EntityZ(ragdolls()\Body)
Next
px=px/ListSize(ragdolls())
py=py/ListSize(ragdolls())
pz=pz/ListSize(ragdolls())
CameraLookAt(camera,px,py,pz)
EndIf
If KeyboardPushed(#PB_Key_S) And shoot=0
ForEach ragdolls()
ApplyEntityImpulse(ragdolls()\Body,0,0,-100,Random(8)-4,Random(8)-4,Random(8)-4)
shoot=1
Next
EndIf
If KeyboardReleased(#PB_Key_S)
shoot=0
EndIf
If KeyboardPushed(#PB_Key_R)
ForEach ragdolls()
MoveEntity(ragdolls()\Head,ragdolls()\posx,ragdolls()\posy,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\Body,ragdolls()\posx,ragdolls()\posy-1,ragdolls()\posz,#PB_Absolute)
RotateEntity(ragdolls()\Body,0,0,0,#PB_Absolute)
MoveEntity(ragdolls()\legr,ragdolls()\posx+0.3,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\legl,ragdolls()\posx-0.3,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\legru,ragdolls()\posx+0.3,ragdolls()\posy-2.9,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\leglu,ragdolls()\posx-0.3,ragdolls()\posy-2.9,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\armr,ragdolls()\posx+0.6,ragdolls()\posy-1,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\arml,ragdolls()\posx-0.6,ragdolls()\posy-1,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\armru,ragdolls()\posx+0.6,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
MoveEntity(ragdolls()\armlu,ragdolls()\posx-0.6,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
Next
EndIf
If KeyboardReleased(#PB_Key_V)
Select hands
Case 0
hands=1
Case 2
hands=3
EndSelect
EndIf
If KeyboardPushed(#PB_Key_T)
ForEach ragdolls()
ApplyEntityImpulse(ragdolls()\armlu ,0,-1,0,0,-1,0)
ApplyEntityImpulse(ragdolls()\armru ,0,-1,0,0,-1,0)
ApplyEntityImpulse(ragdolls()\leglu,0,-3,0,0,-1,0)
ApplyEntityImpulse(ragdolls()\legru,0,-3,0,0,-1,0)
ApplyEntityImpulse(ragdolls()\Head ,0, 10,0,0,1,0)
Next
EndIf
If KeyboardPushed(#PB_Key_J)
ForEach ragdolls()
ApplyEntityImpulse(ragdolls()\Body,0,10,0)
Next
EndIf
If KeyboardPushed(#PB_Key_U) And dance=0
dance=1
EndIf
If KeyboardPushed(#PB_Key_I)
dance=0
EndIf
If KeyboardPushed(#PB_Key_F)
ForEach ragdolls()
If EntityY(ragdolls()\Body)<259
ApplyEntityImpulse(ragdolls()\Body,0, 3,0,0,-10,0)
ApplyEntityImpulse(ragdolls()\armlu ,0, 3,0,0,-10,0)
ApplyEntityImpulse(ragdolls()\armru ,0, 3,0,0,-10,0)
ApplyEntityImpulse(ragdolls()\leglu ,0, 3,0,0,-10,0)
ApplyEntityImpulse(ragdolls()\legru ,0, 3,0,0,-10,0)
ApplyEntityImpulse(ragdolls()\Head ,0,6,0,0,0 ,0)
EndIf
Next
EndIf
If KeyboardPushed(#PB_Key_H)
ForEach ragdolls()
ApplyEntityImpulse(ragdolls()\armlu,0,1,0,0,-2,0)
ApplyEntityImpulse(ragdolls()\armru,0,1,0,0,-2,0)
ApplyEntityImpulse(ragdolls()\legl,0,-4,0,0,-20,0)
ApplyEntityImpulse(ragdolls()\legr,0,-4,0,0,-20,0)
ApplyEntityImpulse(ragdolls()\Head,0,5,0,0,0,0)
ApplyEntityImpulse(ragdolls()\Body,0,4,0,0,10,0)
Next
EndIf
If KeyboardPushed(#PB_Key_Add)
wg+1
WorldGravity(wg)
EndIf
If KeyboardPushed(#PB_Key_Subtract)
wg-1
WorldGravity(wg)
EndIf
If KeyboardPushed(#PB_Key_G)
;CameraLookAt(camera,EntityX(ragdolls()\Body),EntityY(ragdolls()\Body),EntityZ(ragdolls()\Body))
ForEach ragdolls()
ApplyEntityImpulse(ragdolls()\Head ,0, 2,0)
ApplyEntityImpulse(ragdolls()\legl , 0, Random(4),0,0,-6,0)
ApplyEntityImpulse(ragdolls()\legr , 0, Random(4),0,0,-6,0)
ApplyEntityImpulse(ragdolls()\armlu , 0, Random(1),0,0,6,0)
ApplyEntityImpulse(ragdolls()\armru , 0, Random(1),0,0,6,0)
ApplyEntityImpulse(ragdolls()\Body,0,-6,0,0,0,0)
Next
EndIf
; If KeyboardPushed(#PB_Key_N)
; ForEach plates()
; ApplyEntityImpulse(plates(),0,8.5,0)
; Next
; EndIf
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
EndIf
RotateCamera(camera, MouseY, MouseX, 0, #PB_Relative)
MoveCamera (camera, KeyX, 0, KeyY)
RenderWorld()
If IsSprite(out) ;freesprite if exists
FreeSprite(out)
EndIf
out=CreateSprite(#PB_Any,ScreenWidth(),20)
StartDrawing(SpriteOutput(out))
If hands
hao.s=" V:Hands Off,"
Else
hao.s=" V:Hands On,"
EndIf
If dance
ho.s=" I:IdiotDance OFF,"
;DrawText(0,0,"R:reset, "+ho+" P:LookatAll,")
Else
ho.s=" U:IdiotDance ON, "
EndIf
DrawText(0,0,"R:reset, T:upright, H:hail ,G:strange ,T: upright, F:forceup (near plate),"+ho+" J:Up,"+hao+"P:LookatAll")
StopDrawing()
DisplayTransparentSprite(out,0,0)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End