#include #include "../main.h" #include "player.h" #include #define Player_log(msg) dbg_sprintf(dbgout, "[Object(Player) %d] %s\n", self->id, msg) void Player_update(Object* base){ Player* self = (Player*)base; Scene* scene = base->scene; Vector* sprites = scene->sprites; Sprite* sprite; kb_key_t arrows = kb_Data[7]; int x = base->x; int y = base->y; int speed; #ifdef LOG_UPDATE Player_log("Drawing player"); #endif if(kb_Data[2] & kb_Alpha){ speed = RUN_SPEED; }else{ speed = WALK_SPEED; } if(arrows & kb_Down){ if(base->y < MAX_HEIGHT){ base->y += speed; sprite = sprites->get(sprites, 2); if(sprite != base->sprite){ base->sprite = sprite; }else{ base->sprite = sprites->get(sprites, 4); } } }else if(arrows & kb_Up){ if(base->y > 0){ base->y -= speed; sprite = sprites->get(sprites, 18); if(sprite != base->sprite){ base->sprite = sprite; }else{ base->sprite = sprites->get(sprites, 20); } } } if(arrows & kb_Right){ if(base->x < MAX_WIDTH){ base->x += speed; sprite = sprites->get(sprites, 10); if(sprite != base->sprite){ base->sprite = sprite; }else{ base->sprite = sprites->get(sprites, 12); } } }else if(arrows & kb_Left){ if(base->x > 0){ base->x -= speed; sprite = sprites->get(sprites, 6); if(sprite != base->sprite){ base->sprite = sprite; }else{ base->sprite = sprites->get(sprites, 8); } } } if(base->x < 0){ base->x = 0; }else if(base->x >= MAX_WIDTH){ base->x = MAX_WIDTH; } if(base->y < 0){ base->y = 0; }else if(base->y >= MAX_HEIGHT){ base->y = MAX_HEIGHT; } if(x == base->x && y == base->y){ base->sprite = sprites->get(sprites, 0); } } void Player_load(Object* base){ Player_log("Loading player"); Player* self = (Player*)base; } void Player_free(Object* base){ Player* self = (Player*)base; Player_log("Freeing player"); free(self->sprites); base->free = NULL; free_Object((Object*)self); free(self); } Player* new_Player(){ Player* self = (Player*)malloc(sizeof(Player)); Object* base = new_Object(0,0); self->base = *base; self->sprites = new_Vector(0, sizeof(Sprite), (vc_vector_deleter*)&free_Sprite); base->update = &Player_update; base->free = &Player_free; base->load = &Player_load; return self; }