21_C++精灵库 Screen 类方法教程

C++精灵库 Screen 类方法教程,本教程已内置于pxC++编辑器。

在C++精灵库中有两大类,一个是Sprite类,另一个就是Screen类。Screen类用于新建窗口屏幕。规则是先建立屏幕对象,再建立角色。如果先建立角色,则角色会自动建立一个屏幕对象,它的全局指针是g_screen。屏幕对象只要建立一个,后面建立的会自动无效。窗口默认宽度为屏幕计算机水平分辨率的1/2,高度为3/4。

1. Screen (构造函数)
作用: 创建一个屏幕窗口对象,默认原点在中心, x轴向右为正,y轴向上为正的世界坐标系。首次运行会建立res目录,释放一些图片。用户可以在res目录下放置更多的png图片以增加角色造型的丰富性。
用法:
Screen sc:创建一个名为sc,标题默认 “C++ Sprites Library” 的窗口。
Screen *sc = new Screen(“我的游戏”, 800, 600):创建一个 800×600 像素、标题为 “我的游戏” 的窗口,其指针赋值给sc。

2. title
作用: 设置或获取窗口的标题。
用法:
设置标题: screen.title(“中华C++精灵库”);
获取标题: std::string currentTitle = screen.title();

3. setup
作用: 设置窗口的宽度和高度。
用法: screen.setup(1024, 768); // 将窗口大小调整为 1024×768
返回对屏幕对象的引用。

4. clear
作用: 清空屏幕,将其填充为当前背景色。
用法: screen.clear(); // 屏幕变背景色
返回对屏幕对象的引用。

5. g_screen (全局屏幕指针)
作用: 它是在新建角色或者新建屏幕后的全局屏幕指针,用于通过指针调用屏幕的方法。
用法: g_screen->clear(); //清除角色所画图形
举例:
#include “sprites.h” //包含C++精灵库
Sprite rocket; //建立角色叫rocket

int main(){ //主功能块
// g_screen是全局屏幕对象的指针,要在新建角色后才有,如果没有建立角色或者屏幕,则  它是野指针,会导致内存错误!
g_screen->bgcolor(“lime”); //背景颜色为lime色
while(g_screen->exitonclick()){ //单击关闭窗口
g_screen->clear(); // 清除角色所画的图案
rocket.fd(1); //角色前进1个单位
g_screen->wait(0.01); //等待0.01秒
}
return 0;
}

6. update_mode / tracer (别名)
作用: 切换屏幕的自动/手动刷新模式。
用法:
screen.update_mode(true); 或 screen.tracer(true); // 启用自动刷新(默认)。每次绘图后屏幕会追踪(trace)角色的绘图及相关变化,会自动更新屏幕显示。
screen.update_mode(false); 或 screen.tracer(false); // 启用手动刷新。需要你显式调用 update() 方法才能看到画面变化,这在动画中能提升性能。
加参数时返回true或者false。
不加参数时返回对屏幕对象的引用。

7. update
作用: 手动刷新屏幕,将所有绘制操作显示出来。
用法: 在手动更新模式下(见 update_mode),完成所有绘制后调用 screen.update()来显示画面。
返回对屏幕对象的引用。
举例:
#include “sprites.h” //包含C++精灵库
Screen sc; //新建屏幕对象叫sc
Sprite rocket; //建立角色叫rocket

int main(){ //主功能块
sc.tracer(0); //关闭自动刷新
while(sc.exitonclick()){ //单击关闭窗口
sc.clear();
for(int i=0;i<4;i++)
rocket.fd(100).left(90);
sc.update(); //刷新,此时才显示画的图案
sc.wait(0.01); //等待0.01秒
rocket.fd(1);
}
return 0;
}

7. bgcolor / fill (别名)
作用: 设置屏幕的背景颜色。
用法 (多种颜色表示方式):
字符串: screen.bgcolor(“red”); 或 screen.fill(“lightblue”);
RGB值: screen.bgcolor(255, 0, 0); // 红色
HSV的色相值: screen.bgcolor(120); // 120度是绿色 (0-360)
SDL_Color: screen.bgcolor({0, 255, 0, 255}); // 绿色,关于SDL_Color类,请自行查阅SDL2库资料。
返回对屏幕对象的引用。

8. delay
作用: 设置或获取全局延迟(以毫秒为单位,默认为0毫秒)。
用法:
设置延迟: screen.delay(100); // 设置全局延迟为100毫秒,返回对屏幕对象的引用。
获取延迟: unsigned int curdelay= screen.delay();

9. mainloop / done (别名)
作用: 启动主事件循环,保持窗口打开并响应事件(如关闭按钮)。
用法: 在程序最后调用 screen.mainloop() 或 screen.done()。程序会在此处暂停,直到用户关闭窗口。

10. width / height
作用: 获取屏幕的宽度和高度。
用法:
int w = screen.width();
int h = screen.height();

