猫史档案馆


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

用户:战狼3战狼3查看:5 回复:1 评论:5 创建时间:2021-07-10T14:46:13


【作品展示】

center_image

 

【作品介绍】

本作品有panda3d和pygame库组合而成,进入游戏,可以看到是pand3d的界面,在路边有两间房子,把鼠标放到上面会有反馈(微微放大),点击小车最近的房子即可开始一个名为翱翔精灵的游戏,这个游戏通过鼠标来控制小鸟的飞行,这一次增加了积分的功能,但是还有很多功能未完善,比如第二间房子还没链接游戏,但这个作品真的花了我很多心思哦。之前素材上传不了,这次直接在代码中注释(开头),应该不会被屏蔽了吧

 

【作品源代码】

# 素材链接,用百度网盘下载
# 链接: 链接: https://pan.喵/s/1TyGEjDbq8xElDbfGNFyQzw  
# 密码: p8qq
# 注意:下载素材后点击文件夹里面的“奇异之旅.py”文件,这个是文件的代码,其它的不用管
# 注意:下载素材后点击文件夹里面的“奇异之旅.py”文件,这个是文件的代码,其它的不用管
# 注意:下载素材后点击文件夹里面的“奇异之旅.py”文件,这个是文件的代码,其它的不用管

# 导入库
import direct.directbase.DirectStart
from panda3d.core import *
# 导入任务功能模块
from direct.task import Task
# 导入动画功能模块
from direct.actor.Actor import Actor
import random
import pygame

##初始化
# 创建窗体
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()))


# 初始化数据
time = 0
is_keep = {'house1': False, 'house2': False}
car_state = {'forward': False, 'turn_left': False, }
# 设置游戏场景的宽,高,标题
SCREEN_WIDTH = 258
SCREEN_HEIGHT = 512
SCREEN_TITLE = '快乐飞翔'

## 加载场景
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 start_game():
    # 初始化,设置标题,窗口等
    pygame.init()
    screen = pygame.display.set_mode((288, 512))  # 窗口
    background = pygame.image.load('bg_day.png')  # 背景图
    pygame.display.set_caption('翱翔吧,源码精灵1')  # 标题
    keep_going = True
    clock = pygame.time.Clock()
    # 设置变量
    cnt = 0
    # 设置字体
    font = pygame.font.SysFont('SimHei', 24)

    class Wall():
        def __init__(self):
            self.wallDown = pygame.image.load('pipe_up.png')
            self.wallUp = pygame.image.load('pipe_down.png')
            self.wallx = 288

            self.gap = 100
            self.offset = random.randint(-50, 50)
            self.wallUpRect = self.wallUp.get_rect()
            self.wallDownRect = self.wallDown.get_rect()

            self.wallUpRect.center = (self.wallx, 0-self.gap-self.offset)
            self.wallDownRect.center = (self.wallx, 520-self.gap-self.offset)

        def wallUpdate(self):
            self.wallx -= 2
            if self.wallx < -80:
                self.wallx = 280
                self.offset = random.randint(-50, 50)

            self.wallUpRect.center = (self.wallx, 0-self.gap-self.offset)
            self.wallDownRect.center = (self.wallx, 520-self.gap-self.offset)


    class Bird():
        def __init__(self):
            self.birdSprites = [pygame.image.load('0.png'), pygame.image.load(
                '1.png'), pygame.image.load('2.png')]
            self.a = 0
            self.birdX = 50
            self.birdY = 100
            self.jumpSpeed = 7
            self.gravity = 0.4

            self.rect = self.birdSprites[self.a].get_rect()
            self.rect.center = (self.birdX, self.birdY)

        def birdUpdate(self):
            self.jumpSpeed -= self.gravity
            self.birdY -= self.jumpSpeed
            self.rect.center = (self.birdX, self.birdY)
            if self.jumpSpeed < 0:
                self.a = 1
            if self.jumpSpeed > 0:
                self.a = 2

        def birdCush(self):
            resultU = self.rect.colliderect(newWall.wallUpRect)
            resultD = self.rect.colliderect(newWall. wallDownRect)
            if resultU or resultD or newBird.rect.top > 512:
                return True

    newWall = Wall()
    newBird = Bird()
    
    over = pygame.image.load('game over.png')

    # pygame循环
    while keep_going:
        for event in pygame.event.get():  # 判断是否按下关闭键
            if event.type == pygame.QUIT:
                keep_going = False
            if(event.type == pygame.MOUSEBUTTONDOWN):  # 判断是否按下鼠标
                newBird.jumpSpeed = 7
        if newWall.wallx == 40:
            cnt = cnt+1

        screen.blit(background, (0, 0))
        screen.blit(newBird.birdSprites[newBird.a], (newBird.rect))
        screen.blit(newWall.wallUp, newWall.wallUpRect)
        screen.blit(newWall.wallDown, newWall.wallDownRect)
        text = font.render('Score:'+str(cnt), True, (255, 210, 0), (155, 0, 0))
        screen.blit(text, (210, 10))

        newBird.birdUpdate()  # 刷新界面
        newWall.wallUpdate()  # 刷新界面

        if newBird.birdCush():
            keep_going = False

        pygame.display.update()
        clock.tick(60)


    # 退出游戏
    pygame.quit()


def knock(state):
    if state:
        if queue_handler.getNumEntries() > 0:
            queue_handler.sortEntries()
            if queue_handler.getEntry(0).getIntoNode().getName()\
                    == 'house1':
                messenger.send('start_game')

        if queue_handler.getNumEntries() > 0:
            queue_handler.sortEntries()
            if queue_handler.getEntry(0).getIntoNode().getName()\
                    == 'house2':
                print('house2')


base.accept('mouse1', knock, [True])
base.accept('start_game',start_game)

base.run()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
战狼3战狼3

网址还是被屏蔽了呀

点赞0


评论