【问题标题】:Drawing a figure from an array of coordinates with C and SDL使用 C 和 SDL 从坐标数组中绘制图形
【发布时间】:2015-10-17 11:01:18
【问题描述】:

我正在尝试在 C 中绘制一个图形,并且我已经成功地做到了,但我想知道我这样做的方式是否让我难以实现我接下来想做的事情(使图移动/反弹)。

我在 main 中创建了一个 for 循环,它遍历一个坐标数组,然后再次调用一个函数,在它们之间画线并用颜色填充它。我想知道的是,这个for 循环是否是最好的方法?

我在 main 中做了这个 for 循环:

for(i = 0; i < SPHERE_NUMTRIANGLES; i++){
                    object = CreateObject(screen,&sphere_model[i],SPHERE_NUMTRIANGLES);
                    object->model->scale = 0.1f;
                    DrawObject(object);
                }

我试图绘制的 sphere_model 在表单上包含许多坐标:

  #define SPHERE_NUMTRIANGLES    478
triangle_t sphere_model[] = {
{
.x1=-1,
.y1=-500,
.x2=-1,
.y2=-489,
.x3=-1,
.y3=-500,
.fillcolor=0xeeeeee,
.scale=1.0
},

CreateObject 从 for 循环中获取模型

// Create new object
object_t *CreateObject(SDL_Surface *screen, triangle_t *model, int numtriangles)
{
        object_t *object;

        object = NULL;

        object = malloc(sizeof(object_t));
        object->model = malloc(sizeof(triangle_t) * numtriangles);
        object->screen = screen;
        object->ttl;
        object->speedx = 0;
        object->speedy = 1;
        object->model = model;
        object->model->scale;
        object->model->tx = 100;
        object->model->ty = 100;
        return object;
}

最后,DrawObject 只是调用了一个绘制三角形的函数

void DrawObject(object_t *object)
{
    DrawTriangle(object->screen,object->model);

} 

sphere_modelsphere_data.h 中,CreateObject 函数在triangle.c

我应该创建多个数字并将创建的数字添加到列表中,但我目前正在尝试只制作一个。 (这是作业,但我希望我能在这里得到一些帮助,我有点挣扎)

【问题讨论】:

  • 最好将编译程序所需的所有相关代码放入问题中。该链接可能会失效,从而无法供将来参考,或者某些用户可能无法轻松下载 tarball。请在问题中添加足够的代码,以制作一个最小的、可编译的、可运行的示例程序。
  • 好的,我现在已经输入了我认为需要的代码,我希望它足够了
  • 是的,看起来你可以理解你现在在做什么。好多了。

标签: c sdl


【解决方案1】:

...对我来说下一步我想做的事情很难(使人物移动/弹跳)。

我看到的是你分配对象,绘制它们然后忘记它们(我没有看到你释放内存)。然后,如果你想在不同的地方再次绘制模型,你将不得不再次循环,创建对象,绘制它们(然后忘记它们)。

也许最好记住创建的对象,这样您以后可以在重绘它们之前更改它们的坐标。举个例子:

typedef struct LIST {
    struct LIST *next;
    object_t *object;
};
struct LIST *pObjectList, *pList;

// create objects, draw them and save in list
pObjectList= pList= calloc(1,sizeof(struct LIST));

for(i = 0; i < SPHERE_NUMTRIANGLES; i++){
    object = CreateObject(screen,&sphere_model[i],SPHERE_NUMTRIANGLES);
    object->model->scale = 0.1f;
    DrawObject(object);
    pList->object= object;
    pList= pList->next= calloc(1,sizeof(struct LIST));
}
// offset the model with 50 pixels
pList= pObjectList;
while (pList->object) {
    pList->object.x1 += 50; pList->object.y1 += 50;
    pList->object.x2 += 50; pList->object.y2 += 50;
    pList->object.x3 += 50; pList->object.y3 += 50;
    pList= pList->next;
}
// redraw
pList= pObjectList;
for(i = 0; i < SPHERE_NUMTRIANGLES; i++, pList= pList->next)
{
    DrawObject(pList->object);
}

【讨论】:

  • 谢谢,我试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2017-12-11
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多