这篇文章介绍2D跑酷游戏中,添加地板资源, 给主角附加重力作用,以及添加游戏控制器和游戏场景的切换。

废话不多说,直接开始。

添加地板资源

定义地板类,继承自pygame.sprite.Sprite 代码如下

import pygame

class Floor(pygame.sprite.Sprite):

def __init__(self, image, position, width=3, **kwargs):

pygame.sprite.Sprite.__init__(self)

self.image = image

self.rect = self.image.get_rect()

self.mask = pygame.mask.from_surface(self.image)

self.rect.left, self.rect.top = position

self.rect.width = self.rect.width * width

self.move_speed = 5

self.width = width

def update(self):

self.rect.left -= self.move_speed

if self.rect.right < 0:

return True

return False

def draw(self, screen):

for i in range(self.width):

screen.blit(self.image,

(self.rect.left + self.image.get_width() * i,

self.rect.top, self.rect.width, self.rect.height))

update函数是地板往左移的逻辑,随着游戏时间的增加可以更改地板移动的速度,来增加游戏难度。

地板资源是一张图片,在定义变量里边的定义基础高度即图片上边缘据屏幕底部的距离,地板间隙宽度即两个地板图片间的距离, 地板高度间隙即两个地板图片间的高度差。

定义FLOOR_LIST

FLOOR_HEIGHT = 100

FLOOR_GAP_WIDTH = 150

FLOOR_GAP_HEIGHT = 30

BASE_HEIGHT = SCREEN_HEIGHT - FLOOR_HEIGHT

# floor_width_level, floor_height_level, floor_gap_level

FLOOR_LIST = [(6, 0, 1), (2, -1, 2), (3, 0, 1), (2, 1, 1)] * 10

列表元素中的值依次表示 宽度的等级 (>=1), 高度的等级(0表示基础高度,-1是减少一个单位高度, +1是增加一个单位高度), 地板间隙宽度等级(>=0)。 这里需要修改成一个无线循环的列表, 元素的值可以随机。

附加重力作用

主角的最初最低高度定义为屏幕的高度即主角图片下边缘的位置,主角运动时更新最低高度。上篇文章中有介绍主角的运动状态,奔跑,滑动,跳跃。跳跃分为上升和下降状态,下降到最低高度,切换至奔跑状态。这篇中,主角状态增加一个下降状态,从跳跃状态中取出下降状态的逻辑,当主角没有踩在地板上而且没有跳跃时,主角置为下降状态,下降到最低高度,游戏结束。

游戏场景

游戏场景分为开始菜单界面, 奔跑界面和游戏结束结算界面。为了避免场景切换得太快造成得顿挫感,增加一个加载界面,也就是游戏中常见的读条的界面,当然实际过程中,可能是由于建立游戏场景加载资源需要耗费时间而增加加载界面等原因。

定义场景基类

from abc import abstractmethod

class Scene():

def __init__(self):

self.start_time = 0.0

self.current_time = 0.0

self.done = False

self.next_scene = None

self.next_loading_time = 0

self.persist = {}

self.bgm = None

self.bg_image = None

self.key_press = {}

@abstractmethod

def startup(self, current_time, persist, sources):

'''abstract method'''

def cleanup(self):

self.done = False

return self.persist

@abstractmethod

def update(self, screen, event, current_time):

'''abstract method'''

@abstractmethod

def set_sources(self, sources):

'''abstract method'''

分别定义各个场景的类,继承自场景基类。定义当前场景的下一个场景,以及需不需要加载界面的场景。添加各个场景的 udpate 逻辑, 当场景的属性done为True时,当前场景结束,切换到下一个场景。

游戏控制器

用来初始化游戏,加载游戏资源,监控键盘鼠标事件以及场景切换等。

定义控制器

import pygame

import consts as cfg

from modules.interface.loadRes import load_resouces

class Control:

def __init__(self):

self.done = False

self.screen, self.clock = self.init_game()

self.sources = load_resouces()

self.init_event()

self.scene = None

self.scene_dict = {}

self.scene_name = None

self.current_time = 0.0

def init_game(self): # 初始化游戏

pygame.init()

screen = pygame.display.set_mode((cfg.SCREEN_WIDTH, cfg.SCREEN_HEIGHT))

pygame.display.set_caption(cfg.ORIGINAL_CAPTION)

clock = pygame.time.Clock()

return screen, clock

def setup_scene(self, scene_dict, start_scene): # 设置场景

self.scene_dict = scene_dict

self.scene_name = start_scene

self.scene = self.scene_dict[self.scene_name]

self.game_info = {

'current_time': 0.0,

'previous_scene': None,

'current_scene': self.scene_name,

'next_scene': None,

'next_loading_time': 0

}

self.scene.startup(self.current_time, self.game_info, self.sources)

def update(self): # udpate

self.current_time = pygame.time.get_ticks()

if self.scene:

if self.scene.done:

self.flip_scene()

self.scene.update(self.current_time, self.screen, self.event)

def flip_scene(self): # 切换场景

previous, self.scene_name = self.scene_name, self.scene.next_scene

persist = self.scene.cleanup()

if persist.get('next_loading_time', 0) > 0:

self.scene_name = 'loading'

self.scene = self.scene_dict[self.scene_name]

self.scene.startup(self.current_time, persist, self.sources)

def event_loop(self): # 监控按键与鼠标

self.init_event()

for event in pygame.event.get():

if event.type == pygame.QUIT:

self.done = True

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_ESCAPE:

self.done = True

else:

