gpt4 book ai didi

c++ - 读取指向类的二维指针数组

转载 作者:行者123 更新时间:2023-11-28 03:22:43 25 4
gpt4 key购买 nike

我正在设计一个非常简单的视频游戏来帮助学习使用 SDL。我遇到了碰撞检测的问题。为了绘制游戏 map (使用图 block ),我在名为 Map 的类中创建了一个指向名为 Tile 的类的二维指针数组。 Map 类有一个名为 set_tiles 的函数,它通过从 .MAP 文件中读取来定义所有图 block 。我还有一个名为 Hero 的类,其中包含关于英雄的所有函数和变量。一切都很琐碎。但是,当我尝试从其他任何地方读取数组时,它会产生奇怪的结果(通过错误测试我发现 x 和 y 值相差数千,但我可能在那里犯了一个错误)。这是代码。

SDL_Surface* Map::set_tiles ( SDL_Surface* tile_image ) {

Setup setup;

//Make a temporary map to draw the tiles to
Uint32 rmask, gmask, bmask, amask;
if ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) {
rmask = 0x00000000;
gmask = 0x00000000;
bmask = 0x00000000;
amask = 0x00000000;
}
else {
rmask = 0x00000000;
gmask = 0x00000000;
bmask = 0x00000000;
amask = 0x00000000;
}
SDL_Surface* temp_map = SDL_CreateRGBSurface(SDL_SWSURFACE, MAP_WIDTH, MAP_HEIGHT, 32, rmask, gmask, bmask, amask);

//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();

//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;

}

现在,如果我尝试在其他地方阅读它,就会遇到问题。即

bool Hero::collision_check ( Map map ) {
for ( int y = 0; y < MAP_HEIGHT / TILE_HEIGHT; y++ ) {
for ( int x = 0; x < MAP_WIDTH / TILE_WIDTH; x++ ) {
Tile* tile = map.tile_array[x][y];
if ( collision ( box, tile->get_box() ) ) {
//Switch the effect based on the tile type
switch ( tile->get_type() ) {
case TILE_RED:
case TILE_GREEN:
case TILE_BLUE:
return false;
break;
case TILE_CENTER:
case TILE_TOP:
case TILE_TOPRIGHT:
case TILE_RIGHT:
case TILE_BOTTOMRIGHT:
case TILE_BOTTOM:
case TILE_BOTTOMLEFT:
case TILE_LEFT:
case TILE_TOPLEFT:
return true;
break;
default:
return false;
}
}
}
}
return false;
}

在指针(或大多数其他方面)方面,我不是大师。是否有任何明显的缺陷可以解释我的问题?

最佳答案

在行中

tile_array[x][y] = &Tile ( x, y, tile_type );

您正在将临时地址分配给您的 vector 。该表达式一结束,临时对象就会被销毁,您保存的指针现在指向一个无效对象。我不会存储指向 Tile 对象的指针,而是将 tile 对象本身存储在 tile_array 中。

关于c++ - 读取指向类的二维指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com