奔跑吧~小忍者

游戏运行后的效果

游戏初始运行状态

运行时候的状态

结束状态

初始化创建游戏界面

from loadImg import *
import random# 窗口大小
SCREENSIZE = [750, 500]
# 障碍物列表
barrierList = []# 游戏状态
# 运行标识
GAMERUNNING = 1
# 结束标识
GAMEOVER = 2
# 准备标识
GAMEREADY = 3# 获取图片宽度
bgWidth = bgImg.get_rect().width
gdWidth = groundImg.get_rect().width# 整理数据
bg = {'img': bgImg,'x': 0,'y': 0,'step': 2,'width': bgWidth}
gd = {'img': groundImg,'x': 0,'y': 330,'step': 4,'width': gdWidth}# 生成障碍物
def getBarrier():barrierImg = random.choice(barrierImgList)rect = barrierImg.get_rect()barrier = {'img': barrierImg,'x': SCREENSIZE[0],'y': 330 - rect.height,'width': rect.width,'height': rect.height,'step': 4,'ischeck': False,'score': 10}return barrier# 主角数据
player = {'img': runImgList[0],'x': 60,'y': 330 - runImgList[0].get_rect().height,'width': runImgList[0].get_rect().width,'height': runImgList[0].get_rect().height,'runImgList': runImgList,'imgIndex': 0,'animationFPS': 33,'state': 'running'}# 初始化金币数据
gold = {'img': goldImg,'x': 0,'y': 0,'width': goldImg.get_rect().width,'height': goldImg.get_rect().height,'step': 4}

创建出游戏所需要的图片及其角色

import pygame# 背景图片
bgImg = pygame.image.load('images/bg.png')
# 地面图片
groundImg = pygame.image.load('images/ground.png')
# 标题图片
iconImg = pygame.image.load('images/logo.jpg')
# 人物图片
playerImg = pygame.image.load('images/player_run_1.png')
# 障碍物图片列表
barrierImgList = []
# 向列表中追加障碍物图片
for i in range(1, 7):barrierImg = pygame.image.load('images/barrier' + str(i) + '.png')barrierImgList.append(barrierImg)
# 主角图片列表
runImgList = []
# 向列表中追加主角动画图片
for i in range(1, 15):playerImg = pygame.image.load('images/player_run_' + str(i) + '.png')runImgList.append(playerImg)
# 结束画面
overImg = pygame.image.load('images/gameover.png')
# 金币图片
goldImg = pygame.image.load('images/gold.png')
# 加载主角掉落时的图片
dropImg = pygame.image.load('images/player_drop.png')# 加载准备图片
readyImg = pygame.image.load('images/gameready.png')

主体代码

