forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Способ движения игрока с гравитацией и прыжками (http://forum.boolean.name/showthread.php?t=16294)

Kudesnic 06.02.2012 16:45

Способ движения игрока с гравитацией и прыжками
 
Думаю этому примеру - место в этом разделе.
Надеюсь многим пригодится :)

Код:

Const usertype=2,typelevel=1,heghtjump=2;сила прыжка(влияет на высоту)

Global user,userhead,cam,floorpivot
Global modejump,mvx#,mvy#,mvz#,grav#=.1
Global campitch#
Global plane,cube,light

Graphics3D 800,600,32,2
plane=CreateCube()
EntityColor plane,200,150,100
ScaleEntity plane,100,1,100
PositionEntity plane,0,-10,0
EntityType plane,typelevel
cube=CreateCube()
ScaleEntity cube,10,10,5
PositionEntity cube,0,0,10
EntityType cube,typelevel
EntityColor cube,100,150,200
light=CreateLight(1)
RotateEntity light,45,50,0
createuser()
Collisions usertype,typelevel,2,2

While Not KeyDown(1)
upduser()
UpdateWorld
RenderWorld
Flip
Cls
Wend
End


;*************************FUNCTIONS*********************************
Function createuser()
user=CreateSphere()
EntityAlpha user,0
userhead=CreatePivot(user)
cam=CreateCamera(userhead)
floorpivot=CreatePivot(user)
EntityType user,usertype
EntityRadius user,2,1.5
EntityType floorpivot,usertype
EntityRadius floorpivot,1
EntityType userhead,usertype
EntityRadius userhead,1
End Function

Function uroven#(en)
If EntityCollided(en,typelevel)
If CollisionNX(en,typelevel)>CollisionNZ(en,typelevel) Return Abs(CollisionNX(en,typelevel)) Else Return Abs(CollisionNZ(en,typelevel))
EndIf
End Function

Function gravi()
jumpuser()
If modejump<>2
        mvy=Abs(mvy)
        If Not EntityCollided(floorpivot,typelevel)
                mvy=mvy+grav
        Else
                mvy=mvy/2
        EndIf
Else
mvy=-Abs(mvy)
EndIf
TranslateEntity user,0,-mvy,0
End Function

Function jumpuser()
If EntityCollided(floorpivot,typelevel)<>0 And Abs(uroven(floorpivot))<.5 And modejump<>2 And modejump<>4 Then  modejump=1
If KeyDown(57) And modejump=1 Then mvy=heghtjump:modejump=2
If KeyDown(57) And modejump=2 Then mvy=mvy/1+grav If Abs(mvy)<.05 Or EntityCollided(userhead,typelevel)<>0 Then mvy=grav:modejump=4
If modejump=2 And (Not KeyDown(57)) mvy=grav: modejump=0
If modejump=4 And (Not KeyDown(57)) modejump=0
End Function

Function upduser()
v#=.1
vm#=.5
mousespeed#=.20

mxspd#=MouseXSpeed()*mousespeed
myspd#=MouseYSpeed()*mousespeed
       
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

campitch=campitch+myspd
If campitch<-85 Then campitch=-85
If campitch>85 Then campitch=85
RotateEntity user,0,EntityYaw(user)-mxspd,0
RotateEntity userhead,campitch,0,0

If KeyDown(30) Then a=180:b=1
If KeyDown(32) Then a=0:b=1
If KeyDown(17) Then a=90:b=1
If KeyDown(31) Then a=270:b=1
If KeyDown(17) And KeyDown (30) Then a=135:b=1
If KeyDown(17) And KeyDown (32) Then a=45:b=1
If KeyDown(31) And KeyDown (30) Then a=225:b=1
If KeyDown(31) And KeyDown (32) Then a=315:b=1
If b=1
        mvx=mvx+Cos(a)*v:If Abs(mvx)>vm mvx=vm*Sgn(mvx)
        mvz=mvz+Sin(a)*v:If Abs(mvz)>vm mvz=vm*Sgn(mvz)
EndIf

mvx=mvx/1.25;1.2
mvz=mvz/1.25;1.2

PositionEntity user,EntityX(userhead,True),EntityY(user),EntityZ(userhead,True),True
MoveEntity user,mvx,0,mvz
gravi()
userhead()
End Function

Function userhead()
PositionEntity userhead,0,3,0
PositionEntity floorpivot,0,-1,0
End Function



Часовой пояс GMT +4, время: 01:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot