void moving (void) { double now, dt, dx, dy, theta; struct unit *up; for (up = first_unit; up; up = up->next) { now = get_secs (); if (up->moving) { dx = up->moveto_x - up->center_x; dy = up->moveto_y - up->center_y; theta = atan2 (dy, dx); dt = now - up->lasttime; up->mov_x = SPEED * dt * cos (theta); up->mov_y = SPEED * dt * sin (theta); if (fabs (up->mov_x) > fabs (dx) && fabs (up->mov_y) > fabs (dy)) { up->x = up->moveto_x - up->w / 2; up->y = up->moveto_y - up->h / 2; up->moving = 0; } else { if (collision_x (up)) { up->mov_x = 0; } up->x += up->mov_x; if (collision_y (up)) { up->mov_y = 0; } up->y += up->mov_y; } up->lasttime = now; unit_def (up, NULL); } } }
int Character::move(){ int return_value = 0; //poruszanie się w poziomie x += ox*speed_up; int c = collision_x(); if( (c>=20) || (c==0)) { x = c; } switch(c){ //rozpoznanie z jakim blokiem jest kolizja case StaticObject::TRAP_BLOCK: if(die()){ return_value=GAME_OVER; } break; case StaticObject::COIN: return_value=StaticObject::COIN; break; case StaticObject::EXIT: return_value=StaticObject::EXIT; break; } //poruszanie się w pionie if(up && !max_jump_reached){ //jeżeli wciśnięty skok w górę i nie osiągnięto jeszcze max wys skoku y+=oy*(MAX_JUMP-jump_height+20)/60; jump_height-=oy*(MAX_JUMP-jump_height+20)/60; if(jump_height >= MAX_JUMP){ max_jump_reached = true; } int c = collision_y(); if( (c>=20) || (c==0)){ y=c; max_jump_reached = true; } switch(c){ //rozpoznanie z jakim blokiem jest kolizja case StaticObject::TRAP_BLOCK: if(die()){ return_value=GAME_OVER; } break; case StaticObject::COIN: return_value=StaticObject::COIN; break; case StaticObject::EXIT: return_value=StaticObject::EXIT; break; } }else{ //spadek lub spoczywanie na platformie if(jump_height != 0){ y += move_speed_y*(MAX_JUMP-jump_height+20)/60; }else{ y += move_speed_y; } if(jump_height > 0){ jump_height -= move_speed_y*(MAX_JUMP-jump_height+20)/60; } int c = collision_y(); if( (c>=20) || (c==0) ){ y=c; max_jump_reached = false; jump_height = 0; } switch(c){ //rozpoznanie z jakim blokiem jest kolizja case StaticObject::TRAP_BLOCK: if(die()){ return_value=GAME_OVER; } break; case StaticObject::COIN: return_value=StaticObject::COIN; break; case StaticObject::EXIT: return_value=StaticObject::EXIT; break; } } return return_value; }