Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
#include "SDL.h" const int WIDTH = 800; const int HEIGHT = 600; const int FRAME_RATE = 60; const int SPEED = 10; const int SPEED_NPC = 8; const int WALK = 150; const int DISTANCE = 150; void init(); void input(); void npc(); void draw(); void update(); void close(); Uint32 wait(Uint32 t0); SDL_Surface *changeState(); enum Direction { UP, DOWN, LEFT, RIGHT }; enum StateMachine { PATROL, PURSUIT }; SDL_Surface *screen, *player, *enemy01, *red_box, *green_box; SDL_Rect src_player, dest_player, src_enemy01, dest_enemy01; bool quit; int x, y; Direction walk_dir; StateMachine state_npc; int main(int argc, char *argv[]) { // Inicializa a SDL init(); // Variaveis Uint32 t0 = SDL_GetTicks(); // Main Loop while (!quit) { // Input input(); npc(); // Draw draw(); // Update update(); // Fixed Rate t0 = wait(t0); } // Finaliza a SDL close(); // Sai do programa exit(0); } void init() { if (SDL_Init(SDL_INIT_VIDEO) == -1) { exit(-1); } screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if (screen == NULL) { SDL_Quit(); exit(-1); } player = SDL_LoadBMP("blue.bmp"); red_box = SDL_LoadBMP("red.bmp"); green_box = SDL_LoadBMP("green.bmp"); if ((player == NULL) || (red_box == NULL) || (green_box == NULL)) { SDL_Quit(); exit(-1); } enemy01 = green_box; x = 0; y = 0; src_player.x = 0; src_player.y = 0; src_player.w = player->w; src_player.h = player->h; dest_player.x = (screen->w / 2) - player->w; dest_player.y = (screen->h / 2) - player->h; dest_player.w = player->w; dest_player.h = player->h; src_enemy01.x = 0; src_enemy01.y = 0; src_enemy01.w = enemy01->w; src_enemy01.h = enemy01->h; dest_enemy01.x = WALK; dest_enemy01.y = WALK; dest_enemy01.w = enemy01->w; dest_enemy01.h = enemy01->h; walk_dir = RIGHT; state_npc = PATROL; } void input() { SDL_Event e; while(SDL_PollEvent(&e)) { if (e.type == SDL_KEYDOWN) { switch(e.key.keysym.sym) { case SDLK_ESCAPE: quit = true; break; case SDLK_UP: y -= SPEED; break; case SDLK_DOWN: y += SPEED; break; case SDLK_LEFT: x -= SPEED; break; case SDLK_RIGHT: x += SPEED; break; } } else if (e.type == SDL_KEYUP) { switch(e.key.keysym.sym) { case SDLK_ESCAPE: quit = true; break; case SDLK_UP: y = 0; break; case SDLK_DOWN: y = 0; break; case SDLK_LEFT: x = 0; break; case SDLK_RIGHT: x = 0; break; } } } if ((x != 0) && ((dest_player.x + x) > 0) && ((dest_player.x + x) < (screen->w - player->w))) { dest_player.x += x; } if ((y != 0) && ((dest_player.y + y) > 0) && ((dest_player.y + y) < (screen->h - player->h))) { dest_player.y += y; } } void npc() { if (((dest_player.x - dest_enemy01.x) < DISTANCE) && ((dest_player.y - dest_enemy01.y) < DISTANCE)) { state_npc = PURSUIT; } else { state_npc = PATROL; } //TODO: O movimento deve ser circular em qualquer lugar if (state_npc == PATROL) { if (walk_dir == RIGHT) { if (dest_enemy01.x + SPEED_NPC > WALK) { walk_dir = DOWN; } else { dest_enemy01.x += SPEED_NPC; } } else if (walk_dir == DOWN) { if (dest_enemy01.y + SPEED_NPC > WALK) { walk_dir = LEFT; } else { dest_enemy01.y += SPEED_NPC; } } else if (walk_dir == LEFT) { if (dest_enemy01.x - SPEED_NPC <= 0) { walk_dir = UP; } else { dest_enemy01.x -= SPEED_NPC; } } else if (walk_dir == UP) { if (dest_enemy01.y - SPEED_NPC <= 0) { walk_dir = RIGHT; } else { dest_enemy01.y -= SPEED_NPC; } } } else if (state_npc == PURSUIT) { if (dest_enemy01.x > (dest_player.x + 4)) { dest_enemy01.x -= SPEED_NPC; } else if (dest_enemy01.x < (dest_player.x - 4)) { dest_enemy01.x += SPEED_NPC; } if (dest_enemy01.y > (dest_player.y + 4)) { dest_enemy01.y -= SPEED_NPC; } else if (dest_enemy01.y < (dest_player.y - 4)) { dest_enemy01.y += SPEED_NPC; } } } void draw() { SDL_FillRect(screen, NULL, 0); SDL_BlitSurface(player, &src_player, screen, &dest_player); enemy01 = changeState(); SDL_BlitSurface(enemy01, &src_enemy01, screen, &dest_enemy01); } void update() { SDL_Flip(screen); } void close() { SDL_FreeSurface(screen); SDL_FreeSurface(player); SDL_FreeSurface(enemy01); SDL_Quit(); } Uint32 wait(Uint32 t0) { Uint32 t1 = SDL_GetTicks(); if ((t1 - t0) < FRAME_RATE) SDL_Delay(FRAME_RATE - (t1 - t0)); return t1; } SDL_Surface *changeState() { if (state_npc == PATROL) { return green_box; } else if (state_npc == PURSUIT) { return red_box; } else { return NULL; } }
This paste will be private.
From the Design Piracy series on my blog: