You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SDL2角色渲染异常求助:图像高度值异常且静止时无显示

让我们一步步解决你在SDL2角色渲染中遇到的两个问题:

问题1:图像高度出现异常超大数值

这个问题的核心是参数传递类型不匹配,导致程序读取了错误的内存地址:
你在Wydruk_postaci函数里调用render时,犯了两个指针传递错误:

  1. 对于纹理参数:PrzodTylBok本身就是sTekstura*类型的数组,Przod[(*frame)/4]直接就是一个指向纹理的指针,但你却加了&取地址,变成了二级指针sTekstura**。当render函数试图从这个二级指针里读取纹理高度时,它实际读取的是指针的内存地址值,而非纹理结构体里的真实数据,这就出现了那个离谱的超大数值。
  2. 对于渲染器参数:Wydruk_postaci的参数是SDL_Renderer **Renderer,意味着*Renderer才是真正的渲染器指针,但你传了&Renderer,同样传递了错误的指针层级。

修复代码示例

把所有render调用改成正确的参数传递方式:

// 原错误调用
render((*P).pozycjax, (*P).pozycjay, &(Bok[(*frame) / 4]), &Renderer, NULL);

// 修复后
render(P->pozycjax, P->pozycjay, Bok[(*frame) / 4], *Renderer, NULL);

(顺便提一句,用P->predkoscx代替(*P).predkoscx会让代码更简洁易读)

问题2:角色静止时无法显示

这个问题有两个潜在原因,先解决上面的参数错误后,再处理逻辑漏洞:

  1. 首先,上面的参数传递错误会导致即使静止时调用了render,也因为纹理/渲染器指针错误而无法渲染,修复第一个问题后可能就解决了一半。
  2. 其次,你的静止渲染逻辑有漏洞:position初始化为'F',但如果角色之前有过移动(比如向左、向右、向后),静止时position会保留最后一次移动的方向,而你只处理了position == 'F'的情况,其他方向的静止状态完全不会渲染。

修复静止渲染逻辑

完善代码,覆盖所有可能的方向状态:

if(P->predkoscx == 0 && P->predkoscy == 0) {
    switch(position) {
        case 'F':
            render(P->pozycjax, P->pozycjay, Przod[0], *Renderer, NULL);
            break;
        case 'B':
            render(P->pozycjax, P->pozycjay, Tyl[0], *Renderer, NULL);
            break;
        case 'S':
            // 这里建议额外记录最后一次的左右方向(比如加个变量last_dir_x)
            // 假设last_dir_x >0 是向右,<0是向左
            render(P->pozycjax, P->pozycjay, Bok[last_dir_x > 0 ? 0 : 1], *Renderer, NULL);
            break;
        default:
            // 兜底渲染正面,防止意外情况
            render(P->pozycjax, P->pozycjay, Przod[0], *Renderer, NULL);
            break;
    }
}

另外还要确保frame变量初始值为0,避免(*frame)/4超出纹理数组的索引范围(你的数组长度是2,要保证计算后索引不超过1)。

额外小建议

  • 检查render函数的参数定义,确保它接受的纹理参数是sTekstura*,渲染器参数是SDL_Renderer*,从根源上避免指针类型错误。
  • 可以给角色结构体加一个last_direction成员,专门记录最后一次移动的方向,这样静止时的方向判断会更可靠。

内容的提问来源于stack exchange,提问作者Maciej Król

火山引擎 最新活动