Autor Wątek: Kafelkowanie-blad kodu ?  (Przeczytany 1311 razy)

Offline Aloneman4

  • Użytkownik

# Grudzień 22, 2010, 17:00:40
Witam, poradziłem już sobie z dziwnym ruchem postaci co było spowodowane błędem w pętli głównej programu, zawalczyłem także ze scrollingiem co sprawiło mi trochę kłopotów i mam kolejny problem...
Ponieważ nauczyłem się na swoich błędach i opracowałem kod który tworzy podstawy do tworzenia prostej gry platformowej zdecydowałem się napisać... prostą grę platformową...: P No dobrze, ale aby stworzyć ciekawą mapę potrzebuję dodać kafelkowanie, zdecydowałem się stworzyć nowy kod z racji na bałagan w starym kodzie i zaczynam od stworzenia mapy kafelkowej...
Podam teraz kod pliku "defs.h" i "main.cpp" żebyście mieli lepszy obraz sprawy:

defs.h:
#include <SDL/SDL.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <SDL/SDL_image.h>

#define MAX_MAP_X 20
#define MAX_MAP_Y 15

#define TILE_SIZE 32

main.cpp:
#include "defs.h"

SDL_Surface *ekran;
SDL_Surface *brickImage;

typedef struct Map
{
int tile[MAX_MAP_Y][MAX_MAP_X];
} Map;


void init(char *tytul)
{
     if(SDL_Init(SDL_INIT_EVERYTHING) < 0)
     {
                                      MessageBox(NULL, "Blad inicjowania grafiki", "Blad!", MB_OK);
     }
     ekran = SDL_SetVideoMode(760,540,32,SDL_SWSURFACE | SDL_DOUBLEBUF);
     
     if(ekran == NULL)
     {
              MessageBox(NULL, "Blad tworzenia okna", "Blad!", MB_OK);
     }
             
              SDL_WM_SetCaption(tytul, NULL);
}
SDL_Surface *loadImage(char *name)
{
/* Load the image using SDL Image */

SDL_Surface *temp = IMG_Load(name);
SDL_Surface *image;

if (temp == NULL)
{
printf("Failed to load image %s\n", name);

return NULL;
}

/* Make the background transparent */

SDL_SetColorKey(temp, (SDL_SRCCOLORKEY|SDL_RLEACCEL), SDL_MapRGB(temp->format, 255, 0, 255));

/* Convert the image to the screen's native format */

image = SDL_DisplayFormat(temp);

SDL_FreeSurface(temp);

if (image == NULL)
{
printf("Failed to convert image %s to native format\n", name);

return NULL;
}

/* Return the processed image */

return image;
}
void drawImage(SDL_Surface *image, int x, int y)
{
SDL_Rect dest;

dest.x = x;
dest.y = y;
dest.w = image->w;
dest.h = image->h;

SDL_BlitSurface(image, NULL, ekran, &dest);
}
void loadMap(char *name)
{
     Map map;
int x, y;
FILE *fp;

fp = fopen(name, "rb");

/* If we can't open the map then exit */

if (fp == NULL)
{
MessageBox(NULL, "Blad otwierania mapy", "Blad!", MB_OK);

exit(1);
}

/* Read the data from the file into the map */

for (y=0;y<MAX_MAP_Y;y++)
{
for (x=0;x<MAX_MAP_X;x++)
{
fscanf(fp, "%d", &map.tile[y][x]);
}
}

/* Close the file afterwards */

fclose(fp);
}
void drawMap()
{
int x, y;
Map map;

/* Draw the map */

for (y=0;y<MAX_MAP_Y;y++)
{
for (x=0;x<MAX_MAP_X;x++)
{
if (map.tile[y][x] != 0)
{
drawImage(brickImage, x * TILE_SIZE, y * TILE_SIZE);
}
}
}
}
void draw()
{
     drawMap();
}
int main(int argc,char *argv[])
{
    init("RPG");
   
    brickImage = loadImage("Data/background/brick.png");
   
    if(brickImage == NULL)
    {
                  MessageBox(NULL, "Nie mozna zaladowac brickImage", "Blad!", MB_OK);
                  exit(1);
    }
   
    loadMap("Data/maps/map01.dat");
   
    bool done = true;
   
    while(done)
    {
               SDL_Event Event;
               if(SDL_PollEvent(&Event))
               {
                                        if(Event.type == SDL_QUIT)
                                        {
                                                      done = false;
                                        }
               }
               SDL_Flip(ekran);
               draw();
    }
   
    SDL_Quit();
   
    return 0;
}

Dobrze, kod się ładnie kompiluje i przy uruchamianiu mój program wyświetla mi komunikat o błędzie we wczytywaniu pliku...

brickImage = loadImage"Data/background/brick.png");

if(brickImage == NULL)
{
                       MessageBox(NULL, "Nie mozna zaladowac brickImage", "Blad!", MB_OK);
                  exit(1);
}

jak widać jeśli zwraca zero(NULL) to wyświetla błąd i zamyka program.

Tylko czemu zwraca te zero? Co robię źle? Proszę o odpowiedzi!

P.S Dodam że brickImage ma rozmiary 32x32

: )

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Grudzień 22, 2010, 17:09:45
brickImage = loadImage("Data/background/brick.png");
Czy tu nie powinien być nawias.

Może podanie ścieżki bezwzględnej do pliku coś pomoże i powiedz w którym miejscu w funkcji loadImage() wywala NULL i tam pokombinuj.
« Ostatnia zmiana: Grudzień 22, 2010, 17:13:25 wysłana przez Adam7 »

Offline Aloneman4

  • Użytkownik

# Grudzień 22, 2010, 17:27:11
Adam7 oco Ci chodzi z tym nawiasem?: P

Offline hfjh

  • Użytkownik

# Grudzień 22, 2010, 17:50:19
SDL_image trzeba najpierw zainicjalizować funkcją IMG_Init.