#include "human.h" Human::Human(){ } Human::~Human(){ } int Human::init(const char * fn, SDL_Surface *screen, int x, int y, CollisionHandler *ch) { this->screen = screen; this->ch = ch; SDL_Surface *temp; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); //the image is loaded on a temporary surface if(!(temp = IMG_Load(fn))) { printf("SDL error: %s\n",IMG_GetError()); return 0; } //the image is adapted to local display so that it can obtains better graphics performance bg = SDL_DisplayFormat(temp); //free temp surface SDL_FreeSurface(temp); //set the transparent color of cursor surface Uint8 R, B, G; SDL_GetRGB(((unsigned int*) bg->pixels)[0], bg->format, &R, &G, &B); SDL_SetColorKey(bg, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(bg->format, R, G, B)); glTexImage2D(GL_TEXTURE_2D,0,bg->format->BytesPerPixel,bg->w, bg->h,0,GL_BGRA,GL_UNSIGNED_BYTE,bg->pixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering dest_rect = new SDL_Rect; dest_rect->x = x; dest_rect->y = y; dest_rect->w = bg->w; dest_rect->h = bg->h; return 1; } SDL_Rect* Human::getRect(){ return dest_rect; } void Human::update(){ int dx = destx-dest_rect->x; int dy = desty-dest_rect->y; //printf("%d, %d\n", dx, dy); float magnitude = sqrt( dx*dx + dy*dy ); float xvel = dx / magnitude; float yvel = dy / magnitude; SDL_Rect *test = new SDL_Rect; test->x=dest_rect->x + ( int ) ( xvel * SPEED ); test->y=dest_rect->y + ( int ) ( yvel * SPEED ); test->w = dest_rect->w; test->h = dest_rect->h; bool colliding = false; for ( int i = 0; i < ch->num_objects; i++ ) { // SDL_FillRect(bg, ch->member_rects[i], SDL_MapRGB(bg->format, 0x0, 0xff, 0x0)); // SDL_FillRect(bg, test, SDL_MapRGB(bg->format, 0xff, 0x0, 0x0)); colliding = ch->test(test, ch->member_rects[i]); } if ( !colliding && dx != 0 && dy != 0 ) { printf("m\n"); //printf(" (%d, %d)\n", test->x, test->y); dest_rect = test; } else { //if (dx != 0 && dy != 0) printf("c (%d, %d)\n", test->x, test->y); } } void Human::draw(){ //SDL_BlitSurface(bg, NULL, screen, dest_rect); glLoadIdentity(); glBindTexture(GL_TEXTURE_2D, texture); glTranslatef(dest_rect->x-1, dest_rect->y, 0.0f); //glScalef((float) (1.0f/3.0f), (float) (1.0f/3.0f), 0.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, 0.0f); glEnd(); } int Human::newDest(int x, int y) { destx = x; desty = y; return 0; //if we reach this point we?ve searched all reachable nodes and still haven?t found the solution, therefore one doesn?t exist) }