怎样使用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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三