S. MarioBros - Editor de fase 0.1
Publicado por Samuel Leonardo 24/04/2009
[ Hits: 7.578 ]
Homepage: https://nerdki.blogspot.com.br/
Editor de fase para um futuro clone do Super Mario Bros que estou implementando.
Por enquanto está bem simples, mas brevemente irei aperfeiçoá-lo. Com ele você pode editar/criar um novo mapa. Aperte espaço para mudar o title e clique com o botão do mouse na janela que se abre para mudar as imagens. Como sempre, acompanha uma versão pré-compilada.
Para compilar:
$ gcc -o level_editor level_editor.c -lSDL
Para executar:
$ ./level_editor
Vlw!!!
/* Feito em 23/04/2009 às 13:00, by Sam L. Editor de fase para o super mario bros que estou implementando. Por enquanto está bem simples esse editor, mas brevemente irei aperfeiçoá-lo. Com ele você pode editar/criar um novo mapa. Aperte espaço para mudaro tile e clique com o botão do mouse na janela que se abre para mudar as imagens. Como sempre, acompanha uma versão pré-compilada. Para compilar: $ gcc -o level_editor level_editor.c -lSDL Para executar: $ ./level_editor vlw!!! */ #include <stdio.h> #include <stdio.h> #include <string.h> #include <SDL/SDL.h> #define FPS 30 #define BPP 32 #define FLAGS ((SDL_SWSURFACE | SDL_HWSURFACE) | SDL_ANYFORMAT | SDL_HWACCEL | SDL_RLEACCEL | SDL_DOUBLEBUF ) /*Numero máximo de tile na vertical e horizontal*/ #define MAP_W_MAX 30 #define MAP_H_MAX 16 #define TILESIZE 32 /*Largura do tile*/ #define TILE_MAX 13 /*Numero máximo de tiles*/ /*Aqui é para armazenar o mapa*/ FILE *file_map; char mapa[MAP_H_MAX][MAP_W_MAX]; /*========Protótipos das funções==============*/ void Cont_fps(Uint32 time_now); void LoadLevel(const char *filename); void SaveLevel(const char *filename); void DrawMap(SDL_Surface *tiles, SDL_Surface *screen); void DrawFoco(SDL_Surface *surf, int x, int y, SDL_Surface *screen); int main(int argc, char *argv[]) { int coor_x, coor_y; int index = 0; int done = 0; Uint32 time_now; char *mapname; char option[] = {'.','a','b','c','d','e','f','g','h','i','j','k','l'}; SDL_Surface *screen, *tiles, *mfoco; SDL_Event event; tiles = SDL_LoadBMP("imagens/smb.bmp"); mfoco = SDL_LoadBMP("imagens/foco.bmp"); if(SDL_Init(SDL_INIT_VIDEO) < 0) { printf("ERROR: %s\n", SDL_GetError()); exit(1); } if((tiles == NULL) || (mfoco == NULL)) { printf("ERROR: %s\n", SDL_GetError()); exit(1); } if(argc > 2) { printf("Usage: %s <mapa_jah_criado>\n", argv[1]); printf("Você pode carregar o \"demo_level.map\" que está no pacote tar.gz\n"); exit(1); } else if( argc == 2) { /*Carregando um level anterior*/ strcpy(mapname, (const char *)argv[1]); LoadLevel(mapname); } else { //NOTE: Sempre será excluido esse default_level /*Inicializando com o nome padrão para o mapa*/ strcpy(mapname, "default_level.map"); /*inicializando o mapa*/ memset(mapa, '.', sizeof(mapa)); } /*Setando uma cor chave na imagem mfoco, no caso é a cor branca*/ SDL_SetColorKey(mfoco, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB(mfoco->format, 255, 255, 255)); screen = SDL_SetVideoMode(MAP_W_MAX*TILESIZE, MAP_H_MAX*TILESIZE, BPP, FLAGS); if(screen == NULL) { printf("ERROR: %s\n", SDL_GetError()); exit(1); } SDL_WM_SetCaption("Level_Editor 0.1 -> by Sam L.", NULL); while(!done) { time_now = SDL_GetTicks(); while(SDL_PollEvent(&event)) { /* Pegando as coordenadas do cursor no screen */ SDL_GetMouseState(&coor_x, &coor_y); /* Transformando as coordenadas do screen em coordenadas do mapa */ coor_x = coor_x/TILESIZE; coor_y = coor_y/TILESIZE; //achei melhor separar os eventos if(event.type == SDL_QUIT) { done = 1; } if(event.type == SDL_MOUSEBUTTONDOWN) { mapa[coor_y][coor_x] = option[index]; } if(event.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_SPACE) { if(index < (TILE_MAX - 1)) { index = index + 1; } else { index = 0; } printf("IMAGEM_NUMERO:::%d\n",index); } } } DrawMap(tiles, screen); DrawFoco(mfoco, coor_x*TILESIZE, coor_y*TILESIZE, screen); SDL_UpdateRect(screen,0,0,0,0); Cont_fps(time_now); } /* Salva ou sobrescrve um mapa anteriormente criado */ SaveLevel(mapname); SDL_Quit(); return 0; } void Cont_fps(Uint32 time_now) { time_now = SDL_GetTicks() - time_now; if(time_now < 1000/FPS) { SDL_Delay(1000/FPS - time_now); } } void LoadLevel(const char *filename) { file_map = fopen(filename, "r+"); if(file_map == NULL) { printf("Não foi possível abrir/criar o arquivo\n"); exit(1); } if(fread(mapa, sizeof(mapa), 1, file_map) != 1) { printf("Não foi possivel ler o arquivo %s\n", filename); exit(1); } else { printf("Lendo mapa do arquivo %s\n", filename); } fclose(file_map); } void SaveLevel(const char *filename) { file_map = fopen(filename, "w+"); if(file_map == NULL) { printf("Não foi possível abrir/criar o arquivo\n"); exit(1); } if(fwrite(mapa, sizeof(mapa), 1, file_map) != 1) { printf("Não foi possível gravar o mapa\n"); exit(1); } else { printf("Mapa salvo com sucesso!\n"); } fclose(file_map); } void DrawMap(SDL_Surface *tiles, SDL_Surface *screen) { int lin, col; SDL_Rect font, dest; font.y = 0; font.w = TILESIZE; font.h = TILESIZE; for(lin = 0; lin < MAP_H_MAX; lin++) { dest.y = lin*TILESIZE; for(col = 0; col < MAP_W_MAX; col++) { dest.x = col*TILESIZE; /*NOTE: Isso aqui não está nada bom...*/ switch(mapa[lin][col]) { case '.': font.x = 0; break; case 'a': font.x = 1*TILESIZE; break; case 'b': font.x = 2*TILESIZE; break; case 'c': font.x = 3*TILESIZE; break; case 'd': font.x = 4*TILESIZE; break; case 'e': font.x = 5*TILESIZE; break; case 'f': font.x = 6*TILESIZE; break; case 'g': font.x = 7*TILESIZE; break; case 'h': font.x = 8*TILESIZE; break; case 'i': font.x = 9*TILESIZE; break; case 'j': font.x = 10*TILESIZE; break; case 'k': font.x = 11*TILESIZE; break; case 'l': font.x = 12*TILESIZE; break; } SDL_BlitSurface(tiles, &font, screen, &dest); } } } void DrawFoco(SDL_Surface *surf, int x, int y, SDL_Surface *screen) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface(surf, NULL, screen, &offset); }
Jogo da Velha com IA invencivel
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Meus HDs não aparecem mais no boot da placa mãe (19)
Problema de Comunicação Entre Bridges após Configuração de Links no RB... (0)
Instalação de Drive - USB para HDMI Ubuntu (0)
Instalação do Ubuntu 22.04 LTS (6)
Linux Mint com GForce 630 e 2 monitores dos quais só um está na resolu... (6)