from initData import *
from easing import *
import sys
import hashlib as hashlib
pygame.init()# 障碍物列表
barrierList = []
# 自定义事件
ADDBARRIER = pygame.USEREVENT + 1
# 自定义事件(角色动画)
ANIMATION = pygame.USEREVENT + 2
# 自定义事件(角色跳跃)
JUMP = pygame.USEREVENT + 3
# 自定义事件(角色掉落)
DROP = pygame.USEREVENT + 4
# 主循环频率
FPS = 60
# 获取时钟对象
clock = pygame.time.Clock()
# 游戏初始状态
gameState = GAMEREADY
# 记录游戏分数
score = 0# 启动定时器
def startTimer():pygame.time.set_timer(ADDBARRIER, 1500)pygame.time.set_timer(ANIMATION, int(1000/player['animationFPS']))
# 停止定时器
def stopTimer():pygame.time.set_timer(ADDBARRIER, 0)pygame.time.set_timer(ANIMATION, 0)# 初始化窗口
def initScreen():global screen# 创建窗口对象screen = pygame.display.set_mode(SCREENSIZE)# 设置窗口标题pygame.display.set_caption('奔跑吧!忍者猿')# 设置标题logopygame.display.set_icon(iconImg)# 绘制
def draw():screen.blit(bg['img'], [bg['x'], bg['y']])screen.blit(bg['img'], [bg['x'] + bg['width'], bg['y']])screen.blit(gd['img'], [gd['x'], gd['y']])screen.blit(gd['img'], [gd['x'] + gd['width'], gd['y']])screen.blit(player['img'], [player['x'], player['y']])screen.blit(gold['img'], [gold['x'], gold['y']])for barrier in barrierList:screen.blit(barrier['img'], [barrier['x'], barrier['y']])#     游戏结束if gameState == GAMEOVER:rect = overImg.get_rect()rect.center = screen.get_rect().centerscreen.blit(overImg, rect)drawText(str(score), 'center', 30)#elif gameState == GAMERUNNING:drawText('score:' + str(score), (SCREENSIZE[0] - 100, 20))# 绘制准备界面 elif gameState == GAMEREADY:rect = readyImg.get_rect()rect.center = screen.get_rect().centerscreen.blit(readyImg, rect)# 绘制文本
def drawText(text, coordinate, size = 20, color = [255, 255, 255]):font = pygame.font.SysFont('SimHei', size)content = font.render(text, True, color)if coordinate == 'center':rect = content.get_rect()rect.center = screen.get_rect().centercoordinate = rectscreen.blit(content, coordinate)
# 移动
def move():global barrierList# 移动背景&地面bg['x'] -= bg['step']if bg['x'] <= -bg['width']:bg['x'] = 0gd['x'] -= gd['step']if gd['x'] <= -gd['width']:gd['x'] = 0# 移动障碍物new_barrierList = []for barrier in barrierList:barrier['x'] -= barrier['step']if barrier['x'] <= -barrier['width']:passelse:new_barrierList.append(barrier)barrierList = new_barrierList# 移动金币gold['x'] -= gold['step']if gold['x'] <= -gold['width']:setRandXY(gold, barrierList, player)# 更新金币的坐标
def setRandXY(gold, group, player):if len(group) != 0:# 获取障碍物列表中的最后一个元素lastBarrier = group[-1]# 获取最后一个障碍物的x坐标x = lastBarrier['x']else:# 没有障碍物时也要保证金币不会瞬间出现x = SCREENSIZE[0]# 根据最后一个障碍物x坐标计算金币图片x坐标gold['x'] = x + random.randint(420,750)gold['y'] = random.randint(220 - player['height'],  330 - gold['height']) # 角色起跳时的数据
def jumpPlayer():# 更改主角状态为跳起player['state'] = 'jumping'# 主角跳起时要用的图片player['img'] = runImgList[3]# 跳起的起始时间player['jumpTime'] = 0# 跳起的起始Y坐标player['jumpBegin'] = player['y']# 跳起的高度player['jumpChange'] = -110# 持续时间(分为跳起和落下两部分时间)player['jumpDuring'] = 300# 跳跃的状态,先跳起后落下player['jumpStatus'] = 'up'# 用于计算和设置主角跳起时的Y坐标pygame.time.set_timer(JUMP, 10)# 计算和设置角色跳起时的Y坐标
def setJumpY():jumpTime = player['jumpTime']jumpBegin = player['jumpBegin']jumpChange = player['jumpChange']jumpDuring = player['jumpDuring']if player['jumpStatus'] == 'up':player['y'] = easeOut(jumpTime, jumpBegin, jumpChange, jumpDuring)jumpTime += 10player['jumpTime'] = jumpTimeif jumpTime > jumpDuring:player['jumpTime'] = 0player['jumpBegin'] = player['y']player['jumpChange'] = -player['jumpChange']player['jumpStatus'] = 'down'elif player['jumpStatus'] == 'down':player['y'] = easeIn(jumpTime, jumpBegin, jumpChange, jumpDuring)jumpTime += 10player['jumpTime'] = jumpTimeif jumpTime > jumpDuring:player['state'] = 'running'# 这行目的防止事件队列中仍有该事件player['jumpStatus'] = None# 清除定时器pygame.time.set_timer(JUMP, 0)# 碰撞检测
def checkHit(ob1, ob2):ob1Top = ob1['y']ob1Bottom = ob1['y'] + ob1['height']ob1Left = ob1['x']ob1Right = ob1['x'] + ob1['width']ob2Top = ob2['y']ob2Bottom = ob2['y'] + ob2['height']ob2Left = ob2['x']ob2Right = ob2['x'] + ob2['width']if ob1Right >= ob2Left and ob1Left <= ob2Right:if ob1Bottom >= ob2Top and ob1Top <= ob2Bottom:return Trueelse:if ob2['x'] <= ob1['x']:ob2['ischeck'] = Truereturn False# 根据碰撞检测结果作出响应
def check():global gameState, score# 检测障碍物for barrier in barrierList:if checkHit(player, barrier):gameState = GAMEOVER# 角色掉落dropPlayer()breakelse:if barrier['ischeck'] and barrier['score']:score += barrier['score']barrier['score'] = None# 检测金币if checkHit(player, gold):setRandXY(gold, barrierList, player)score += 100# 用于存储主角掉落所需要的数据
dropData = {}# 定义主角掉落函数
def dropPlayer():# 更改主角状态为掉落player['status'] = 'dropping'# 主角掉落时的图片player['img'] = dropImg# 存储当前计算出的x坐标值dropData['x'] = player['x']# 存储当前计算出的y坐标值dropData['y'] = player['y']# 掉落的起始时间dropData['time'] = 0# 掉落的起始y坐标dropData['begin'] = player['y']# 用于存储跳起和下落的高度,初始值为要跳起的高度dropData['height'] = -200# 掉落的持续时间(分为跳起和下落)dropData['during'] = 600# 掉落的状态,先跳起后下落dropData['status'] = 'up'# 用于计算和设置主角掉落时的X、Y坐标pygame.time.set_timer(DROP, 10)# 计算主角掉落时的x、y坐标
def setDropXY():time = dropData['time']begin = dropData['begin']height = dropData['height']during = dropData['during']if dropData['status'] == 'up':time += 10dropData['x'] += 3dropData['y'] = easeOut(time, begin, height, during)dropData['time'] = timeif time >= during:dropData['time'] = 0dropData['begin'] = dropData['y']dropData['height'] = SCREENSIZE[1] - player['y']dropData['status'] = 'down'elif dropData['status'] == 'down':time += 10dropData['x'] += 3dropData['y'] = easeIn(time, begin, height, during)dropData['time'] = time# 如果掉落动作完成,关闭定时器if time > during:pygame.time.set_timer(DROP, 0)player['x'] = dropData['x']player['y'] = dropData['y']# 事件监听
def eventListen():global gameState, player, barrierList, gd, bg, gold, scorefor event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 加入准备状态判断 if gameState == GAMEREADY:if event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:gameState = GAMERUNNINGstartTimer()elif gameState == GAMERUNNING: if event.type == ADDBARRIER:barrierList.append(getBarrier())elif event.type == ANIMATION and player['state'] == 'running':animation()elif event.type == pygame.KEYDOWN and event.key in [pygame.K_w,pygame.K_UP,pygame.K_SPACE]:if player['state'] == 'running':jumpPlayer()elif event.type == JUMP:setJumpY()elif gameState == GAMEOVER:if event.type == DROP:setDropXY()# 判断是否要进行重玩操作elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:                # 更改游戏状态gameState = GAMERUNNING# 启动定时器startTimer()# 初始化数据# 角色player['x'] = 60player['y'] = 330 - runImgList[0].get_rect().heightplayer['state'] = 'running'# 障碍物barrierList = []# 地面gd['x'] = 0gd['y'] = 330# 背景bg['x'] = 0bg['y'] = 0# 金币gold['x'] = 0gold['y'] = 0# 分数score = 0# 角色动画
def animation():index = player['imgIndex'] + 1if index >= len(runImgList):index = 0player['img'] = runImgList[index]player['imgIndex'] = indexinitScreen()
setRandXY(gold, barrierList, player)
while True:clock.tick(FPS)eventListen()draw()if gameState == GAMERUNNING:move()check()elif gameState == GAMEOVER:stopTimer()pygame.display.update()

