1

我试图SDL_Surface *通过使用SDL_FillRect()以下代码来覆盖一个内的小矩形:

        int display(SDL_Surface * screen, Uint16 tile_size){
            if (!screen)
                return 1;
            std::cout << x << " " << y << std::endl;
            SDL_Rect pos = {(Sint16) (x * tile_size), (Sint16) ((y - 2) * tile_size), tile_size, tile_size};
            std::cout << pos.x << " " << pos.y << std::endl;
            for(uint8_t Y = 0; Y < 4; Y++){
                pos.x = x * tile_size;
                for(uint8_t X = 0; X < 4; X++){
//                    bit mask check to see which bits should be displayed. 
//                    not relevant to question
//                    if (shape[orientation][Y] & (1U << (3 - X))){
                        std::cout << pos.x << " " << pos.y << " -> ";
                        SDL_FillRect(screen, &pos, color);
                        std::cout << pos.x << " " << pos.y << std::endl;
//                    }
                    pos.x += tile_size;
                }
                pos.y += tile_size;
            }
            std::cout << std::endl << std::endl;
            return 0;
        }

x 范围从 0 到 9,y 范围从 0 到 21,tile_size 很小(现在是 25)。

运行此代码时,输​​出如下:

3 0                             // x y
75 -50                          // x*tile_size y*tile_size
75 -50 -> 75 0                  // what in the world?
100 0 -> 100 0
125 0 -> 125 0
150 0 -> 150 0
75 25 -> 75 25
100 25 -> 100 25
125 25 -> 125 25
150 25 -> 150 25
75 50 -> 75 50
100 50 -> 100 50
125 50 -> 125 50
150 50 -> 150 50
75 75 -> 75 75
100 75 -> 100 75
125 75 -> 125 75
150 75 -> 150 75

第三行(第一个显示的矩形)以某种方式从 -50 移动到 0。它正在抛出我的显示计算。怎么了?我错过了一些明显的东西吗?

4

1 回答 1

3

我在查看文档时看到了这一点:“如果在目标上设置了一个剪辑矩形(通过设置SDL_SetClipRect),那么这个函数将根据剪辑矩形和dstrect矩形的交集进行剪辑,并且dstrect矩形将被修改为表示实际填满的区域。”

这表明存在导致问题的剪辑矩形。

该剪辑矩形是包含在您的 中的一个属性SDL_Surface,并且可能从 (0,0) 开始。这将使任何负数在SDL_FillRect()调用后变为 0。

您可以通过传递对dstrect.

来源:http ://www.libsdl.org/docs/html/sdlfillrect.html

于 2013-01-02T15:37:15.153 回答