快速入门
图形化编程可以带来更直观的编程体验,你可以在绚丽多彩的窗口中练习与实践。
PA2D 提供了直观易用的 现代C++ API, 无论是初学者还是有经验的开发者,都能快速上手并构建出色的图形应用。
C语言学习者可以在C++环境中从C语法基础开始,无缝使用PA2D的现代功能。
当你准备好时,库的面向对象设计会引导你学习现代编程。
适用于
C++入门实践
为希望从编程入门过渡到项目实践的开发者提供平滑的学习曲线。
创意软件开发
构建绘画工具、动画编辑器、数据可视化等创意应用的理想选择。
轻量级游戏开发
适合2D游戏、原型开发、教育游戏等不需要重型游戏引擎的项目。
图形编程学习
帮助理解2D图形渲染的核心原理和现代编程实践。
安装教程:
PA2D提供了十分友好的开发体验,按照安装程序提示完成安装,即可在Visual Studio 中使用。
安装程序自动配置以下三个文件:
快速开始
Step 1 : 创建Window窗口
#include <pa2d.h>
using namespace pa2d;
int main() {
// 创建一个 640*480 的窗口
Window window(640, 480, "My first PA2D Window");
// 显示这个窗口
window.show();
// 等待窗口关闭
window.waitForClose();
return 0;
}
事实上,初次创建窗口并不会立即显示,因为窗口初始化并不代表着显示窗口
我提供了 waitForClose() 堵塞线程,以便展示窗口
Step 2 : 在Canvas上绘制图形
#include <pa2d.h>
using namespace pa2d;
int main() {
Window window(640, 480, "My first PA2D Window");
window.show();
// 1. 创建一个画布
Canvas canvas(640, 480);
// 2. 在画布上画一个圆
canvas.circle(100, 100, 60, Green_fill + Red_stroke);
// 3. 让窗口去渲染画布
window.render(canvas);
window.waitForClose();
return 0;
}
Step 3 : 了解PA2D的语法
PA2D 采用了一些现代C++的语法特性,让代码更简洁直观。
如果你第一次见到这些"黑魔法",不用担心,它们其实很简单!
// 传统方式
Style style{};
style.fill_ = 0xFF00FF00; // 不透明绿色(填充)
style.stroke_ = 0xFFFF0000; // 不透明红色(线框)
style.width_ = 3; // 3像素线宽
// PA2D的字面量语法(一行解决!)
Style style = 0xFF00FF00_fill + 0xFFFF0000_stroke + 3_w;
// 使用样式绘制圆形
canvas.circle(100, 100, 60, style);
原理:通过后缀 _fill、_w 等将数字直接转换为对象。
PA2D 利用 C++ 的用户自定义字面量特性,实现了简洁的样式定义语法。
PA2D 的颜色定义: 0xAARRGGBB
#include <pa2d.h>
using namespace pa2d;
int main() {
Canvas canvas(640, 480);
// 半透明蓝色填充 + 3像素线宽
Style style = 0x800000FF_fill + 3_w;
// 传统方式(需要重复对象名)
canvas.circle(100, 100, 60, Green_stroke + style);
canvas.rect(100, 100, 120, 80, 0x80FF0000_stroke + 25.0_r + style);
canvas.text(160, 20, "你好, PA2D!", 60, Green);
// 链式调用(更流畅!)
canvas.circle(100, 100, 60, Green_stroke + style)
.rect(100, 100, 120, 80, 0x80FF0000_stroke + 25.0_r + style)
.text(160, 20, "你好, PA2D!", 60, Green);
// 3. 让窗口去渲染画布
Window(640, 480, "My first PA2D Window")
.show()
.render(canvas)
.waitForClose();
return 0;
}
链式调用:每个方法都返回对象自身的引用,可以连续调用。
💡 为什么这样设计?
这些语法都是可选的,你也可以使用传统写法。
但一旦习惯,你会发现它们让图形编程变得更加愉快!
PA2D的不同之处
效率优化
PA2D 内部做了许多AVX2优化, 相较标量版本, 可提升近16倍的运行效率, 利用其离屏渲染、画布预处理等框架, 仍可进一步优化。
核心理念
- 🎯 PrismArch
- 注重接口与整体架构的设计理念 - ⚡ Pixel Accelerated
- CPU端对像素位图进行操作 - 🏗️ Procedural Algorithm
- 全过程透明,鼓励用户自己做分支和实验
多种 API 层级
pa2d 提供从底层到高层的完整抽象体系,让开发者根据需求选择合适的编程层级:
底层操作
直接操作位图(Buffer) - 适合自己实现图形算法高效绘图
函数层级
使用画布及其方法(Canvas) - 适合快速开发
面向对象
几何对象及其样式(Shape+Style) - 提供几何变换接口
可扩展性:易于添加新的几何类型和绘制样式
智能决策:根据需求选择最优绘制方式
显式渲染流程
在PA2D中, 用户控制完全的渲染管道:
// 显式的图像存储单位(颜色数组)
Canvas canvas(400, 300);
// 显式的图像信息处理(在Canvas上绘制红色圆形)
canvas.circle(50, 50, 30, Red);
// 主动选择窗口显示的时机
window.show();
// 主动控制渲染过程
window.render(canvas);
- 🚀 快速上手,但无黑盒
- 初学者透彻理解图形编程的每一步 - 🎓 理解局限性,而非止步不前
- 逐步引入更现代的解决方案 - 🔧 深入原理,尝试优化
- 引导开发者深入理解图形编程的底层机制
更多的功能
// ==================== 1. 核心模块 ====================
Color halfAlphaRed(128, 255, 0, 0); // 半透明红色
Buffer buffer(800, 600, White); // 创建白色背景的缓冲区
Color pixel = buffer.at(100, 100); // 访问像素数据
Point point(100.5f, 200.3f); // 几何基础 - 点、向量
// ==================== 2. 几何模块 ====================
// 样式配置 - 流畅式 API
Style style = Red_fill + Black_stroke + 3_w + 10_r;
// Shape 对象 - 面向对象的图形表示
Circle circle(400, 300, 100); // 圆心(400,300),半径100
circle.translate(50, 0) // 向右移动50像素
.scale(1.5f); // 放大1.5倍
Polygon polygon = Path::from(0, 0) // 路径构建器 - 构建闭合多边形
.moveTo(100, 0)
.moveTo(100, 100)
.moveTo(0, 100);
// ==================== 3. 画布模块 ====================
Canvas canvas(800, 600); // 创建画布(代理Buffer)
canvas.draw(circle, style); // 绘制圆形
.line(0, 0, 100, 100, style) // 绘制直线
.text(100, 100, "Hello PA2D", 20, Blue) // 文本渲染
.textCentered(400, 300, "居中文本", 24, Black, // 居中显示
FontStyle::Bold | FontStyle::Italic, "Arial") // 字体样式
Canvas image("image.png", 400, 300); // 图像加载
canvas.alphaBlend(image, 0, 0, 128); // 半透明混合
canvas.overlayBlend(image); // 叠加混合
canvas.drawRotated(image, 400, 300, 30.0f); // 变换绘制
Canvas rotated = canvas.rotated(45.0f); // 变换副本
// ==================== 4. 窗口模块 ====================
Window window(800, 600, "PA2D Demo"); // 创建窗口
window.show(); // 显示窗口
.setAlwaysOnTop(true); // 置顶
.maximize(); // 最大化
.onKey([](KeyEvent e) {
if (e.keyCode == 'A' && e.pressed){/*处理A键按下*/}
})
.onMouse([](MouseEvent e) {
if (e.button == 0 && e.pressed){/*左键点击在(e.x, e.y)*/}
});
.render(canvas) // 渲染接口
由于PA2D的工作量实在太大,我目前还未做退回版本
当前版本能够支持2013+年代的电脑,可以覆盖大多数环境下的创作
对于硬件不支持的电脑,我也做了友好提示(以下为pa2d.h中的代码)
// ==================== CPU REQUIREMENT ====================
// AVX2 hardware requirement check - executes at program startup
// If CPU lacks AVX2 support, displays error message and terminates
static const struct AVX2_Verifier {
AVX2_Verifier();
}AVX2_CHECK_INSTANCE;
- 💾 安装PA2D
- 开始在实际项目中使用 PA2D - 🔍 查看程序示例
- 在"程序示例"分类中查看完整的代码示例 - 📖 浏览 API 文档
- 查看其他分类以了解完整的 API 功能 - 👥 参与社区
- 加入开发者社区,分享经验和获取帮助