Allegro 5를 사용하여 C++에서 Visual Studio 2017로 게임을 만들기 시작했습니다. 이미지를 더 쉽게 관리 할 수 있도록 ImageLoader 클래스를 만들었습니다.이 클래스는 모든 활성 이미지를 만들고 필요에 따라 이미지를 파괴하십시오. 파일 이름을 해당 이미지와 일치시키는 맵을 사용합니다. 현재 내 주() 코드는 다음과 같습니다Allegro 5 : 표준 맵에 비트 맵을 저장하는 데 문제가 있습니다
이int main(){
if (!al_init()) {
al_show_native_message_box(NULL, NULL, NULL, "Could not intialize allegro 5.", NULL, NULL);
return -1;
}
ALLEGRO_DISPLAY *display = al_create_display(DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT);
al_set_window_title(display, "Game title");
// make usre the display was created correctly
if (!display) {
al_show_native_message_box(display, "Title", "settings", "Could not create Allegro window.", NULL, NULL);
}
// intialize fonts, primitives, keyboard,etc.
al_init_font_addon();
al_init_ttf_addon();
al_init_primitives_addon();
al_install_keyboard();
if(!al_init_image_addon()) {
al_show_native_message_box(display, "Error", "Error", "Failed to initialize al_init_image_addon!",
NULL, ALLEGRO_MESSAGEBOX_ERROR);
return -1;}
ImageLoader image_loader;
이하여 ImageLoader 다음 플레이어에 대한 이미지로드 :
ALLEGRO_BITMAP *image = al_load_bitmap(filename);
if (image == NULL) {
std::cout << filename << std::endl;
std::cout << "loader failed to load image" << std::endl;
}
image_map[filename] = image;
나는이 부분을 테스트
, 작동하는 것 같다을, 이미지 그대로 null이 아닙니다. 그 image_map는 ImageLoader.h 년과 같이 선언 참고 : 항상for (GameImage image : imageList) {
ALLEGRO_BITMAP *draw_image = image_loader.get_current_image(image);
if (draw_image == NULL) {
//TODO: error handling
std::cout << "no image" << std::endl;
}
else
al_draw_bitmap(draw_image, image.get_x(), image.get_y(), NULL);
}
내 체크 쇼 : 나는 다음하여 ImageLoader에서 이미지를 얻을 때
std::map<const char *, ALLEGRO_BITMAP*> image_map;
문제는 내 주요 게임 루프에서 발생 draw_image
은 null입니다. 내가 테스트 한
ALLEGRO_BITMAP * ImageLoader::get_current_image(GameImage image)
{
return image_map[image.get_image_filename()];
}
가 나는 이미지를로드하고 if (image_map.find(image.get_image_filename()) == image_map.end())
을 확인하여지도에 저장하지만,이 false를 반환하더라도 때 여기에 같은 파일 이름을 사용하고 있는지 확인하기 위해 다음과 같습니다 get_current_image의 코드는 ALLEGRO_BITMAP 포인터가 여전히 널입니다. 포인터 대신 비트 맵 맵 스토어를 만들려고했는데 이렇게 맵 값을 수정할 수 없기 때문에 맵에 요소를 추가하려고하면 오류가 발생합니다. 왜 내가이 포인터를 설정 한 시간과 내가 검색 한 시간 사이에이 포인터가 null이 될 수 있습니까? 또한 비트 맵을 저장하는 방법에 대한 다른 제안도 열려 있습니다.
편집 : 파일 배열의 인스턴스를 char 배열로 std :: strings로 변경하여 프로젝트를 수정했습니다. 이미지 맵은 이제 ImageLoader.h에 std::map<std::string, ALLEGRO_BITMAP*> image_map
으로 선언되었으며 GameImage에 저장된 파일 이름은 이제 std::string image_filename
입니다. ImageLoader.cpp에서 load_image
이제 다음과 같습니다
ALLEGRO_BITMAP *image = al_load_bitmap(filename.c_str());
if (image == NULL) {
std::cout << filename << std::endl;
std::cout << "loader failed to load image" << std::endl;
}
image_map[filename] = image;
마지막으로, get_current_image
는 여전히 동일합니다 :
ALLEGRO_BITMAP * ImageLoader::get_current_image(GameImage image)
{
return image_map[image.get_image_filename()];
}
그러나, 동일한 문제가 지속. 또한 이미지 맵의 크기를 확인한 후 내 프로그램 기간 동안 키로 삽입 한 이미지의 파일 이름과 비트 맵에 대한 null이 아닌 포인터로 시작하여 값으로 표시되는 값이 1 동안 유지됩니다. 어떤 점에서는 null입니다.
편집 2 :
문자열에 문자 배열을 변경하고 이렇게 검색된 파일 이름이 발견되지 않으면 더 이상지도에 추가하는 get_current_image()
고정 후, 나는를로드 할 때 나는 또한 실수를 한 것을 발견
load_images()
을 작성했다
current_screen.load_images(image_loader);
:
void MainGameScreen::load_images(ImageLoader loader)
012 내가 처음에 질문을 게시 할 때 나는 잊었다 라인의 이미지를 포함하는
... loader
에 대한 함수 호출이 실제로 전달 된 ImageLoader에 적용되지 않았 음을 의미합니다.나는 다음과 같이 바꿨다 :
void MainGameScreen::load_images(ImageLoader& loader)
... 이제 모든 것이 잘 동작한다.
나는이 변경했지만 문제가 계속 지속됩니다. 나는 파일 이름 키가 원래 "image_map.find (image.get_image_filename()) == image_map.end()"이후 false를 반환하지만, get_current_image()를 호출 할 때의 값은 여전히 null 인 것과 같다고 생각합니다. – user3726962
@ user3726962 수정 된 버전의'get_current_image'를 원본 글에 추가하십시오. – Xirema
키의 타입을 포함하고 있지 않기 때문에'get_current_image'를 변경하지 않았습니다 만, GameImage의 get_image_filename'은 char 배열 대신에 문자열을 반환합니다. – user3726962