python - pyxel 制作游戏
之前看了一个项目,觉得还挺有意思的,是关于做一个像素风的游戏,现在,虚幻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()
有时也可简单使用show和flip画出简单的画面和动画。
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 制作游戏的更多相关文章
- 一步步用python制作游戏外挂【转】
转自:http://www.cnblogs.com/xsmhero/archive/2013/01/03/2842973.html 玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过 ...
- 12岁的少年教你用Python做小游戏
首页 资讯 文章 频道 资源 小组 相亲 登录 注册 首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...
- Python和Pygame游戏开发 pdf
Python和Pygame游戏开发 目录 第1章 安装Python和Pygame 11.1 预备知识 11.2 下载和安装Python 11.3 Windows下的安装说明 11.4 Mac OS X ...
- Unity中制作游戏的快照游戏支持玩家拍快照
Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...
- Unity制作游戏中的场景
Unity制作游戏中的场景 1.2.3 场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...
- Python计算斗牛游戏的概率
Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...
- 使用Unity制作游戏关卡的教程(一)
转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...
- Python菜鸟快乐游戏编程_pygame(6)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
- Python菜鸟快乐游戏编程_pygame(5)
Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...
随机推荐
- 双缓冲技术局部更新原理之派生自SurfaceView
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_08-课程预览技术方案
3.2.1 技术需求 课程详情页面是向用户展示课程信息的窗口,课程相当于网站的商品,本页面的访问量会非常大.此页面的内容设 计不仅要展示出课程核心重要的内容而且用户访问页面的速度要有保证,有统计显示打 ...
- Qt编写自定义控件59-直方动态图
一.前言 直方动态图类似于音乐播放时候的柱状图展示,顶部提供一个横线条,当柱状上升的时候,该线条类似于帽子的形式冲到顶端,相当于柱状顶上去的感觉,给人一种动态的感觉,听音乐的同时更加赏心悦目,原理比较 ...
- Java Web接入支付宝扫码付款API(使用SDK证书配置properties )
一.支付宝当面付功能Demo 官方文档https://docs.open.alipay.com/194/106078/ ps:因为沙箱环境一经配置了证书公钥则无法重置 第一步下载项目SKD&D ...
- 关于做移动端ui自动化测试使用PC代理网络会出现的问题
无论是手动操作app还是ui脚本操作app,只要你使用了代理网络,第一次请求的时长会耗时特别长,所以在移动端测试时尽量不要使用代理网络,减少不必要的麻烦
- 【微信小程序】wx.navigateBack() 携带参数返回
第一个页面: go_pick_time:function(e){ var that = this; var type = e.currentTarget.dataset.type; wx.naviga ...
- Mac更新npm和node版本
npm: 查看当前版本: npm --version 更新到最新版: sodu npm install npm@latest -g node: 1.查看当前版本: node -v 2.清除npm当前缓 ...
- Spring Boot学习笔记——搭建一个最简单的hello world
使用Spring Initializer新建项目 进入https://start.spring.io/新建一个项目,并下载下来. 这就是一个最基础的spring boot项目了. 我这里是基于spri ...
- topK问题
概述 在N个乱序数字中查找第K大的数字,时间复杂度可以减小至O(N). 可能存在的限制条件: 要求时间和空间消耗最小.海量数据.待排序的数据可能是浮点型等. 方法 方法一 对所有元素进行排序,之后取出 ...
- 20190923-基于Python3的RobotFramework的配置是初次使用
因为最近改自动化框架在网上找了很多框架,发现RobotFramework不错,但是网上的资料很杂,现在将自己配置框架的学习笔记分享 Python配置RobotFramework的seleniumlib ...