S. MarioBros - Editor de fase 0.1
Publicado por Samuel Leonardo 24/04/2009
[ Hits: 7.520 ]
Homepage: localhost
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); }
Tipos de Dados Abstrato - TDA - Vetor
Ponteiro para Ponteiro para Ponteiro
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Estou com sede em aprender sobre o nosso querido Linux. (1)
big linux sem audio como resolver (2)
Como faz para dar um update-grub por shell script [RESOLVIDO] (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta