SDL中由SDL_Rect向量分割曲面的问题
Problems blitting surface in SDL from vector of SDL_Rect
#include "main.h"
SDL_Surface* screen; //The screen Surface
SDL_Surface* Snake_Body; //The snake surface (shape to draw)
SDL_Rect rectangle1; //Red border
SDL_Rect rectangle2; //Black Board
SDL_Event event; //Keyboard handling
direction facing;
std::vector<SDL_Rect> snake (3); //Snake body locations
SDL_Surface *LoadSnake()
{
SDL_Surface* temporary;
Uint32 rmask,gmask,bmask,amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
temporary = SDL_CreateRGBSurface(SDL_SWSURFACE,5,5,32,rmask,gmask,bmask,amask); //Make an empty surface
SDL_FillRect(temporary,NULL,SDL_MapRGB(screen->format,0,255,0)); //Fill it with color
return temporary; //return it
}
bool init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == -1 )
return false;
screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE);
if(!screen)
return false;
SDL_WM_SetCaption("Snake v0.1",NULL);
Snake_Body = LoadSnake();
rectangle1.x = 0; //Red border
rectangle1.y = 0;
rectangle1.w = 500;
rectangle1.h = 500;
rectangle2.x = 25; //Black background
rectangle2.y = 25;
rectangle2.w = 450;
rectangle2.h = 450;
return true;
}
SDL_Surface *loadImage(const char* filename)
{
SDL_Surface *loadedImage = NULL;
SDL_Surface *optimizedImage = NULL;
loadedImage = SDL_LoadBMP(filename);
if (loadedImage)
{
optimizedImage = SDL_DisplayFormat(loadedImage);
SDL_FreeSurface(loadedImage);
}
return optimizedImage;
}
void pollInput()
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT)
{
end = true;
}
if(event.type == SDL_KEYUP)
{
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
end = true; break;
case SDLK_UP:
facing = up; break;
case SDLK_DOWN:
facing = down; break;
case SDLK_RIGHT:
facing = right; break;
case SDLK_LEFT:
facing = left; break;
}
}
}
}
void Update()
{
for(unsigned int i = 1; i < snake.size(); i++)
{
snake[i] = snake[i-1];
}
switch(facing)
{
case up:
snake[0].y -= 5; break;
case down:
snake[0].y += 5; break;
case left:
snake[0].x -= 5; break;
case right:
snake[0].x += 5; break;
}
}
void SetUp()
{
snake[0].x = 250;
snake[0].y = 250;
snake[1].x = 250 + 15;
snake[1].y = 250;
snake[2].x = 250 + 15 + 15;
snake[2].y = 250;
}
void Draw()
{
unsigned short i;
int x;
SDL_FillRect(screen,&rectangle1,SDL_MapRGB(screen->format,255,0,0)); //Red Border
SDL_FillRect(screen,&rectangle2,SDL_MapRGB(screen->format,0,0,0)); //Black Board
for(i = 0; i < snake.size(); i++)
{
assert(SDL_BlitSurface(Snake_Body,NULL,screen,&snake[i]) == 0);
}
SDL_Flip(screen);
}
void Finish()
{
SDL_FreeSurface(Snake_Body);
SDL_Quit();
}
我有这个代码,这是一个游戏的蛇写在SDL我正在工作,然而,我似乎有一个问题。
SDL可以很好地绘制背景,但是由于某些原因它不能绘制蛇。我在那里设置了一个断言来检查SDL_BlitSurface函数是否成功,并且它返回一个正常值(0),即使屏幕上没有显示任何内容。
我将蛇节点的纹理设置为单个绿色矩形Snake_Body,并将需要在std::vector容器中绘制的位置编码,因此我可以在向量中的每个元素上调用SDL_BlitSurface()函数,我已经跟踪了值,它们正在正确地变化,但出于某种原因,图像仍然没有绘制。我还尝试用相同位置的SDL_FillRect()替换我的SDL_BlitSurface()函数,但它不会改变任何东西。
编辑:我在下面添加了我的主循环:
#include "main.h"
bool end = false;
Uint32 time;
int main(int argc,char* argv[])
{
if(!init())
return 1;
SetUp();
time = SDL_GetTicks();
while(!end)
{
if(time+1000<SDL_GetTicks())
{
Update();
time = SDL_GetTicks();
}
pollInput();
Draw();
}
Finish();
return 0;
}
你似乎没有对蛇的位置做任何边界检查,以确保它留在屏幕上。所以当它离开屏幕时,它保持关闭,永远不会回来。我的猜测是你没有正确地调节帧率,或者你根本没有调节它(我需要看到你的主循环),所以蛇离开屏幕的速度如此之快,以至于你甚至都看不到它。
如果不调用Update
函数会发生什么?
如果你张贴了整个代码,那么有一个调用SetUp缺失。这不会设置蛇,它可能在屏幕外的某个地方,因为矢量包含垃圾。此外,尽管SDL_BlitSurface忽略了直街宽度和高度,但最好将它们初始化为一些有意义的值。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- OpenCascade:从 IGES 读取修剪曲面
- CGAL:如何创建填充边界曲线的曲面网格?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何从 3D 曲面网格中删除自相交三角形?
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL在析构函数上释放曲面失败
- 纹理的SDL Renderer参数,但曲面不需要
- C++/SDL:矢量/曲面问题
- SDL中由SDL_Rect向量分割曲面的问题
- 未初始化就使用SDL曲面错误
- 释放有效的SDL曲面会导致分段故障