C++ 我的程序显示空曲面,需要在其中显示地图
我对SDL有问题。如您所见,我有3个文件:include.h、map.h、source.cpp 在include.h中,我包含了所有库。 在map.h中,我编写了一个类:getTileID读取一张图片并将其切片为平铺,getTilePosition读取.txt文件,drawMap函数生成一个曲面,将切片的曲面平铺分配给文本文件中的id值 然后,在source.cpp中,我初始化SDL、SetVideoMode并创建一个类a。然后,我调用类a函数。调用它后,将一个.mapSurface[0]变量输入屏幕并翻转它 什么也没发生。屏幕加载,并且,正如我所想,它会在空曲面上翻转,但它需要显示mapSurface变量 请帮忙C++ 我的程序显示空曲面,需要在其中显示地图,c++,visual-c++,sdl,C++,Visual C++,Sdl,我对SDL有问题。如您所见,我有3个文件:include.h、map.h、source.cpp 在include.h中,我包含了所有库。 在map.h中,我编写了一个类:getTileID读取一张图片并将其切片为平铺,getTilePosition读取.txt文件,drawMap函数生成一个曲面,将切片的曲面平铺分配给文本文件中的id值 然后,在source.cpp中,我初始化SDL、SetVideoMode并创建一个类a。然后,我调用类a函数。调用它后,将一个.mapSurface[0]变量输
//include.h
//----------------------------------------------------------------------------------------------------
#include "headers\SDL.h"
#include "headers\SDL_image.h"
//----------------------------------------------------------------------------------------------------
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL_image.lib")
//----------------------------------------------------------------------------------------------------
#include <string>
#include <fstream>
//----------------------------------------------------------------------------------------------------
#include "map.h"
看起来您正在将地图绘制到
map::mapSurface[0]
,但此曲面从未绘制到屏幕上。b在drawMap
之后,将临时曲面绘制到屏幕上,或者直接绘制到屏幕上。你不需要循环什么的?我只需要知道,我做错了什么,因为它显示了一个emty曲面…方法IMG_Init(IMG_Init PNG)
和IMG_Quit()
我认为你应该在Map::Map()中调用它
和地图::~Map
respectively@rkmax两个版本都可以。但是,我认为最好使用SDL在main
中初始化它。这样,您就不必担心它当前是否已初始化。嗯。。这些线不都是screen=A.mapSurface[0];SDL_翻转(屏幕);更新屏幕?因为这是我第一次上课……不。您必须在从SDL\u SetVideoMode
接收到的曲面上调用SDL\u Flip
。没有办法让屏幕上出现其他表面。所以我已经按照你说的改变了主要功能。现在它显示了一些东西,但不是我想要的。它显示了一些灰色的颜色,这些颜色不在我的图像中。。。有什么想法吗<代码>#include“./libraries/include.h”int main(int argc,char*argv[]){if(SDL_Init(SDL_Init_EVERYTHING)!=NULL)退出(0);SDL_Surface*屏幕;屏幕=SDL_SetVideoMode(1024768,32,SDL_表面| SDL| DOUBLEBUF);映射A;A.getTileID(“map.png”);A.getTilePosition(“map.txt”);A.drawMap();lbliutsurface[0],NULL屏幕;SDL_翻转(屏幕);SDL_自由曲面(屏幕);SDL_退出();返回0;}
//map.h
//----------------------------------------------------------------------------------------------------
#pragma once
//#include "include.h"
//----------------------------------------------------------------------------------------------------
class map
{
public:
//----------------------------------------------------------------------------------------------------
map(void);
~map(void);
void getTileID(const char* mapFile);
void getTilePosition(std::string mapFile);
void drawMap();
//----------------------------------------------------------------------------------------------------
static const short int TILEMAP_WIDTH = 24;
static const short int TILEMAP_HEIGHT = 24;
static const short int TILE_WIDTH = 32;
static const short int TILE_HEIGHT = 32;
SDL_Surface* tileID[1025];
short int mapWidth;
short int mapHeight;
short int mapID[2][500][500];
short int graphicLayer;
SDL_Surface* mapSurface[5];
};
//----------------------------------------------------------------------------------------------------
map::map(void)
{
}
map::~map(void)
{
}
//----------------------------------------------------------------------------------------------------
void map::getTileID(const char* mapFile)
{
IMG_Init(IMG_INIT_PNG);
SDL_Surface *tileMap;
tileMap = IMG_Load(mapFile);
if(tileMap == NULL)
{
exit(1);
}
for(short int i = 0; i < map::TILEMAP_WIDTH * map::TILEMAP_HEIGHT + 1; i++)
{
map::tileID[i] = (SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SRCALPHA, map::TILE_WIDTH, map::TILE_HEIGHT, 32, 0, 0, 0, 0));
if(map::tileID[i] == NULL)
{
exit(2);
}
}
tileID[0] = NULL;
short int id = 1;
for(short int c = 0; c < map::TILEMAP_WIDTH; c++)
{
for(short int r = 0; r < map::TILEMAP_HEIGHT; r++)
{
short int sliceX = c * map::TILE_WIDTH;
short int sliceY = r * map::TILE_HEIGHT;
SDL_Rect srcRect;
srcRect.x = sliceX;
srcRect.y = sliceY;
srcRect.w = map::TILE_WIDTH;
srcRect.h = map::TILE_HEIGHT;
SDL_Rect dstRect;
dstRect.x = 0;
dstRect.y = 0;
dstRect.h = 32;
dstRect.w = 32;
if(SDL_BlitSurface(tileMap, &srcRect, map::tileID[id], &dstRect) != NULL)
exit(3);
id++;
}
}
SDL_FreeSurface(tileMap);
IMG_Quit();
}
//----------------------------------------------------------------------------------------------------
void map::getTilePosition(std::string mapFile)
{
std::string
tag,
objType[10];
short int
l = 0;
float
objX[10],
objY[10],
objWidth[10],
objHeight[10];
std::ifstream data(mapFile);
while(!data.eof())
{
getline(data, tag);
if(tag == "[header]")
{
data.ignore(256, '=');
data >> map::mapWidth;
data.ignore(256, '=');
data >> map::mapHeight;
data.ignore(256, '\n');
}
map::graphicLayer = 0;
if(tag == "[layer]")
{
data.ignore(256, '\n');
data.ignore(256, '\n');
for(short int c = 0; c < map::mapHeight; c++)
{
for(short int r = 0; r < map::mapWidth; r++)
{
data >> map::mapID[map::graphicLayer][c][r];
}
}
map::graphicLayer++;
data.ignore(256, '\n');
}
if(tag.substr(0, 7) == "[object")
{
objType[l] = tag.substr(8, tag.size() - 9);
data.ignore(256, '\n');
data.ignore(256, '\n');
data.ignore(256, '=');
data >> objX[l] >> objY[l] >> objWidth[l] >> objHeight[l];
l++;
data.ignore(256, '\n');
}
}
data.close();
}
//----------------------------------------------------------------------------------------------------
void map::drawMap()
{
map::mapSurface[0] = (SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SRCALPHA, 3200 ,3200 , 32, 255, 255, 255, 0));
for(short int gl = 0; gl < map::graphicLayer; gl++)
{
for(short int c = 0; c < map::mapWidth; c++)
{
for(short int r = 0; r < map::mapHeight; r++)
{
for(short int id = 0; id < map::TILEMAP_WIDTH * map::TILEMAP_HEIGHT; id++)
{
if(map::mapID[gl][c][r] == id)
{
SDL_Rect dstRect;
dstRect.x = c * map::TILE_WIDTH;
dstRect.y = r * map::TILE_HEIGHT;
if(SDL_BlitSurface(map::tileID[id], NULL, map::mapSurface[gl], &dstRect) != NULL)
exit(4);
}
}
}
}
}
}
//source.cpp
//----------------------------------------------------------------------------------------------------
#include "../libraries/include.h"
//----------------------------------------------------------------------------------------------------
int main(int argc,char *argv[])
{
if(SDL_Init(SDL_INIT_EVERYTHING) != NULL)
exit(0);
SDL_Surface *screen;
screen = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
map A;
A.getTileID("map.png");
A.getTilePosition("map.txt");
A.drawMap();
screen = A.mapSurface[0];
SDL_Flip(screen);
SDL_Delay(1000);
SDL_FreeSurface(screen);
SDL_Quit();
return 0;
}