计算角色移动公式解析

'''缓动公式https://blog.csdn.net/kakaxi2222/article/details/52251138
'''
'''参数含义如下:t:timestamp,动画执行到当前帧所经过的时间b:begining,起始值c:change,需要变化的量,即最终坐值 - 起始值d:duration,动画的总时间
'''
# 用于计算位移,先慢后快
def easeIn(t, b, c, d):t = t / dreturn c * t * t * t + b# 用于计算位移,先快后慢
def easeOut(t, b, c, d):t = t / d - 1return c * (t * t * t + 1) + b

用pygame编写一个跑酷游戏相关推荐

  1. Pygame:编写一个小游戏

    大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...

  2. 如何使用c++制作一个跑酷游戏

    1.游戏引擎和开发环境的选择 如今市面上有很多成熟的游戏引擎可供选择,例如 Unity.Unreal Engine.Cocos2d-x 等.这些引擎均提供了完整的游戏开发框架,可以省去很多底层开发的工 ...

  3. #用python的pygame写一个大富翁游戏(单机版)# 一 : 初步架构

    用python写一个简易大富翁小游戏 | 一 : 初步架构 系列文章: #用python的pygame写一个大富翁游戏(单机版)# 二:地图初始化 如题,俗话说得好,人生苦短,我用python,在大二 ...

  4. #用python的pygame写一个大富翁游戏(单机版)# 二:地图初始化

    用python的pygame写一个大富翁游戏(单机版) 二 :地图初始化 往期: #用python的pygame写一个大富翁游戏(单机版)# 一 : 初步架构 上次的博客,我们说到了准备好所有程序所需 ...

  5. 用C语言编写一个小游戏

    这是一个比较通用的方法来编写一个小游戏用 C 语言: 首先,确定游戏的目标和规则.这可能包括游戏的玩法.胜负条件.游戏元素和游戏流程等. 其次,确定游戏的用户界面.这可能包括游戏的菜单.按钮.文本框. ...

  6. 编写一个扫雷游戏,我们首先要清楚游戏规则

    编写一个扫雷游戏,我们首先要清楚游戏规则:         扫雷就是要把所有非地雷的格子揭开即胜利:踩到地雷格子就算失败.游戏主区域由很多个方格组成.使用鼠标左键随机点击一个方格,方格即被打开并显示出 ...

  7. C#编写一个扫雷游戏

    基础思路 像原版一样把扫雷分为三个难度:初级难度9*9,中级难度16*16,高级难度16*30 做一个游戏需要图片资源,去网上下载了关于 扫雷的有关文件,放在了项目中 扫雷的核心是用一个二维数组存储游 ...

  8. python编写一个弹球游戏_python pygame实现挡板弹球游戏

    学了一天pygame,用python和pygame写一个简单的挡板弹球游戏 GitHub: # -*- coding:utf-8 -*- from sys import exit import pyg ...

  9. 用pygame做一个追逐游戏

    大家好呀,今天来做一个追逐游戏 1.使用鼠标操作 2.左键换颜色(随机) 3.滚轮调整球体大小(往上调大,往下调小) 4.右键清空屏幕 import sys import pygame as p fr ...

