怎样使用Pyglet库给推箱子游戏画关卡地图

2024-02-22 00:36

本文主要是介绍怎样使用Pyglet库给推箱子游戏画关卡地图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

pyglet库

画图事件

按键事件

程序扩展

关卡地图


pyglet库

是一个跨平台的Python多媒体库,提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染和音频播放的项目。基础内容请参阅《初步探索Pyglet库:打造轻量级多媒体与游戏开发利器》(链接:http://t.csdnimg.cn/c73Mq)。

画图事件

@window.event
def on_draw():
    window.clear()

按键事件

@window.event
def on_key_press(symbol, modifiers):
    if symbol == key.LEFT:
        ......

用这两个事件就能控制在屏幕上作画,完整代码如下:

import pyglet
from pyglet.window import key

WIDTH, HEIGHT = 900, 600
SKYBLUE = (176, 196, 222, 255)
window = pyglet.window.Window(WIDTH, HEIGHT)
pyglet.gl.glClearColor(*map(lambda x:x/255, SKYBLUE))

body = pyglet.resource.image('person.png')

x, y = 7, 5
maps = [(x*60, y*60)]

@window.event
def on_draw():
    window.clear()
    for x, y in maps:
        body.blit(x, y)

@window.event
def on_key_press(symbol, modifiers):
    x, y = maps[-1]
    if symbol in (key.A, key.LEFT):
        cur = (x-60, y)
    elif symbol in (key.D, key.RIGHT):
        cur = (x+60, y)
    elif symbol in (key.W, key.UP):
        cur = (x, y+60)
    elif symbol in (key.S, key.DOWN):
        cur = (x, y-60)
    maps.append(cur)

pyglet.app.run()


此时,没有对边界作限制,图画可以移到界面之外。边界控制如下:

if 0 <= cur[0] < WIDTH and 0 <= cur[1] < HEIGHT:

再加一个图片,形成像贪吃蛇一样在屏幕上游动,但加了界限已出不了屏幕了: 

import pyglet
from pyglet.window import keyWIDTH, HEIGHT = 900, 600
SKYBLUE = (176, 196, 222, 255)
window = pyglet.window.Window(WIDTH, HEIGHT)
pyglet.gl.glClearColor(*map(lambda x:x/255, SKYBLUE))wall = pyglet.resource.image('wall.png')
body = pyglet.resource.image('person.png')x, y = 7, 5
maps = [(x*60, y*60)]@window.event
def on_draw():window.clear()for x, y in maps:wall.blit(x, y)body.blit(x, y)@window.event
def on_key_press(symbol, modifiers):x, y = maps[-1]if symbol in (key.A, key.LEFT):cur = (x-60, y)elif symbol in (key.D, key.RIGHT):cur = (x+60, y)elif symbol in (key.W, key.UP):cur = (x, y+60)elif symbol in (key.S, key.DOWN):cur = (x, y-60)if 0 <= cur[0] < WIDTH and 0 <= cur[1] < HEIGHT:maps.append(cur)pyglet.app.run()

程序扩展

上面代码基本功能已实现,现在再增加一个label标签,一个红色圆圈。

分别用来显示提示消息,表示当前坐标位置:

label = pyglet.text.Label('hello word', font_size=16, x=20, y=20)

circle = pyglet.shapes.Circle(0, 0, r, color=RED)

假定推箱子游戏的地图分别由’blink','wall','floor','box0','person','target','box1'组成,在画地图时按需要不断切换就能制作游戏关卡的地图了:

完整代码如下:

import pyglet
from pyglet.window import keyWIDTH, HEIGHT = 900, 600
SKYBLUE = (176, 196, 222, 255)
RED = (255, 0, 0, 255)
window = pyglet.window.Window(WIDTH, HEIGHT)
pyglet.gl.glClearColor(*map(lambda x:x/255, SKYBLUE))Images = 'blink','wall','floor','box0','person','target','box1'
Object = [pyglet.resource.image(f'{img}.png') for img in Images]w, r, x, y = 60, 8, 7, 5
obj = 2
maps = [[x*w, y*w, obj]]
curxy = maps[0]circle = pyglet.shapes.Circle(0, 0, r, color=RED)
label = pyglet.text.Label(f'请按0-6选择图例,当前图例为:{Images[obj]}', font_size=16, x=20, y=20)@window.event
def on_draw():window.clear()for x, y, obj in maps:Object[obj].blit(x, y)circle.draw()circle.x, circle.y = (i+w/2 for i in (x,y))label.draw()@window.event
def on_key_press(symbol, modifiers):global obj,curxyx, y, _ = maps[-1]if symbol in range(48,55):obj = symbol-48label.text = f'请按0-6选择图例,当前图例为:{Images[obj]}'elif symbol in (key.A, key.LEFT):curxy = x-w, y, objelif symbol in (key.D, key.RIGHT):curxy = x+w, y, objelif symbol in (key.W, key.UP):curxy = x, y+w, objelif symbol in (key.S, key.DOWN):curxy = x, y-w, objif 0 <= curxy[0] < WIDTH and 60 <= curxy[1] < HEIGHT:maps.append(list(curxy))pyglet.app.run()

关卡地图

再来尝试画一个难度大一点关卡: 

此时,我们得到的地图列表为:

[[420, 300, 2], [360, 300, 2], [300, 300, 2], [240, 300, 2], [180, 300, 2], [180, 300, 2], [180, 240, 1], [180, 180, 1], [180, 120, 1], [240, 120, 1], [300, 120, 1], [360, 120, 1], [420, 120, 1], [480, 120, 1], [540, 120, 1], [600, 120, 1], [660, 120, 1], [660, 180, 1], [660, 180, 1], [600, 180, 2], [540, 180, 2], [480, 180, 2], [420, 180, 2], [360, 180, 2], [300, 180, 2], [300, 180, 2], [240, 180, 4], [240, 180, 4], [240, 240, 3], [300, 240, 3], [360, 240, 3], [420, 240, 3], [480, 240, 3], [540, 240, 3], [600, 240, 3], [600, 240, 3], [660, 240, 2], [660, 240, 2], [660, 300, 1], [660, 240, 1], [660, 300, 1], [660, 300, 1], [660, 300, 1], [600, 300, 5], [540, 300, 5], [480, 300, 5], [480, 300, 5], [420, 300, 1], [420, 300, 1], [360, 300, 5], [300, 300, 5], [240, 300, 5], [240, 360, 5], [300, 360, 5], [360, 360, 5], [420, 360, 5], [480, 360, 5], [540, 360, 5], [600, 360, 5], [600, 360, 5], [660, 360, 1], [660, 420, 1], [660, 480, 1], [660, 540, 1], [600, 540, 1], [540, 540, 1], [480, 540, 1], [420, 540, 1], [360, 540, 1], [300, 540, 1], [240, 540, 1], [180, 540, 1], [120, 540, 1], [180, 540, 1], [180, 480, 1], [180, 420, 1], [180, 360, 1], [180, 300, 1], [180, 360, 1], [180, 420, 1], [180, 480, 1], [180, 540, 1], [180, 540, 1], [120, 540, 0], [180, 540, 0], [180, 540, 0], [180, 540, 0], [240, 540, 1], [180, 540, 1], [180, 480, 1], [180, 480, 1], [240, 480, 2], [300, 480, 2], [360, 480, 2], [420, 480, 2], [480, 480, 2], [540, 480, 2], [600, 480, 2], [600, 480, 2], [600, 420, 3], [540, 420, 3], [480, 420, 3], [480, 420, 3], [420, 420, 2], [420, 420, 2], [360, 420, 3], [300, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3], [240, 420, 3]]

通过指定要求洗数,得到想要的关卡地图,供推箱子游戏调用:

[[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 2, 2, 2, 2, 2, 2, 2, 1], [1, 3, 3, 3, 2, 3, 3, 3, 1], [1, 5, 5, 5, 5, 5, 5, 5, 1], [1, 5, 5, 5, 1, 5, 5, 5, 1], [1, 3, 3, 3, 3, 3, 3, 3, 1], [1, 4, 2, 2, 2, 2, 2, 2, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1]]


本文完

这篇关于怎样使用Pyglet库给推箱子游戏画关卡地图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733581

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se