11. exitonclick
作用: 让程序在用户点击窗口关闭按钮时退出主循环。
用法: 通常在 mainloop 之前调用。如果返回 false,表示用户已点击窗口的关闭按钮。
while(screen.exitonclick()) {
// 你的游戏循环代码
screen.update();
}
返回对屏幕对象的引用。

12. wait
作用: 让程序暂停指定的秒数。
用法: screen.wait(2.5f); // 暂停 2.5 秒
返回对屏幕对象的引用。

13. get_ticks
作用: 获取自程序启动以来经过的毫秒数。
用法: Uint32 startTime = screen.get_ticks(); // 常用于计时和控制帧率。

14. loadbackground / addbackground / addbg
作用: 加载一张图片作为背景,并将其添加到背景”列表”中。
用法: screen.addbackground(“path/to/background.jpg”);
返回SDL_Texture*。

15. removebackground / removebg
作用: 从背景列表中移除指定路径的背景图片。
用法: screen.removebackground(“path/to/background.jpg”);
返回对屏幕对象的引用。

16. bgpic
作用: 设置当前显示的背景图片。
用法: screen.bgpic(“path/to/my_bg.png”);
返回对屏幕对象的引用。

17. next_bg / nextbg / next_background
作用: 切换到背景列表中的下一张背景图。
用法: screen.next_bg();
返回对屏幕对象的引用。

18. pre_bg / prebg / pre_background
作用: 切换到背景列表中的上一张背景图。
用法: screen.pre_bg();
返回对屏幕对象的引用。

19. set_background
作用: 通过索引或文件路径直接设置当前背景。
用法:
按索引: screen.set_background(2); // 显示列表中的第3张图(索引从0开始)
按路径: screen.set_background(“my_image.png”);
返回对屏幕对象的引用。

20. xy_grid / xygrid
作用: 在屏幕上绘制或设置坐标网格。
用法:
绘制网格: screen.xy_grid(50); // 绘制间距为50像素的网格线
获取网格间距: int step = screen.xy_grid(); //即不加参数返回格子边长
加参数时返回对屏幕对象的引用。
不加参数时返回格子边长。

21. setpixel
作用: 在屏幕的指定坐标 (x, y) 处绘制一个像素点。
用法:
screen.setpixel(100, 200, {255, 0, 0, 255}); // 在(100,200)画一个红色像素
screen.setpixel(100, 200, “blue”); // 使用颜色名称
无返回值。

22. getpixel
作用: 获取屏幕指定坐标 (x, y) 处像素的颜色,返回颜色对象。
用法: Color color = screen.getpixel(100, 200); // 可通过color.gethex()得到16进制颜色值,如”#ff0000″
举例:
#include “sprites.h” //包含C++精灵库
Screen sc; //新建屏幕对象叫sc
Sprite rocket; //建立角色叫rocket

int main(){ //主功能块
rocket.speed(0).bk(180).pensize(20).color(0);
for(int i=0;i<360;i++)
rocket.fd(1).coloradd(1);
while(sc.exitonclick()){ //单击关闭窗口
int mouseX, mouseY; // 用于存储鼠标位置
Uint32 mouseState = SDL_GetMouseState(&mouseX, &mouseY);
to_world_xy(mouseX,mouseY); //转为世界座标
Color cc = sc.getpixel(mouseX,mouseY);
std::cout << cc.gethex() << ‘ ‘;
sc.wait(0.01); //等待0.01秒
}
return 0;
}

23. savepng
作用: 将当前屏幕内容保存为png图片文件。
用法:
截屏整个屏幕: screen.savepng(“screenshot.png”); //不是指windows整个屏幕,而是指窗口整个屏幕。
截屏指定区域: screen.savepng(“region.png”, {100, 100, 200, 200}); // 保存从矩形左上角(100,100)开始的200×200区域,如果再加是一个bool参数,为真的话表示只截绘画内容。
截屏指定区域并且不截角色本身:screen.savepng(“onlypaint.png”,{-10,10,100,200},true};
成功返回true,失败返回false。
举例:
#include “sprites.h” //包含C++精灵库
Screen sc; //新建屏幕对象叫sc
Sprite rocket; //建立角色叫rocket

int main(){ //主功能块
rocket.speed(0).bk(180).pensize(40).color(0);
for(int i=0;i<360;i++)
rocket.fd(1).coloradd(1);
//由于线宽是40,所以要完整截所绘的图形起始x坐标应该是-200。
SDL_Rect r = {-180-20,20,360+40,40} ;
//截取r指定区域内图形,但不截取角色本身。
sc.savepng(“res/testcapture.png”,r,true);
sc.mainloop();
return 0;
}

 

关于李兴球

李兴球的博客是Python创意编程原创博客
此条目发表在C++分类目录。将固定链接加入收藏夹。

发表回复