之前看了一个项目,觉得还挺有意思的,是关于做一个像素风的游戏,现在,虚幻4,u3d,已经让游戏愈发的好看,好玩,曾经我们童年的像素风游戏,愈来愈少。所以,这里我们就回味下。

Pyxel是一个python的经典像素风游戏制作引擎。

由于像素风游戏的机制非常简单(如:最多只能显示16种颜色、播放4种声音等),现在你也可以轻松地享受这种游戏的制作过程。

Windows

安装Python3(3.7或更高版本)之后,输入以下pip命令来安装Pyxel:

pip install -U pyxel

在python代码导入Pyxel模块后,首先用init函数指定窗口大小,然后用run函数启动Pyxel应用。

import pyxel

pyxel.init(160, 120)

def update():
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit() def draw():
pyxel.cls(0)
pyxel.rect(10, 10, 20, 20, 11) pyxel.run(update, draw)
 

run函数的两个参数update函数和draw函数分别用来在需要时更新帧和绘制画面。

实际应用中,建议将pyxel代码封装成如下类:

import pyxel

class App:
def __init__(self):
pyxel.init(160, 120)
self.x = 0
pyxel.run(self.update, self.draw) def update(self):
self.x = (self.x + 1) % pyxel.width def draw(self):
pyxel.cls(0)
pyxel.rect(self.x, 0, 8, 8, 9) App()
 

有时也可简单使用showflip画出简单的画面和动画。

show函数可以显示画面直到ESC键按下。

import pyxel

pyxel.init(120, 120)
pyxel.cls(1)
pyxel.circb(60, 60, 40, 7)
pyxel.show() #flip函数可以更新一次画面。 import pyxel pyxel.init(120, 80) while True:
pyxel.cls(3)
pyxel.rectb(pyxel.frame_count % 160 - 40, 20, 40, 40, 7)
pyxel.flip()

像素风的游戏比较容易制作,关键的逻辑还需要程序员自己去发掘。

下面是一个例子:

from random import randint

