猫史档案馆


【Python作品分享】【奇异之旅】

用户:战狼3战狼3查看:2 回复:2 评论:2 创建时间:2021-07-07T23:39:01


【作品展示】

center_image

 

【作品介绍】

我准备以这一个页面作为引导页面,让用户可以点击房子来选择自己要去的地方,有知识科普,趣味问答等(还未做好),这一个作品主要实现了把鼠标移动到房子上的反馈,因为今天刚刚看到比赛,所以暂时只做了一点点,素材在帖子下面哈

 

【作品源代码】

# 导入库
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


回复

上一页1 页 / 共 1下一页
FHR丨萌新滑稽FHR丨萌新滑稽

可以哦!emotion_编程猫_加油

点赞0


评论


稳重的月见草zdrr稳重的月见草zdrr

为什么我打开报错

报错位置:下图”==‘house1’“

if queue_handler.getEntry(0).getIntoNode().getName()\
                                                        =='house1':

点赞0


评论