目录
#射击球
#库文件
import viz
import vizact
import vizmat
import vizcam
import viztask
import vizshape
import vizproximity
viz.setMultiSample(4)
viz.fov(60)
viz.go()
BALL_INIT_SPEED = 20.0 #速度
viz.phys.enable()#启动物理引擎函数
grid = vizshape.addGrid()#网格
grid.color(viz.RED)
world_axes = vizshape.addAxes()#坐标轴
room=viz.addChild('court.ive')
#room=viz.addChild('maze.osgb')
room.collideMesh()
#视角
cam = vizcam.FlyNavigate()#Uses the mouse fororientation and keyboard for position.#然而这样视角和人物不相关了
#viz.MainView.move(-1,0,-2)
#viz.clearcolor(1,0,0)
sphere=viz.addChild('white_ball.wrl')
#定靶
bazi=viz.addChild('white_ball.wrl')
#bazi.setPosition(0,3,9)
bazi.setScale(3,3,3)
ba_gan=viz.addChild('cylinder.wrl',parent=bazi)
ba_gan.setPosition(0,-1,0)
ba_gan.setScale(2,2,2)
#ba_gan.collideCapsule()#打开杆的包围盒
#动靶
bazi2=viz.addChild('white_ball.wrl')
bazi2.setPosition(0,2,5)
bazi2.setScale(2,2,2)
ba_gan2=viz.addChild('box.wrl',parent=bazi2)
ba_gan2.setPosition(0,-0.5,0)
ba_gan2.setAxisAngle(1,0,0,90)
ba_gan2.setScale(0.2,0.2,1)
ba_gan2.alpha(0.8)#数字越小越透明
ba_gan2.collideBox( [0.5,0.1,2] )#此处包围盒与物体位置有偏差
#赋予并赋予抽象动作
moveForward = vizact.move([-4,0,0],1)#中括号可以不加
turnRight = vizact.spin(0,1,0,180,1)
moveInSquare = vizact.sequence(moveForward,turnRight,400)#复合动作的定义函数,即“vizact.sequence()”,第三个参数表示重复次数
#动靶开启运动
bazi2.addAction(moveInSquare)
#人物
avatars = viz.addAvatar('vcc_male.cfg')
avatars.state(0)#状态2是走路,状态4是鼓掌,状态3好像是加油鼓劲#最高状态15#子物体不跟随人物动作运动#idlepace()也可
#avatars.collideCapsule()#人物包围盒
#枪
pole = viz.addChild('cylinder.wrl',parent=avatars)
pole.setPosition(-0.3,1.5,0)
pole.setAxisAngle(1,0,0,90)
#视角
head=avatars.getBone('Bip01 Head')
#view_link = viz.link( head,viz.MainView )#打开人物视角
#viz.eyeheight( 0 )#视角y值定为0
#音频(射击声)
video_shoot = viz.addVideo('getting started/Shoot.wav')
video_explode=viz.addVideo('getting started/DestroyedExplosion.wav')
#文本,计数
shoot_number=viz.addText( '0', parent=viz.ORTHO, fontSize=40, pos=(10,10,0) )
#函数,射击
def ballShooterTask():
while 1:
#wait for ball to collide or spacebar pressed
yield viztask.waitKeyDown(' ')#按下空格键往下执行
video_shoot.play()#射击配音
direction = sphere.getMatrix(viz.ABS_GLOBAL).getForward()
viztask.schedule(shootBallTask(direction,shoot_number)) #shoot ball
#函数,子弹生成、计数
count=0#击中次数
def shootBallTask(direction,shoot_number):
global count
avatars.state(2)
#create ball
ball = viz.addChild('white_ball.wrl')#待发射的小球
ball.setScale(2, 2, 2)
ball.setPosition(pole.getPosition(viz.ABS_GLOBAL))#小球发射点#viz.ABS_GLOBAL使得发射点坐标是局部坐标,就是当前获取到的物体的位置
ball.collideSphere()#球形包围盒
#compute velocity vector
velVector = vizmat.Vector(direction)
velVector.normalize()
velVector = velVector*BALL_INIT_SPEED
ball.setVelocity(velVector)
#fire event when ball collides
ball.enable(viz.COLLIDE_NOTIFY)
hasCollided = False
colors = viz.cycle([viz.RED,viz.GREEN,viz.SKYBLUE,viz.YELLOW,viz.ORANGE,viz.PURPLE])
vizact.ontimer(0,avatars.state,0)
while True:
#wait for collision event
collideEventInfo = viz.Data()
collideEventInfo = yield viztask.waitEvent(viz.COLLIDE_BEGIN_EVENT)
eventData = collideEventInfo.data[0]#只判断第一次碰撞
if (eventData.obj1 == ball and eventData.obj2 == ba_gan) or (eventData.obj1 == ball and eventData.obj2 == ba_gan2):
#avatars.execute(3)
ball.color(colors.next())
video_explode.play()
vizact.ontimer(0,avatars.state,0)
count+=1
#文本,显示击中次数
shoot_number.message( str(count) )
changeColorSignal.send()
#viz.collision(viz.ON)
viztask.schedule(ballShooterTask())#表示将函数作为一个抽象的动作对象运行起来
#sensor = viz.addSensor( 'testtrack_all.dls' )
#sphere_link=viz.link(sensor,sphere)
#添加按键控制
vizact.whilekeydown(viz.KEY_UP,avatars.setPosition,
[0,0,vizact.elapsed(1)],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_DOWN,avatars.setPosition,
[0,0,vizact.elapsed(-1)],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_RIGHT,avatars.setPosition,
[vizact.elapsed(1),0,0],viz.REL_PARENT)
vizact.whilekeydown(viz.KEY_LEFT,avatars.setPosition,
[vizact.elapsed(-1),0,0],viz.REL_PARENT)
vizact.whilekeydown('w',avatars.setPosition,[0,0,vizact.elapsed(1)],viz.REL_PARENT)
vizact.whilekeydown('a',avatars.setPosition,[vizact.elapsed(-1),0,0],viz.REL_PARENT)
vizact.whilekeydown('s',avatars.setPosition,[0,0,vizact.elapsed(-1)],viz.REL_PARENT)
vizact.whilekeydown('d',avatars.setPosition,[vizact.elapsed(1),0,0],viz.REL_PARENT)
vizact.onkeydown('w',avatars.execute,2)#按下wasd键时人物表现为行走,数字2代表状态2‘行走’
vizact.onkeydown('a',avatars.execute,2)
vizact.onkeydown('s',avatars.execute,2)
vizact.onkeydown('d',avatars.execute,2)