import pyxel
import gzip class App:
def __init__(self):
pyxel.init(160, 120, caption="Pyxel Jump") #pyxel.load("jump_game.pyxres") self.score = 0
self.player_x = 72
self.player_y = -16
self.player_vy = 0
self.player_is_alive = True self.far_cloud = [(-10, 75), (40, 65), (90, 60)]
self.near_cloud = [(10, 25), (70, 35), (120, 15)]
self.floor = [(i * 60, randint(8, 104), True) for i in range(4)]
self.fruit = [(i * 60, randint(0, 104), randint(0, 2), True) for i in range(4)] pyxel.playm(0, loop=True) pyxel.run(self.update, self.draw) def update(self):
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit() self.update_player() for i, v in enumerate(self.floor):
self.floor[i] = self.update_floor(*v) for i, v in enumerate(self.fruit):
self.fruit[i] = self.update_fruit(*v) def update_player(self):
if pyxel.btn(pyxel.KEY_LEFT) or pyxel.btn(pyxel.GAMEPAD_1_LEFT):
self.player_x = max(self.player_x - 2, 0) if pyxel.btn(pyxel.KEY_RIGHT) or pyxel.btn(pyxel.GAMEPAD_1_RIGHT):
self.player_x = min(self.player_x + 2, pyxel.width - 16) self.player_y += self.player_vy
self.player_vy = min(self.player_vy + 1, 8) if self.player_y > pyxel.height:
if self.player_is_alive:
self.player_is_alive = False
pyxel.play(3, 5) if self.player_y > 600:
self.score = 0
self.player_x = 72
self.player_y = -16
self.player_vy = 0
self.player_is_alive = True def update_floor(self, x, y, is_active):
if is_active:
if (
self.player_x + 16 >= x
and self.player_x <= x + 40
and self.player_y + 16 >= y
and self.player_y <= y + 8
and self.player_vy > 0
):
is_active = False
self.score += 10
self.player_vy = -12
pyxel.play(3, 3)
else:
y += 6 x -= 4 if x < -40:
x += 240
y = randint(8, 104)
is_active = True return x, y, is_active def update_fruit(self, x, y, kind, is_active):
if is_active and abs(x - self.player_x) < 12 and abs(y - self.player_y) < 12:
is_active = False
self.score += (kind + 1) * 100
self.player_vy = min(self.player_vy, -8)
pyxel.play(3, 4) x -= 2 if x < -40:
x += 240
y = randint(0, 104)
kind = randint(0, 2)
is_active = True return (x, y, kind, is_active) def draw(self):
pyxel.cls(12) # draw sky
pyxel.blt(0, 88, 0, 0, 88, 160, 32) # draw mountain
pyxel.blt(0, 88, 0, 0, 64, 160, 24, 12) # draw forest
offset = pyxel.frame_count % 160
for i in range(2):
pyxel.blt(i * 160 - offset, 104, 0, 0, 48, 160, 16, 12) # draw clouds
offset = (pyxel.frame_count // 16) % 160
for i in range(2):
for x, y in self.far_cloud:
pyxel.blt(x + i * 160 - offset, y, 0, 64, 32, 32, 8, 12) offset = (pyxel.frame_count // 8) % 160
for i in range(2):
for x, y in self.near_cloud:
pyxel.blt(x + i * 160 - offset, y, 0, 0, 32, 56, 8, 12) # draw floors
for x, y, is_active in self.floor:
pyxel.blt(x, y, 0, 0, 16, 40, 8, 12) # draw fruits
for x, y, kind, is_active in self.fruit:
if is_active:
pyxel.blt(x, y, 0, 32 + kind * 16, 0, 16, 16, 12) # draw player
pyxel.blt(
self.player_x,
self.player_y,
0,
16 if self.player_vy > 0 else 0,
0,
16,
16,
12,
) # draw score
s = "SCORE {:>4}".format(self.score)
pyxel.text(5, 4, s, 1)
pyxel.text(4, 4, s, 7) App()

还比较好玩,大家可以尝试下。

python - pyxel 制作游戏的更多相关文章

  1. 一步步用python制作游戏外挂【转】

    转自:http://www.cnblogs.com/xsmhero/archive/2013/01/03/2842973.html 玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过 ...

  2. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  3. Python和Pygame游戏开发 pdf

    Python和Pygame游戏开发 目录 第1章 安装Python和Pygame 11.1 预备知识 11.2 下载和安装Python 11.3 Windows下的安装说明 11.4 Mac OS X ...

  4. Unity中制作游戏的快照游戏支持玩家拍快照

    Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...

  5. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  6. Python计算斗牛游戏的概率

    Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...

  7. 使用Unity制作游戏关卡的教程(一)

    转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...

  8. Python菜鸟快乐游戏编程_pygame(6)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...

  9. Python菜鸟快乐游戏编程_pygame(5)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...

随机推荐

  1. Tosca Connection Validation error:40 - Could not open a connection to SQL Server (不知道怎么解决)

    谁知道下面这个错怎么解决,请给我留言,谢谢. 数据库能正常链接,服务也是 normal running

  2. 沙箱测试环境配置AND证书添加

    支付宝SDK接口项目Demo测试 一.进入支付宝开放中心 下载密钥生成器 https://developers.alipay.com/developmentAccess/developmentAcce ...

  3. Mysql常见索引介绍

    索引是一种特殊的文件,包含了对数据表中所有记录的引用指针.InnoDB引擎的数据库,其上的索引是表空间的一个组成部分. (1).索引的优缺点 优点:加快搜索速度,减少查询时间 缺点:索引是以文件的形式 ...

  4. Windows Server2012 KB2919355 补丁无法安装

    环境说明:Windows Server 2012 R2 版本  64位: 今天再给客户服务器安装 .net framework 4.7 的时候,提示产生阻滞的问题: 你需要先安装对应于 KB29193 ...

  5. kubenetes创建一个pod应用

    Pod是可以创建和管理Kubernetes计算的最小可部署单元.一个Pod代表着集群中运行的一个进程.每个pod都有一个唯一的ip. 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker) ...

  6. Java测试当前应用所占用的内存示例

    package test; import java.util.HashMap; import java.util.Map; public class TestMemory { public stati ...

  7. iOS技术面试06:应用程序

    1.NSRunLoop的实现机制,及在多线程中如何使用 NSRunLoop是IOS消息机制的处理模式 >1.NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的 ...

  8. 如何去除PATH里的重复项并排序

    注意sed的用法,linux和Mac os不同,linux是Gnu的,Mac是BSD的 PATH排序去掉重复内容 mac和linux的换行符替换方法不一样,如下是Mac下的操作 export PATH ...

  9. 如何区分进程和线程ps -eLf

    方式 使用ls /proc/pid/task/ 查看线程 使用ps -eLf命令/ps aux -L/ps aux -el 使用pstree 进程和线程 进程是资源分配的最小单位 线程是cpu时间片分 ...

  10. AWS 存储服务(三)

    目录 AWS S3 业务场景 挑战 解决方案 S3的好处 S3 属性 存储桶 Buckets 对象 Object S3 特性 S3 操作 可用性和持久性 一致性 S3 定价策略 S3高级功能 存储级别 ...