Esempio n. 1
0
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);
		}
	}
}
Esempio n. 2
0
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;
}