python arcade库_python游戏库:Arcade教程(4)
动次打次+金币https://www.zhihu.com/video/1237694139854061568
步骤6-添加金币和音效
下面的代码添加了我们可以收集的硬币。它还添加了一个声音,当用户点击硬币,或按下跳转按钮时播放。
我们用arcade.check_for_collision_with_list函数检查玩家是否接触金币。它的使用方式为玩家精灵和带有金币的列表作为传入参数。函数返回与玩家精灵接触的金币列表。如果没有硬币接触,则列表为空。
Sprite.remove_from_sprite_lists函数将从所有列表中删除该精灵,并有效地执行游戏。
请注意,图像周围的任何透明“空白”都将被视为hitbox。您可以在图形编辑器中修剪空间,或者在第二部分中,我们将向您展示如何指定hitbox。
"""Platformer Game06_coins_and_sound.py - 添加金币和音效"""
import arcade
# 定义常量,屏幕的宽、高和标题
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 650
SCREEN_TITLE = "Platformer"
# 用于缩放精灵原始大小的常数
CHARACTER_SCALING = 1
TILE_SCALING = 0.5
COIN_SCALING = 0.5
# 玩家的移动速度、重力以及跳跃速度,以每帧像素为单位
PLAYER_MOVEMENT_SPEED = 5
GRAVITY = 1
PLAYER_JUMP_SPEED = 15
# 在人物和游戏边框之间保留多少像素作为最小边距
# 就是人物不能太靠近边框,太近就该移动摄像头了
LEFT_VIEWPORT_MARGIN = 150
RIGHT_VIEWPORT_MARGIN = 150
BOTTOM_VIEWPORT_MARGIN = 50
TOP_VIEWPORT_MARGIN = 100
class MyGame(arcade.Window):
"""封装成的主类"""
def __init__(self):
# 初始化父类并设置窗口
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
# 这些是跟踪我们精灵的“列表”。每个精灵应该
# 被放入列表.
self.coin_list = None
self.wall_list = None
self.player_list = None
# 保存玩家精灵的单独变量
self.player_sprite = None
# 我们的物理引擎
self.physics_engine = None
# 用来跟踪我们的滚动
self.view_bottom = 0
self.view_left = 0
# 加载音效
self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
self.jump_sound = arcade.load_sound("sounds/jump1.wav")
arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
def setup(self):
""" 在这里设置游戏。调用此函数重新启动游戏. """
# 用来跟踪我们的滚动
self.view_bottom = 0
self.view_left = 0
# 创建精灵列表
self.player_list = arcade.SpriteList()
self.wall_list = arcade.SpriteList()
self.coin_list = arcade.SpriteList()
# 设置玩家,注意将其放置在指定坐标处.
self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
self.player_sprite.center_x = 64
self.player_sprite.center_y = 96
self.player_list.append(self.player_sprite)
# 创建背景
# 这显示了如何使用循环水平放置多个精灵
for x in range(0, 1250, 64):
wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
wall.center_x = x
wall.center_y = 32
self.wall_list.append(wall)
# 把一些板条箱放在地上
# 这显示了如何使用坐标列表来放置精灵
coordinate_list = [[512, 96],
[256, 96],
[768, 96]]
for coordinate in coordinate_list:
# 添加一个地板
wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
wall.position = coordinate
self.wall_list.append(wall)
# 使用循环放置一些金币让我们的角色捡起
for x in range(128, 1250, 256):
coin = arcade.Sprite("images/items/coinGold.png", COIN_SCALING)
coin.center_x = x
coin.center_y = 96
self.coin_list.append(coin)
# 添加物理引擎
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
self.wall_list,
GRAVITY)
def on_draw(self):
""" 渲染屏幕 . """
# 将屏幕设置为背景色
arcade.start_render()
# 画出我们的精灵
self.wall_list.draw()
self.coin_list.draw()
self.player_list.draw()
def on_key_press(self, key, modifiers):
"""每当按下键时调用 . """
if key == arcade.key.UP or key == arcade.key.W:
if self.physics_engine.can_jump():
self.player_sprite.change_y = PLAYER_JUMP_SPEED
arcade.play_sound(self.jump_sound)
elif key == arcade.key.LEFT or key == arcade.key.A:
self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
elif key == arcade.key.RIGHT or key == arcade.key.D:
self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
def on_key_release(self, key, modifiers):
"""每当释放键时调用. """
if key == arcade.key.LEFT or key == arcade.key.A:
self.player_sprite.change_x = 0
elif key == arcade.key.RIGHT or key == arcade.key.D:
self.player_sprite.change_x = 0
def update(self, delta_time):
""" 移动画面与游戏逻辑 """
# 用物理引擎更新所有精灵
self.physics_engine.update()
# 看看有没有捡到硬币
coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
self.coin_list)
# 把我们击中的每一枚硬币(如果有的话)取出
for coin in coin_hit_list:
# 移除金币
coin.remove_from_sprite_lists()
# 播放音效
arcade.play_sound(self.collect_coin_sound)
# 分数加一
# --- 实现画面滚动 ---
# 跟踪是否需要更改视区
changed = False
# 向左滚
left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
if self.player_sprite.left < left_boundary:
self.view_left -= left_boundary - self.player_sprite.left
changed = True
# 向右滚
right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
if self.player_sprite.right > right_boundary:
self.view_left += self.player_sprite.right - right_boundary
changed = True
# 向上滚
top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
if self.player_sprite.top > top_boundary:
self.view_bottom += self.player_sprite.top - top_boundary
changed = True
# 向下滚
bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
if self.player_sprite.bottom < bottom_boundary:
self.view_bottom -= bottom_boundary - self.player_sprite.bottom
changed = True
if changed:
# 只滚动到整数。否则我们最终得到的像素不会在屏幕上显示
self.view_bottom = int(self.view_bottom)
self.view_left = int(self.view_left)
# 滚
arcade.set_viewport(self.view_left,
SCREEN_WIDTH + self.view_left,
self.view_bottom,
SCREEN_HEIGHT + self.view_bottom)
def main():
""" 主函数,大佬们往往把功能封装成类在main函数里写测试的代码,如果直接运行该脚本就会运行测试"""
window = MyGame()
window.setup()
arcade.run()
if __name__ == "__main__":
main()
备注:花点时间把硬币放在你喜欢的地方。如果你有多余的时间,试着增加更多的硬币。还可以从提供的图形中添加宝石或钥匙。
您还可以将coin sprite子类化,并为得分值添加一个属性。然后你可以得到价值一分的硬币,价值5分,10分和15分的宝石。
步骤7-显示分数
既然我们可以收集硬币并获得分数,我们需要一种在屏幕上显示分数的方法。
这比每次在同一个x,y位置画分数要复杂得多,因为如果我们有一个滚动屏幕,我们必须“滚动”分数。为此,我们只需添加view_bottom和view_left坐标。
"""
Platformer Game
07_score.py - 添加得分
"""
import arcade
# 定义常量,屏幕的宽、高和标题
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 650
SCREEN_TITLE = "Platformer"
# 用于缩放精灵原始大小的常数
CHARACTER_SCALING = 1
TILE_SCALING = 0.5
COIN_SCALING = 0.5
# 玩家的移动速度、重力以及跳跃速度,以每帧像素为单位
PLAYER_MOVEMENT_SPEED = 5
GRAVITY = 1
PLAYER_JUMP_SPEED = 15
# 在人物和游戏边框之间保留多少像素作为最小边距
# 就是人物不能太靠近边框,太近就该移动摄像头了
LEFT_VIEWPORT_MARGIN = 150
RIGHT_VIEWPORT_MARGIN = 150
BOTTOM_VIEWPORT_MARGIN = 50
TOP_VIEWPORT_MARGIN = 100
class MyGame(arcade.Window):
"""
封装成的主类
"""
def __init__(self):
# 初始化父类并设置窗口
super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
# 这些是跟踪我们精灵的“列表”。每个精灵应该
# 被放入列表.
self.coin_list = None
self.wall_list = None
self.player_list = None
# 保存玩家精灵的单独变量
self.player_sprite = None
# 我们的物理引擎
self.physics_engine = None
# 用来跟踪我们的滚动
self.view_bottom = 0
self.view_left = 0
# 记录分数
self.score = 0
# 加载音效
self.collect_coin_sound = arcade.load_sound("sounds/coin1.wav")
self.jump_sound = arcade.load_sound("sounds/jump1.wav")
arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
def setup(self):
""" 在这里设置游戏。调用此函数重新启动游戏. """
# 用来跟踪我们的滚动
self.view_bottom = 0
self.view_left = 0
# 记录分数
self.score = 0
# 创建精灵列表
self.player_list = arcade.SpriteList()
self.wall_list = arcade.SpriteList()
self.coin_list = arcade.SpriteList()
# 设置玩家,注意将其放置在指定坐标处.
self.player_sprite = arcade.Sprite("images/player_1/player_stand.png", CHARACTER_SCALING)
self.player_sprite.center_x = 64
self.player_sprite.center_y = 96
self.player_list.append(self.player_sprite)
# 创建背景
# 这显示了如何使用循环水平放置多个精灵
for x in range(0, 1250, 64):
wall = arcade.Sprite("images/tiles/grassMid.png", TILE_SCALING)
wall.center_x = x
wall.center_y = 32
self.wall_list.append(wall)
# 把一些板条箱放在地上
# 这显示了如何使用坐标列表来放置精灵
coordinate_list = [[512, 96],
[256, 96],
[768, 96]]
for coordinate in coordinate_list:
# 添加一个地板
wall = arcade.Sprite("images/tiles/boxCrate_double.png", TILE_SCALING)
wall.position = coordinate
self.wall_list.append(wall)
# 使用循环放置一些金币让我们的角色捡起
for x in range(128, 1250, 256):
coin = arcade.Sprite("images/items/coinGold.png", COIN_SCALING)
coin.center_x = x
coin.center_y = 96
self.coin_list.append(coin)
# 添加物理引擎
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
self.wall_list,
GRAVITY)
def on_draw(self):
""" 渲染屏幕 . """
# 将屏幕设置为背景色
arcade.start_render()
# 画出我们的精灵
self.wall_list.draw()
self.coin_list.draw()
self.player_list.draw()
# 在屏幕上画出分数,用视窗滚动
score_text = f"Score: {self.score}"
arcade.draw_text(score_text, 10 + self.view_left, 10 + self.view_bottom,
arcade.csscolor.WHITE, 18)
def on_key_press(self, key, modifiers):
"""每当按下键时调用 . """
if key == arcade.key.UP or key == arcade.key.W:
if self.physics_engine.can_jump():
self.player_sprite.change_y = PLAYER_JUMP_SPEED
arcade.play_sound(self.jump_sound)
elif key == arcade.key.LEFT or key == arcade.key.A:
self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
elif key == arcade.key.RIGHT or key == arcade.key.D:
self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
def on_key_release(self, key, modifiers):
"""每当释放键时调用. """
if key == arcade.key.LEFT or key == arcade.key.A:
self.player_sprite.change_x = 0
elif key == arcade.key.RIGHT or key == arcade.key.D:
self.player_sprite.change_x = 0
def update(self, delta_time):
""" 移动画面与游戏逻辑 """
# 用物理引擎更新所有精灵
self.physics_engine.update()
# 看看有没有捡到硬币
coin_hit_list = arcade.check_for_collision_with_list(self.player_sprite,
self.coin_list)
# 把我们击中的每一枚硬币(如果有的话)取出
for coin in coin_hit_list:
# 移除金币
coin.remove_from_sprite_lists()
# 播放音效
arcade.play_sound(self.collect_coin_sound)
# 分数加一
self.score += 1
# --- 实现画面滚动 ---
# 跟踪是否需要更改视区
changed = False
# 向左滚
left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
if self.player_sprite.left < left_boundary:
self.view_left -= left_boundary - self.player_sprite.left
changed = True
# 向右滚
right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
if self.player_sprite.right > right_boundary:
self.view_left += self.player_sprite.right - right_boundary
changed = True
# 向上滚
top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
if self.player_sprite.top > top_boundary:
self.view_bottom += self.player_sprite.top - top_boundary
changed = True
# 向下滚
bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
if self.player_sprite.bottom < bottom_boundary:
self.view_bottom -= bottom_boundary - self.player_sprite.bottom
changed = True
if changed:
# 只滚动到整数。否则我们最终得到的像素不会在屏幕上显示
self.view_bottom = int(self.view_bottom)
self.view_left = int(self.view_left)
# 滚
arcade.set_viewport(self.view_left,
SCREEN_WIDTH + self.view_left,
self.view_bottom,
SCREEN_HEIGHT + self.view_bottom)
def main():
""" 主函数,大佬们往往把功能封装成类
在main函数里写测试的代码,如果直接运行该脚本就会运行测试
"""
window = MyGame()
window.setup()
arcade.run()
if __name__ == "__main__":
main()
备注:您可能还需要添加:
要收集多少硬币的计数。
剩下的生命点数。
一个计时器:屏幕计时器
此示例演示如何添加FPS计时器:绘制移动精灵应力测试
自己探索练习用不同的贴图创建自己的布局。
添加背景图像。请参见使用背景图像
添加移动平台。见移动平台
添加坡道。见坡道
根据角色面对的方向更改角色图像。请参见精灵:面向左或面向右
在屏幕上添加说明和游戏。叫我彪哥:python游戏库:Arcade教程(5)zhuanlan.zhihu.com
python arcade库_python游戏库:Arcade教程(4)相关推荐
- 机器学习 python 库_Python机器学习库
机器学习 python 库 什么是机器学习? (What is Machine Learning?) As the web is immensely growing with each day, an ...
- python单词库_python 单词库
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python官方教程的最后一个部分就是标准库概览,在这里我们浏览一下标准库,了解 ...
- python调用数学库_python 数学库
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我正在寻找一个3d数学库在python或python绑定. 它需要处理旋转,平移 ...
- python argparse库_python标准库之argparse
argparse的使用 argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并 ...
- python机器学习库_Python机器学习库 Top 10,你值得拥有!
随着人工智能技术的发展与普及,Python超越了许多其他编程语言,成为了机器学习领域中最热门最常用的编程语言之一.有许多原因致使Python在众多开发者中如此受追捧,其中之一便是其拥有大量的与机器学习 ...
- python xlwings 切片_Python xlwings库学习笔记(1)
Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...
- python 数据分析 库_Python数据分析库
python 数据分析 库 什么是数据分析? (What is Data Analytics?) Data is power. Insights acquired from data is the k ...
- python的标识库和第三方库_Python 标准库、第三方库
Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清 ...
- python多线程库_python多线程库
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使 ...
最新文章
- 使用Jekyll搭建博客
- JVM调优:定位垃圾的常用算法
- db4o, 看上去很美
- Shell脚本函数(函数传参、递归、创建库)
- 统计 Github 2021 贡献过的开源项目
- 利用Arcgis for javascript API绘制GeoJSON并同时弹出多个Popup
- SpringBoot的注解@Qualifier用法
- 帝国CMS 7.5仿《讲历史网》模板/优秀的历史网帝国CMS模板下载
- 美团架构师熬夜整理:Netty权威指南2.0版+英雄传说项目
- python编辑数学公式_最好用的文字与公式编辑器,这套数学笔记神器送给你
- 磁碟机病毒专杀3月20日更新到6.4版 (另附上多种专杀工具)
- 使用IDEA连接本地数据库
- ionic 环境搭建,运行项目到浏览器,android手机,模拟器
- 微信小程序取本地数据库数据(实测有图)
- 基于HBuilder 开发 项目之微信支付
- 区间dp,绝对值不等式
- 数据可视化工具之常见的折线图与折现面积图分析
- Ping网关间歇性丢包,Ping同局域网电脑正常
- unity从服务器下载资源并且保存到本地
- 【愚公系列】2023年01月 Java教学课程 017-Random随机数的使用
热门文章
- notes-ThinkCMF视频教程 第一期(网易云课堂)
- 51单片机常用通信方式之IIC通信(二)
- C++ Qt高仿QQ影音视频播放器 (一)
- 用户注册密码加密和后端校验的权衡
- 电脑网络里面无法显示本计算机,电脑的本地连接不见了怎么办 电脑的本地连接不见了解决方法...
- 四样融合!对东软刘积仁的战略布局,大写的服!
- sklearn.ensemble模型融合
- linux搭建keepalived+tomcat+nginx 双主机热备排坑
- 企业付款到零钱(微信)
- 线性代数学习笔记8-2:对称矩阵和Hermitian矩阵、共轭转置、正定矩阵