【问题标题】:Tiling System C++ SDL平铺系统 C++ SDL
【发布时间】:2013-02-17 13:45:21
【问题描述】:

我一直在为我通过 C++ 和 SDL 设计的视频游戏开发平铺系统。代码大致基于lazyfoo.net 上提供的教程,但使用不同的系统将图块绘制到屏幕上。代码的工作方式如下:我有一个名为Map 的类,它创建另一个名为Tile 的类的数组。它还有一个名为set_tiles 的函数,它从.map 文件中读取数字并使用两个for 循环将它们复制到tile 的数组中;一个用于 x,一个用于 y。然后我根据Tile 的特定变量将每个表面blit 到一个临时贴图。以下是实际代码:

地图.cpp

SDL_Surface* Map::set_tiles ( SDL_Surface* tile_image ) {
Setup setup;

SDL_Surface* temp_map = NULL;

//Open the map
std::ifstream map ( "Test.map" );

//Catch any errors
if ( map.fail() ) return NULL;

//Initialize the tiles
for ( int y = 0; y < MAP_HEIGHT / TILE_HEIGHT; y++ ) {
    for ( int x = 0; x < MAP_WIDTH / TILE_WIDTH; x++ ) {
        //Determines the tile type
        int tile_type = -1;

        //Read the tile type from the map
        map >> tile_type;

        //Make sure it's a real tile
        if ( tile_type < 0 || tile_type >= TILE_SPRITES ) {
            map.close();
            return NULL;
        }

        //Error check for the .map file
        if ( map.fail() ) {
            map.close();
            return NULL;
        }

        //Add the tile to the array
        tile_array[x][y] = &Tile ( x, y, tile_type );

        //Create the temp. image crop
        SDL_Rect* temp_crop = &tile_array[x][y]->get_crop();

        //Check for crop errors
        if ( ( temp_crop->h || temp_crop->w ) == 0 ) return NULL;

        //Edit the temp. map
        setup.apply_surface ( x * TILE_WIDTH, y * TILE_HEIGHT, tile_image, temp_map, temp_crop );
    }
}

map.close();

//Return the modified map
return temp_map;

}

平铺.cpp

Tile::Tile ( int x, int y, int tile_type ) {
//Get the offsets
box.x = x;
box.y = y;

//Set the collision box
box.w = TILE_WIDTH;
box.h = TILE_HEIGHT;

//Get the tile type
type = tile_type;

//Choose the crop option
crop.w = TILE_WIDTH;
crop.h = TILE_HEIGHT;

switch ( tile_type ) {
case TILE_RED:
    crop.x = 0 * TILE_WIDTH;
    crop.y = 0 * TILE_HEIGHT;
    break;
case TILE_GREEN:
    crop.x = 1 * TILE_WIDTH;
    crop.y = 0 * TILE_HEIGHT;
    break;
case TILE_BLUE:
    crop.x = 2 * TILE_WIDTH;
    crop.y = 0 * TILE_HEIGHT;
    break;
case TILE_CENTER:
    crop.x = 3 * TILE_WIDTH;
    crop.y = 0 * TILE_HEIGHT;
    break;
case TILE_TOP:
    crop.x = 0 * TILE_WIDTH;
    crop.y = 1 * TILE_HEIGHT;
    break;
case TILE_TOPRIGHT:
    crop.x = 1 * TILE_WIDTH;
    crop.y = 1 * TILE_HEIGHT;
    break;
case TILE_RIGHT:
    crop.x = 2 * TILE_WIDTH;
    crop.y = 1 * TILE_HEIGHT;
    break;
case TILE_BOTTOMRIGHT:
    crop.x = 3 * TILE_WIDTH;
    crop.y = 1 * TILE_HEIGHT;
    break;
case TILE_BOTTOM:
    crop.x = 0 * TILE_WIDTH;
    crop.y = 2 * TILE_HEIGHT;
    break;
case TILE_BOTTOMLEFT:
    crop.x = 1 * TILE_WIDTH;
    crop.y = 2 * TILE_HEIGHT;
    break;
case TILE_LEFT:
    crop.x = 2 * TILE_WIDTH;
    crop.y = 2 * TILE_HEIGHT;
    break;
case TILE_TOPLEFT:
    crop.x = 3 * TILE_WIDTH;
    crop.y = 2 * TILE_HEIGHT;
    break;
}

}

问题是set_tiles在被调用时返回一个NULL指针。通过一些调试,我发现它一直到最后,然后返回一个 NULL,它不会在 for 循环中的某个地方执行此操作。我还尝试将所有 tilecrop.x 和 y 设置为 0,只是为了看看它是否会起作用,但它不起作用。

注意 问题不在于我的图像或 .map 文件。 我觉得我对指针的理解可能有点错误,可能是我调用apply_surface的时候搞错了。

Setup.cpp

void Setup::apply_surface ( int x, int y, SDL_Surface* source, SDL_Surface* &destination, SDL_Rect* clip ) {
//Temporary rectangle to hold the offsets
SDL_Rect offset;

//Get the offsets
offset.x = x;
offset.y = y;

//Blit the surface
SDL_BlitSurface ( source, clip, destination, &offset );

}

【问题讨论】:

  • Setup 类在哪里定义?除非 apply_surface 函数将 SDL_Surface 指针的引用作为其第 4 个参数(即 SDL_Surface*&amp;),否则此函数中不会更改 temp_map 从其初始化为 NULL 指针。
  • 谷歌搜索“apply_surface”将我带到this,但在这种情况下,它不是一个类的成员。如果您从那里获得代码,并且只是将其封装在一个名为 Setup 的类中而不更改参数类型,那么是的,您在调用 apply_surface 时犯了一个错误。
  • Good Google fu - 我删除了我的答案。我对某些东西的假设是错误的。
  • 你建议我做什么,本?老实说,我什至不明白你的抱怨。我有另一个名为Hero 的类,它的功能可以很好地将英雄打印到屏幕上。
  • 我请你介绍Setup 课程,因为我不知道它是什么。它不是 SDL 的一部分。

标签: c++ sdl


【解决方案1】:

SDL_BlitSurface 将一个表面传送到另一个表面。它们都必须初始化,否则函数什么也不做。您正在向它传递一个 NULL 指针。您需要调用 SDL_CreateRGBSurface 之类的东西来初始化指针。

【讨论】:

  • 这很有意义。我做了一些研究,发现了如何使用SDL_CreateRGBSurface。它不再返回 NULL。但是,它仍然没有返回我想要的图像。一定是哪里出了问题。
  • @JimHurley:我不怀疑,但请每个帖子一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多