C ++针对初学者到SDL的消除锯齿线

时间:2013-08-11 15:51:14

标签: c++ line sdl antialiasing

原始问题:

  

在面试之前我被问过了解如何   使用C或C ++在帧缓冲区中绘制抗锯齿线。我没有   使用C,自从上次使用C ++以来,我已经有几年了。我是一个   完成初学者的图形。我的C ++经验有   主要是简单的命令行程序和排序方法。该   公司不在乎我是否在线抓取代码,他们要我   理解它,但仍然有一个可行的可执行文件。

     

我使用this tutorial在MS VC ++ 2012中设置SDL库   快速,this algorithm用于实际的抗锯齿。我有   虽然我现在有很好的理解算法   无法让它编译。我只想绘制一条线,并且   然后我可以继续将代码设置为骨架类   定义我给了。这就是我所包含的内容   在该页面上使用算法:

#include <cmath>
#include <math.h>
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "SDL.h"

const double HEIGHT = 240;
const double WIDTH = 320;
const double X0 = 25.6;
const double X1 = 64.7;
const double Y0 = 30;
const double Y1 = 42;

int round(double number)
{
    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}

void main()
{
  Uint32 pixelColor = 00000000000000000000000000000000;

  SDL_Surface* myScreen = SDL_CreateRGBSurface(SDL_ALPHA_OPAQUE,WIDTH,HEIGHT,32, 0x000000FF,
     

0x0000FF00,0x00FF0000,0xFF000000);

  WULinesAlpha(X0, X1, Y0, Y1,pixelColor,myScreen);

  return;
}
     

我收到以下错误:

     

错误21错误LNK2019:未解析的外部符号_SDL_main   在函数_main中引用错误22错误LNK1120:1未解析   的外部

     

我看过几个代码示例,说主要功能必须看   像这样:

int main(int argc, char *argv[])
{
}
     

同样,我不熟悉图形内容,所以我知道我的主要功能   可能非常错误;我期待着一些摇头。有人可以   解释发生了什么/我需要做什么?

新:

我现在用以下代码替换了我的主要功能,基于NomNomNom069的YouTube视频:“C ++ SDL教程2创建屏幕并处理基本输入”

#include "SDL.h"

int main(int argc, char * args[])
{
    bool running = true;
    //initialize SDL
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        running = false;
    }

    //set up screen
    SDL_Surface *screen;

    screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE);

    if (screen == NULL)
    {
        running = false;
    }

    SDL_Event occur;

    //main application loop
    while (running)
    {
        SDL_PollEvent(&occur);

        if (occur.type == SDL_QUIT)
        {
            running = false;
        }

        //drawing occurs here
        SDL_FillRect(screen, NULL, 0);
        SDL_Flip(screen);
    }

    //quit SDL
    SDL_Quit();

    return 0;
}

没有错误,我会弹出一个窗口。真棒。

我现在的问题是如何/在哪里拨打WuLinesAlpha。此函数需要4 double s,Uint32变量和SDL_Surface*。我有double个帖子,我将Uint32设置为0x000000FF,我认为我设置为SDL_Surface的{​​{1}}是传入的screen

我玩弄了WuLinesAlpha函数调用的位置,并且我一直在黑屏上。我认为,正如视频中所解释的那样,它会进入循环但没有发生任何事情。是否还有我应该调用的SDL命令?

1 个答案:

答案 0 :(得分:0)

首先修复您的main声明。这确实需要int main(int argc, char *argv[])。特别是在Windows上,因为我认为SDL.h实际上会将您的main重命名为其他名称,并为图书馆本身接管main

接下来,确保正确链接SDL。在我自己的基于SDL 1.2.x的项目中,我在Makefile中有这些行:

SDL_CFLAGS := $(shell sdl-config --cflags)
SDL_LFLAGS := $(shell sdl-config --libs)

然后,我将这些标记附加到我的实际CFLAGSLFLAGS。请注意,如果您使用makeMakefile,则希望在:=使用make,否则$(shell ...)每次展开时都会调用$(CFLAGS)命令{{ 1}}。

我无法帮助您设置Microsoft的GUI产品。对于稍微旧一些的MSVC产品(2010),本教程看起来相当不错,可能会让您走上正确的轨道:http://lazyfoo.net/SDL_tutorials/lesson01/windows/msvsnet2010e/index.php

最后,不要忘记在某个时刻致电SDL_Init(),最好在开始创建表面之前。

祝你好运!