self.event['key_press'][event.key] = True

elif event.type == pygame.KEYUP:

self.event['key_up'][event.key] = True

elif event.type == pygame.MOUSEBUTTONDOWN:

self.event['mouse_pos'] = pygame.mouse.get_pos()

self.event['mouse_click'] = pygame.mouse.get_pressed()

def init_event(self):

self.event = {

'key_press': {},

'key_up': {},

'mouse_pos': None,

'mouse_click': (0, 0, 0),

}

def main(self):

while not self.done:

self.event_loop()

self.update()

pygame.display.update()

self.clock.tick(cfg.FPS)

print('game exit')

效果

代码已更新至Github:打代码的shy:用python写游戏系列​github.com

用python写跑酷游戏脚本_用python写游戏之2D跑酷游戏(二)相关推荐

  1. python怎么写游戏脚本_用PYTHON做一个简单的游戏脚本(基础,详细)

    引言 这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来 ...

  2. python编辑游戏脚本_用PYTHON做一个简单的游戏脚本(基础,详细)

    引言 这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来 ...

  3. python写自动答题脚本_编写Python脚本拉取优学院答案

    上个月审计了云班课和优学院的前端代码,实现了强制修改视频进度和获取选择题答案的功能.但是单个发包效率太低了,昨晚开始着手写了一个脚本,早上修改了一下,基本功能写出来了.考虑到风险,这个脚本是获取答案, ...

  4. python和易语言写游戏脚本_用Python写王者荣耀刷金币脚本

    王者荣耀很多朋友都想买脚本和挂之类的,想更加容易的获得金币等可以在游戏里买英雄等,今天我们发挥程序员的优势教给大家用Python语言自己写一个可以刷金币的脚本,以下是全部内容. 王者荣耀的冒险模式里有 ...

  5. pygame做的著名游戏_用python写游戏之2D跑酷游戏(一)

    2D的跑酷游戏有很多,著名的例如Chrome的彩蛋小游戏,手机上的天天酷跑等. 打开Chrome浏览器输入 chrome://dino/,按空格激活彩蛋 这篇文章来分析一下这类横版跑酷游戏的主角奔跑, ...

  6. python游戏彩蛋_用python写游戏之2D跑酷游戏(一)

    2D的跑酷游戏有很多,著名的例如Chrome的彩蛋小游戏,手机上的天天酷跑等.打开Chrome浏览器输入 chrome://dino/,按空格激活彩蛋 这篇文章来分析一下这类横版跑酷游戏的主角奔跑,跳 ...

  7. python编写网页游戏脚本_用Python脚本做一些网页游戏中力所能及的自动化任务

    下面是一段自动登录360传奇霸业游戏的脚本: from pymouse importPyMouseimporttimeimportwebbrowserfrom pykeyboard importPyK ...

  8. python 首次登陆outlook 脚本_记Python“用户环境”的一次完美应用

    在之前写过一篇关于虚拟环境使用的文章,但是还没有好好的介绍一下 Python 的用户环境,原因是自己一直没遇到要使用 用户环境 的使用场景,所以就一直懒得写.恰巧这两天,自己遇到了一个使用用户环境的体 ...

  9. python自动导出数据脚本_使用python生成一个导出数据库的bat脚本文件的示例代码...

    这篇文章分享使用python生成一个导出数据库的bat脚本文件的示例代码 实例如下:# 环境: python3.x def getExportDbSql(db, index): # 获取导出一个数据库 ...

最新文章

  1. (C++)1032 挖掘机技术哪家强
  2. android5.0 广播失效,解决Android 8.0及以上系统接收不到广播的问题
  3. selenium+python headless 爬虫环境配置
  4. springboot单例模式注入对象_springboot 请求流程简介
  5. Oracle 中使用 fetch bulk collect into 批量效率的读取
  6. git如何切换分支_如何让 Jenkins 支持选择 git 分支进行构建
  7. linux下配置Java和Go环境
  8. bzoj1853幸运数字——容斥原理
  9. 最新消息,网易公司内部开始使用昵称!学阿里?
  10. 18.docker top
  11. 拓端tecdat|python3用ARIMA模型进行时间序列预测
  12. 掌握这些,你也可以轻松扒谱(上)
  13. 视频教程-SPSS统计自动化-VBA脚本开发-其他
  14. “粤省事”春运专区上线 31项服务让回家更便捷
  15. DISCUZ!X1模板home空间模板修改说明home.php
  16. 网易Airtest跨平台的UI自动化测试框架
  17. Codeforces Daily (Round 370-410)
  18. 【学习日志】2022.08.26 C#单例模式 Tostring Utils
  19. EDVR: Video Restoration with Enhanced Deformable Convolutional Networks阅读笔记
  20. 评论-Mophie果汁包(不是果汁包空气)

热门文章

  1. tensorflow cpu和gpu计算速度比较
  2. labview实现异或运算_异或运算 XOR 教程
  3. 数据可视化—D3直方图二叉树饼状图等(持续更新...)
  4. Realtek AmebaZ wifi
  5. android三星note20.6,三星Galaxy Note20系列:凭实力稳坐安卓5G机皇宝座
  6. uniapp微信小程序仿聊天 输入框在软键盘隐藏显示时与底部距离,以及保证聊天消息滚动到底部 的问题以及解决办法
  7. 圆周分孔计算公式表图_圆周分孔计算公式表图_圆周等分系数表(带图示例,版式清晰)...
  8. sql优化之oder by
  9. Android百度地图设置位置标识
  10. redis启动命令及集群创建