最新文章

  1. mysql本地导入导出_MySQL本地登录及数据库导入导出
  2. mysql查询各科前3_MySQL 查询各科前三的数据
  3. Shiro在SpringBoot中的应用
  4. 钟薛高雪糕最贵一支66元 创始人:成本40 你爱要不要
  5. 2.10_hash_table_哈希表 / 散列表
  6. 清除string内容_前端面试之javascript相关内容整理一
  7. iPhone开发学习笔记005——使用XIB自定义一个UIView,然后将这个view添加到controller的view...
  8. 测绘——利用CASS及数据库批量导出/修改/更新地籍信息
  9. 单数据库,多数据库,单实例,多实例不同情况下的数据访问效率测试
  10. 多种模块拔号上网驱动开发调试
  11. 删除子文件夹[字典树 + go变量 + strings.builder的copyCheck()]
  12. 红色建筑装饰公司营销型网站织梦模板
  13. 闲聊2022卡塔尔世界杯
  14. 2015年南通二级建造师考试报名通知
  15. RabbitMQ消息确认机制-可靠抵达
  16. OpenCV 学习(四)之 将图片插入另一张图片中的实现(ROI)
  17. h2 使用liquibase的changelog表格创建不成功
  18. 苹果Mac系统历年名称和版本号
  19. [附源码]JAVA毕业设计家庭记账系统(系统+LW)
  20. keras读取后缀名为.h5的文件

热门文章

  1. uniapp手机验证码功能实现
  2. linux下格式化U盘的方法
  3. Shiro认证--盐加密(SSM)
  4. 软件测评概要总结-中科软测认证中心
  5. XP系统访问共享提示提示:找不到“”。请检查拼写是否正确……
  6. SAP PCA利润中心会计案例教程前台操作
  7. 机器学习——成绩预测
  8. MC9S12XS128硬件底层驱动_set_bus_clk.h(总线时钟设置)
  9. python和stata怎么结合_双剑合璧之Stata与Python:初识IPyStata
  10. 动态时间规整算法: 从DTW到FastDTW