Vizard学习2021.11.11

其他

消消乐1.0_江边鸟----仕之

vizard期末制作

目录

#射击球

#视角

#定靶

#动靶

#赋予并赋予抽象动作

#人物

#枪

#视角

#音频(射击声)

#文本,计数

#函数,射击

#函数,子弹生成、计数

#添加按键控制


#射击球

#库文件
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)

更新2021.11.13

猜你喜欢

转载自blog.csdn.net/weixin_58465955/article/details/121266565