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

【作品介绍】
本作品有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