用户:战狼3查看:2 回复:2 评论:2 创建时间:2021-07-07T23:39:01
【作品展示】

【作品介绍】
我准备以这一个页面作为引导页面,让用户可以点击房子来选择自己要去的地方,有知识科普,趣味问答等(还未做好),这一个作品主要实现了把鼠标移动到房子上的反馈,因为今天刚刚看到比赛,所以暂时只做了一点点,素材在帖子下面哈
【作品源代码】
# 导入库
import direct.directbase.DirectStart
from panda3d.core import *
# 导入任务功能模块
from direct.task import Task
# 导入动画功能模块
from direct.actor.Actor import Actor
##初始化
# 创建窗体
window = WindowProperties()
window.setTitle('奇异之旅')
window.setSize(1200, 800)
base.win.requestProperties(window)
base.setBackgroundColor(100/255, 250/255, 180/255)
# 调整相机位置及其角度
cam_x, cam_y, cam_z = 450, -5850, 2000
cam_h, cam_r = 0, 0
base.cam.setPos(cam_x, cam_y, cam_z)
base.cam.setHpr(cam_h, -16, cam_r)
# 禁用鼠标
base.disableMouse()
# 定义加载模型函数
def load_model(path, pos, hpr):
model = loader.loadModel(path)
model.reparentTo(render)
model.setPos(pos[0], pos[1], pos[2])
model.setHpr(hpr[0], hpr[1], hpr[2])
return model
# 定义坐标转换函数
pickerRay = CollisionRay()
def model_position(model):
if base.mouseWatcherNode.hasMouse():
mpos = base.mouseWatcherNode.getMouse()
pickerRay.setFromLens(base.camNode, mpos)
nearPoint = render.getRelativePoint(base.cam, pickerRay.getOrigin())
nearVec = render.getRelativeVector(base.cam, pickerRay.getDirection())
model.setPos(nearPoint + nearVec *
((110 - nearPoint.getZ()) / nearVec.getZ()))
## 加载场景
scene = load_model("scene", (0, 0, 0), (0, 0, 0))
house = load_model('house', (-650, 1300, 0), (45, 0, 0))
house.setScale(1.1)
# 一号房子
house1 = load_model('house', (800, -1550, 30), (115, 0, 0))
house1.setScale(0.6)
# 二号房子
house2 = load_model('house', (2000, -650, 80), (0, 0, 0))
house2.setScale(0.6)
# 加载太阳能汽车
# car:模型文件名,run:动画名称,car_run:模型文件名称
car = Actor('car', {'run': 'car_run'})
car.reparentTo(render)
car.setPos(340, -2300, 0)
car.setHpr(90, 0, 0)
# 鼠标
mouse = loader.loadModel('hammer')
mouse.reparentTo(render)
mouse.setScale(0.1)
## 碰撞的创建于设置
# 创建一号房子的碰撞体
sphere = CollisionSphere(0, 0, 500, 800)
sphere_node = CollisionNode('house1')
sphere_node.addSolid(sphere)
house_collision = house1.attachNewNode(sphere_node)
# house_collision.show()
# 创建二号房子的碰撞体
sphere = CollisionSphere(0, 0, 1400, 1500)
sphere_node = CollisionNode('house2')
sphere_node.addSolid(sphere)
house_collision = house2.attachNewNode(sphere_node)
# house_collision.show()
# 创建鼠标的碰撞体
sphere = CollisionSphere(0, 0, 0, 450)
sphere_node = CollisionNode('mouse')
sphere_node.addSolid(sphere)
mouse_collision = mouse.attachNewNode(sphere_node)
# mouse_collision.show()
# 添加列表碰撞处理方法
base.cTrav = CollisionTraverser()
queue_handler = CollisionHandlerQueue()
base.cTrav.addCollider(mouse_collision, queue_handler)
##定义任务函数
def whole(task):
keep_going=False
# 绑定鼠标
model_position(mouse)
# 实现触碰放大效果
if queue_handler.getNumEntries()>0:
queue_handler.sortEntries()
if queue_handler.getEntry(0).getIntoNode().getName()\
=='house1':
keep_going=True
house1.setScale(0.7)
if queue_handler.getEntry(0).getIntoNode().getName()\
=='house2':
keep_going=True
house2.setScale(0.7)
if not keep_going:
house1.setScale(0.6)
house2.setScale(0.6)
return task.cont
taskMgr.add(whole)
# 鼠标按下
def knock(state):
if state:
if queue_handler.getNumEntries() > 0:
queue_handler.sortEntries()
if queue_handler.getEntry(0).getIntoNode().getName()\
== 'house1':
print(1)
if queue_handler.getNumEntries() > 0:
queue_handler.sortEntries()
if queue_handler.getEntry(0).getIntoNode().getName()\
== 'house2':
print(2)
base.accept('mouse1',knock,[True])
base.run()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn为什么我打开报错
报错位置:下图”==‘house1’“
if queue_handler.getEntry(0).getIntoNode().getName()\
=='house1':点赞0
评论