c - CSFML 意外重复纹理行为
问题描述
我正在开发一个 CSFML 2d 跑步者游戏项目,并希望实现一些视差来给玩家一个速度印象。为此,我希望通过 sfTexture_setRepeated 重复一些资产,但唉。它不会重复它们,它将边界像素扩展到我出于某种我不知道的原因设置的精灵矩形的大小。
以下是关于我正在尝试做的事情的片段:
runner_objects.h
包含在 runner_objects.c 中
typedef enum {
PLAYER ,
OBSTACLE ,
BACKGOUND1 ,
BACKGOUND2 ,
OBJ_COUNT
} objtype_t;
static const char *texture[OBJ_COUNT] = {
"res/undefined.png" ,
"res/undefined.png" ,
"res/bg_clouds.png" ,
"res/bg_mountain.tga" ,
};
static const sfIntRect rect[OBJ_COUNT] = {
{0, 0, 0, 0} ,
{0, 0, 0, 0} ,
{0, 0, 1920*3, 1080} ,
{0, 0, 1920*2, 1080} ,
};
typedef struct object {
// Properties
objtype_t type;
sfTexture *texture;
sfSprite *sprite;
sfIntRect rect;
sfVector2f pos;
// Linked listing
struct object *next;
} obj_t;
runner_objects.c
// Macros like TE_CREATE etc are simply CSFML functions made
// shorter to respect a strict 80 columns limit.
// TE_ = sfTexture, S_ = sfSprite
...
obj_t *object_create (objtype_t type, sfVector2f pos)
{
obj_t *new_obj = malloc(sizeof(obj_t));
if (!new_obj)
return NULL;
new_obj->texture = TE_CREATE_WHOLE(texture[type]);
new_obj->sprite = S_CREATE;
if (!new_obj->texture || !new_obj->sprite)
return object_destroy(&new_obj); // Destroys existing parts and returns NULL
new_obj->type = type;
new_obj->rect = rect[type];
new_obj->pos = pos;
S_SETTEXTURE(new_obj->sprite, new_obj->texture);
if (type == BACKGOUND2 || type == BACKGOUND1)
TE_SETREPREATED(new_obj->texture, true);
S_SETINTRECT(new_obj->sprite, new_obj->rect);
S_SETPOS(new_obj->sprite, new_obj->pos);
new_obj->next = NULL;
return new_obj;
}
...
runner_env.c
我在哪里设置游戏环境
...
// This function is called by int env_create(env_t **env) which is called
// from my main with the address of my env struct pointer.
int env_create_background(env_t **env)
{
(*env)->objects = object_create(BACKGOUND2, (sfVector2f) {0 , 0});
if (!(*env)->objects)
return mr_puterr(ERR_CREABG); // Puts an error string on STDERR and returns corresponding error code
(*env)->objects->speed = (sfVector2f) { 0, 0 };
(*env)->objects->next = object_create(BACKGOUND1, (sfVector2f) {0 , 0});
if (!(*env)->objects->next)
return mr_puterr(ERR_CREABG);
(*env)->objects->next->speed = (sfVector2f) { 0, 0 };
return NO_ERR;
}
// I know it's very ugly and I'll make an actual linked
// list constructor later this is just for testing for now.
...
如果你好奇的话,我的 env_t 结构包含这些。
typedef struct environment {
sfRenderWindow *window;
sfClock *clock;
sfEvent *evt;
obj_t *objects;
} env_t;
现在对这个问题进行直观的解释。
那么我做错了什么?我错过了什么 ?有没有办法或命令来设置这个我可能搞砸了?
解决方案
好吧,我只是个白痴,我TE_SETREPEATED
使用了宏sfTexture_setSmooth
。我觉得很笨。
推荐阅读
- javascript - 计算对象属性的百分比
- json - 严格的 JSON 解析
- sql - 更改 Sql Server 列排序规则无效
- html - HTML 预览未正确显示
- python - 如何在数据框中查找和添加字符串?如果一列中的行尾没有“数字”或BB或BB,我需要在最后添加BB
- python - 如何将字典的键用作熊猫数据框列?
- java - 在使用 Maven 构建的 Swing 应用程序中运行 JavaFx 时缺少 SwingInterOpUtils
- r - 在 R 中找不到任何包的文档
- react-hooks - 我们如何通过多次触发来测试一个带有 useEffect 且内部没有返回值的 customHook?
- java - 如何在将csv字段解析为java对象之前进行类型转换