|
|
楼主 |
发表于 2025-8-26 16:49:04
|
显示全部楼层
本帖最后由 zzz19760225 于 2025-12-4 11:54 编辑
123456789018
继续通义:单元依次从全白,一个黑,到全部黑的递增,循环重置
可以产生依次行列白页面上,递增黑单元,重复循环。
- // 引入 SDL2 图形库头文件,用于创建窗口和绘制图形
- #include <SDL2/SDL.h>
- // 引入标准输入输出库,用于错误信息打印(如 fprintf)
- #include <stdio.h>
- // 引入标准库,虽然本程序未直接调用 exit(),但良好习惯保留
- #include <stdlib.h>
- // 定义网格的行列数:4 行 4 列
- #define GRID_SIZE 4
- // 定义每个格子的像素尺寸(宽高均为 80 像素)
- #define CELL_SIZE 80
- // 计算窗口总宽度:4 列 × 每列 80 像素 = 320 像素
- #define WINDOW_WIDTH (GRID_SIZE * CELL_SIZE)
- // 计算窗口总高度:4 行 × 每行 80 像素 = 320 像素
- #define WINDOW_HEIGHT (GRID_SIZE * CELL_SIZE)
- // 主函数入口
- int main(int argc, char* argv[]) {
- // 初始化 SDL 的视频子系统(用于窗口和渲染)
- // 如果初始化失败(返回值不为 0),则打印错误信息并退出程序
- if (SDL_Init(SDL_INIT_VIDEO) != 0) {
- fprintf(stderr, "SDL初始化失败: %s\n", SDL_GetError()); // 打印 SDL 错误信息到标准错误流
- return 1; // 返回非零值表示程序异常退出
- }
- // 创建一个 SDL 窗口:
- // - 标题为 "4x4 点阵 - 逐个变黑"
- // - 窗口在屏幕水平和垂直方向居中
- // - 宽度和高度由宏定义决定(320x320)
- // - SDL_WINDOW_SHOWN 表示创建后立即显示
- SDL_Window* window = SDL_CreateWindow("4x4 点阵 - 逐个变黑",
- SDL_WINDOWPOS_CENTERED, // X 坐标居中
- SDL_WINDOWPOS_CENTERED, // Y 坐标居中
- WINDOW_WIDTH, // 窗口宽度
- WINDOW_HEIGHT, // 窗口高度
- SDL_WINDOW_SHOWN); // 显示标志
- // 如果窗口创建失败(window 为 NULL),打印错误并清理 SDL 后退出
- if (!window) {
- fprintf(stderr, "窗口创建失败: %s\n", SDL_GetError());
- SDL_Quit(); // 释放 SDL 初始化的资源
- return 1;
- }
- // 创建一个硬件加速的渲染器,用于高效绘制图形
- // 参数 -1 表示使用默认渲染驱动
- SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
- // 如果渲染器创建失败,打印错误,销毁窗口,清理 SDL,然后退出
- if (!renderer) {
- fprintf(stderr, "渲染器创建失败: %s\n", SDL_GetError());
- SDL_DestroyWindow(window); // 先销毁窗口
- SDL_Quit(); // 再清理 SDL
- return 1;
- }
- // 定义一个整型变量 step,表示当前动画步骤:
- // step = 0 → 全白;step = 1 → 第1个黑;...;step = 16 → 全黑
- int step = 0;
- // 记录上一次更新的时间(单位:毫秒),用于控制每秒更新一次
- Uint32 last_update = SDL_GetTicks();
- // 定义更新间隔为 1000 毫秒(即 1 秒)
- const Uint32 UPDATE_INTERVAL = 1000;
- // 控制主循环是否继续运行的标志(1=运行,0=退出)
- int running = 1;
- // 声明 SDL 事件变量,用于接收用户操作(如关闭窗口)
- SDL_Event e;
- // 主循环:只要 running 为真,就持续运行
- while (running) {
- // 处理所有待处理的 SDL 事件(如鼠标、键盘、窗口关闭等)
- while (SDL_PollEvent(&e)) {
- // 如果事件类型是“窗口关闭”(点击了 X 按钮)
- if (e.type == SDL_QUIT) {
- running = 0; // 设置标志,退出主循环
- }
- }
- // 获取当前时间(自 SDL 启动以来的毫秒数)
- Uint32 now = SDL_GetTicks();
- // 判断是否已经过去至少 1 秒(UPDATE_INTERVAL)
- if (now - last_update >= UPDATE_INTERVAL) {
- step++; // 动画步骤加 1
- // 如果 step 超过 16(即第 17 步),说明已全部变黑,需要重置
- if (step > 16) {
- step = 0; // 重置为 0,重新从全白开始
- }
- // 更新“上次更新时间”为当前时间,用于下一次计时
- last_update = now;
- }
- // 设置清屏颜色为白色(R=255, G=255, B=255, A=255)
- SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
- // 执行清屏操作(用白色填充整个窗口背景)
- SDL_RenderClear(renderer);
- // 遍历网格的每一行(i 从 0 到 3)
- for (int i = 0; i < GRID_SIZE; ++i) {
- // 遍历当前行的每一列(j 从 0 到 3)
- for (int j = 0; j < GRID_SIZE; ++j) {
- // 将二维坐标 (i, j) 转换为一维索引(行优先顺序):
- // 第0行:0,1,2,3;第1行:4,5,6,7;...;第3行:12,13,14,15
- int index = i * GRID_SIZE + j;
- // 判断当前格子是否应该显示为黑色:
- // 如果它的索引小于当前 step,说明它已经被“熄灭”(变黑)
- if (index < step) {
- // 设置绘制颜色为黑色(R=0, G=0, B=0)
- SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
- } else {
- // 否则保持白色
- SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
- }
- // 定义当前格子的矩形区域:
- // x = 列号 j × 每格宽度
- // y = 行号 i × 每格高度
- // w = 每格宽度
- // h = 每格高度
- SDL_Rect rect = {
- j * CELL_SIZE, // x 坐标(从左到右)
- i * CELL_SIZE, // y 坐标(从上到下)
- CELL_SIZE, // 宽度
- CELL_SIZE // 高度
- };
- // 用当前设置的颜色填充这个矩形(即绘制一个色块)
- SDL_RenderFillRect(renderer, &rect);
- }
- }
- // 将渲染器中绘制的内容提交到窗口上显示(双缓冲交换)
- SDL_RenderPresent(renderer);
- // 暂停约 16 毫秒,使主循环大约以 60 帧/秒运行,避免 CPU 占用过高
- SDL_Delay(16);
- }
- // 程序结束前,按顺序释放资源:
- SDL_DestroyRenderer(renderer); // 销毁渲染器
- SDL_DestroyWindow(window); // 销毁窗口
- SDL_Quit(); // 清理 SDL 所有子系统
- // 正常退出程序(返回 0 表示成功)
- return 0;
- }
复制代码 下面应该是全组合了! |
|