/* fires a new bullet */
void fire_bullet()
{
   BULLET *b = malloc(sizeof(BULLET));

   b->x = player_pos();
   b->y = 0.96;

   b->next = bullets;
   bullets = b;

   sfx_shoot();
}
예제 #2
0
MapScreen::MapScreen(ThyKniteGame *g)
	: m_game(g)
{
	//m_mapRenderer = std::make_shared<DebugMapRenderer>(RandomWalkerGenerator().generate(60, 60));
	map(RandomWalkerGenerator().generate(60, 60));

	m_mapRenderer = std::make_shared<TileMapRenderer>(map(), Assets::instance->tilesetSheet->getFrame(2) );
	Vec2i fw = findFirstWalkable();
	std::cout << fw << std::endl;
	Vec2f player_pos( fw.x() * 16, fw.y() * 16 );
	m_player.reset(new PlayerPawnMap(player_pos, map()));
}
예제 #3
0
파일: view.c 프로젝트: sesc4mt/mvcdecoder
/* outside of cylinder projection function */
static int project_cylinder(float *f, int *i, int c)
{
   static MATRIX_f mtx;
   static int virgin = TRUE;

   if (virgin) {
      MATRIX_f m1, m2;

      get_z_rotate_matrix_f(&m1, -64);
      qtranslate_matrix_f(&m1, 0, 1.75, 0);
      get_scaling_matrix_f(&m2, 2.0, 1.0, 1.0);
      matrix_mul_f(&m1, &m2, &mtx);

      virgin = FALSE; 
   }

   while (c > 0) {
      float ang = (f[0] - player_pos()) * M_PI * 2.0;

      float xsize = view_right - view_left;
      float ysize = view_bottom - view_top;
      float size = MIN(xsize, ysize) / 2.0;

      float x = cos(ang);
      float y = sin(ang);
      float z = 1.0 + (1.0 - f[1]) * 4.0;

      float xout, yout, zout;

      apply_matrix_f(&mtx, x, y, z, &xout, &yout, &zout);

      if (yout > 1.5)
	 return FALSE;

      i[0] = xout/zout * size + (view_left + view_right) / 2.0;
      i[1] = (yout/zout * 2 - 1) * size + (view_top + view_bottom) / 2.0;

      f += 2;
      i += 2;
      c -= 2;
   }

   return TRUE;
}
/* updates the badguy position */
int update_badguys()
{
   BADGUY **p = &evildudes;
   BADGUY *b = evildudes;
   BADGUY *tmp1, *tmp2;
   void *bullet;
   float x, y, d;
   int dead;

   /* testcode: enter clears the level */
   if ((cheat) && (key[ALLEGRO_KEY_ENTER])) {
      shutdown_badguys();
      b = NULL;

      while (key[ALLEGRO_KEY_ENTER])
	 poll_input_wait();
   }

   while (b) {
      dead = FALSE;

      if (b->aggro) {
	 /* attack the player */
	 d = player_pos() - b->x;

	 if (d < -0.5)
	    d += 1;
	 else if (d > 0.5)
	    d -= 1;

	 if (b->y < 0.5)
	    d = -d;

	 b->v *= 0.99;
	 b->v += SGN(d) * 0.00025;
      }
      else if (b->evade) {
	 /* evade the player */
	 if (b->y < 0.75)
	    d = player_pos() + 0.5;
	 else
	    d = b->x;

	 if (b->move)
	    d += SGN(b->move) / 16.0;

	 d = find_target(d) - b->x;

	 if (d < -0.5)
	    d += 1;
	 else if (d > 0.5)
	    d -= 1;

	 b->v *= 0.96;
	 b->v += SGN(d) * 0.0004;
      }

      /* horizontal move */
      b->x += b->move + sin(b->t * b->sin_speed) * b->sin_depth + b->v;

      if (b->x < 0)
	 b->x += 1;
      else if (b->x > 1)
	 b->x -= 1;

      /* vertical move */
      b->y += b->speed;

      if ((b->y > 0.5) && (b->y - b->speed <= 0.5) && (b->split)) {
	 /* split ourselves */
	 tmp1 = malloc(sizeof(BADGUY));
	 tmp2 = malloc(sizeof(BADGUY));

	 *tmp1 = *tmp2 = *b;

	 tmp1->move -= 0.001;
	 tmp2->move += 0.001;

	 b->speed += 0.001;

	 tmp1->t = rand() & 255;
	 tmp2->t = rand() & 255;

	 tmp1->next = tmp2;
	 tmp2->next = evildudes;
	 evildudes = tmp1;
      }

      b->t++;

      if (b->y > 0) {
	 if (kill_player(b->x, b->y)) {
	    /* did we hit someone? */
	    dead = TRUE;
	 }
	 else {
	    /* or did someone else hit us? */
	    bullet = get_first_bullet(&x, &y);

	    while (bullet) {
	       x = x - b->x;

	       if (x < -0.5)
		  x += 1;
	       else if (x > 0.5)
		  x -= 1;

	       x = ABS(x);

	       y = ABS(y - b->y);

	       if (x < y)
		  d = y/2 + x;
	       else
		  d = x/2 + y;

	       if (d < 0.025) {
		  kill_bullet(bullet);
		  explode(b->x, b->y, 0);
		  sfx_explode_alien();
		  dead = TRUE;
		  break;
	       }

	       bullet = get_next_bullet(bullet, &x, &y);
	    }
	 }
      }

      /* advance to the next dude */
      if (dead) {
	 *p = b->next;
	 tmp1 = b;
	 b = b->next;
	 free(tmp1);
      }
      else {
	 p = &b->next;
	 b = b->next;
      }
   }

   if ((!evildudes) && (!player_dying())) {
      if (!finished_counter) {
	 message("Wave Complete");
	 sfx_ping(0);
      }

      finished_counter++;

      if (finished_counter > 64)
	 return TRUE;
   }

   return FALSE;
}
예제 #5
0
파일: camera.cpp 프로젝트: ed00m/supertux
void
Camera::update_scroll_normal(float elapsed_time)
{
  const CameraConfig& config = *(this->config);
  Player* player = sector->player;
  // TODO: co-op mode needs a good camera
  Vector player_pos(player->get_bbox().get_middle().x,
                                    player->get_bbox().get_bottom());
  static Vector last_player_pos = player_pos;
  Vector player_delta = player_pos - last_player_pos;
  last_player_pos = player_pos;

  // check that we don't have division by zero later
  if(elapsed_time < CAMERA_EPSILON)
    return;

  /****** Vertical Scrolling part ******/
  int ymode = config.ymode;

  if(player->is_dying() || sector->get_height() == 19*32) {
    ymode = 0;
  }
  if(ymode == 1) {
    cached_translation.y = player_pos.y - SCREEN_HEIGHT * config.target_y;
  }
  if(ymode == 2) {
    // target_y is the high we target our scrolling at. This is not always the
    // high of the player, but if he is jumping upwards we should use the
    // position where he last touched the ground. (this probably needs
    // exceptions for trampolines and similar things in the future)
    float target_y;
    if(player->fall_mode == Player::JUMPING)
      target_y = player->last_ground_y + player->get_bbox().get_height();
    else
      target_y = player->get_bbox().p2.y;
    target_y -= SCREEN_HEIGHT * config.target_y;

    // delta_y is the distance we'd have to travel to directly reach target_y
    float delta_y = cached_translation.y - target_y;
    // speed is the speed the camera would need to reach target_y in this frame
    float speed_y = delta_y / elapsed_time;

    // limit the camera speed when jumping upwards
    if(player->fall_mode != Player::FALLING
       && player->fall_mode != Player::TRAMPOLINE_JUMP) {
      speed_y = clamp(speed_y, -config.max_speed_y, config.max_speed_y);
    }

    // scroll with calculated speed
    cached_translation.y -= speed_y * elapsed_time;
  }
  if(ymode == 3) {
    float halfsize = config.kirby_rectsize_y * 0.5f;
    cached_translation.y = clamp(cached_translation.y,
                                 player_pos.y - SCREEN_HEIGHT * (0.5f + halfsize),
                                 player_pos.y - SCREEN_HEIGHT * (0.5f - halfsize));
  }
  if(ymode == 4) {
    float upperend = SCREEN_HEIGHT * config.edge_x;
    float lowerend = SCREEN_HEIGHT * (1 - config.edge_x);

    if (player_delta.y < -CAMERA_EPSILON) {
      // walking left
      lookahead_pos.y -= player_delta.y * config.dynamic_speed_sm;

      if(lookahead_pos.y > lowerend) {
        lookahead_pos.y = lowerend;
      }
    } else if (player_delta.y > CAMERA_EPSILON) {
      // walking right
      lookahead_pos.y -= player_delta.y * config.dynamic_speed_sm;
      if(lookahead_pos.y < upperend) {
        lookahead_pos.y = upperend;
      }
    }

    // adjust for level ends
    if (player_pos.y < upperend) {
      lookahead_pos.y = upperend;
    }
    if (player_pos.y > sector->get_width() - upperend) {
      lookahead_pos.y = lowerend;
    }

    cached_translation.y = player_pos.y - lookahead_pos.y;
  }

  translation.y = cached_translation.y;

  if(ymode != 0) {
    float top_edge, bottom_edge;
    if(config.clamp_y <= 0) {
      top_edge = 0;
      bottom_edge = SCREEN_HEIGHT;
    } else {
      top_edge = SCREEN_HEIGHT*config.clamp_y;
      bottom_edge = SCREEN_HEIGHT*(1-config.clamp_y);
    }

    float peek_to = 0;
    float translation_compensation = player_pos.y - translation.y;

    if(player->peeking_direction_y() == ::UP) {
      peek_to = bottom_edge - translation_compensation;
    } else if(player->peeking_direction_y() == ::DOWN) {
      peek_to = top_edge - translation_compensation;
    }

    float peek_move = (peek_to - peek_pos.y) * PEEK_ARRIVE_RATIO;
    if(fabs(peek_move) < 1.0) {
      peek_move = 0.0;
    }

    peek_pos.y += peek_move;

    translation.y -= peek_pos.y;

    if(config.clamp_y > 0) {
      translation.y = clamp(translation.y,
                            player_pos.y - SCREEN_HEIGHT * (1-config.clamp_y),
                            player_pos.y - SCREEN_HEIGHT * config.clamp_y);
      cached_translation.y = clamp(cached_translation.y,
                                   player_pos.y - SCREEN_HEIGHT * (1-config.clamp_y),
                                   player_pos.y - SCREEN_HEIGHT * config.clamp_y);
    }
  }

  /****** Horizontal scrolling part *******/
  int xmode = config.xmode;

  if(player->is_dying())
    xmode = 0;

  if(xmode == 1) {
    cached_translation.x = player_pos.x - SCREEN_WIDTH * config.target_x;
  }
  if(xmode == 2) {
    // our camera is either in leftscrolling, rightscrolling or
    // nonscrollingmode.
    //
    // when suddenly changing directions while scrolling into the other
    // direction abort scrolling, since tux might be going left/right at a
    // relatively small part of the map (like when jumping upwards)

    // Find out direction in which the player moves
    LookaheadMode walkDirection;
    if (player_delta.x < -CAMERA_EPSILON) walkDirection = LOOKAHEAD_LEFT;
    else if (player_delta.x > CAMERA_EPSILON) walkDirection = LOOKAHEAD_RIGHT;
    else if (player->dir == ::LEFT) walkDirection = LOOKAHEAD_LEFT;
    else walkDirection = LOOKAHEAD_RIGHT;

    float LEFTEND, RIGHTEND;
    if(config.sensitive_x > 0) {
      LEFTEND = SCREEN_WIDTH * config.sensitive_x;
      RIGHTEND = SCREEN_WIDTH * (1-config.sensitive_x);
    } else {
      LEFTEND = SCREEN_WIDTH;
      RIGHTEND = 0;
    }

    if(lookahead_mode == LOOKAHEAD_NONE) {
      /* if we're undecided then look if we crossed the left or right
       * "sensitive" area */
      if(player_pos.x < cached_translation.x + LEFTEND) {
        lookahead_mode = LOOKAHEAD_LEFT;
      } else if(player_pos.x > cached_translation.x + RIGHTEND) {
        lookahead_mode = LOOKAHEAD_RIGHT;
      }
      /* at the ends of a level it's obvious which way we will go */
      if(player_pos.x < SCREEN_WIDTH*0.5) {
        lookahead_mode = LOOKAHEAD_RIGHT;
      } else if(player_pos.x >= sector->get_width() - SCREEN_WIDTH*0.5) {
        lookahead_mode = LOOKAHEAD_LEFT;
      }

      changetime = -1;
    } else if(lookahead_mode != walkDirection) {
      /* player changed direction while camera was scrolling...
       * he has to do this for a certain time to add robustness against
       * sudden changes */
      if(changetime < 0) {
        changetime = game_time;
      } else if(game_time - changetime > config.dirchange_time) {
        if(lookahead_mode == LOOKAHEAD_LEFT &&
           player_pos.x > cached_translation.x + RIGHTEND) {
          lookahead_mode = LOOKAHEAD_RIGHT;
        } else if(lookahead_mode == LOOKAHEAD_RIGHT &&
                  player_pos.x < cached_translation.x + LEFTEND) {
          lookahead_mode = LOOKAHEAD_LEFT;
        } else {
          lookahead_mode = LOOKAHEAD_NONE;
        }
      }
    } else {
      changetime = -1;
    }

    LEFTEND = SCREEN_WIDTH * config.edge_x;
    RIGHTEND = SCREEN_WIDTH * (1-config.edge_x);

    // calculate our scroll target depending on scroll mode
    float target_x;
    if(lookahead_mode == LOOKAHEAD_LEFT)
      target_x = player_pos.x - RIGHTEND;
    else if(lookahead_mode == LOOKAHEAD_RIGHT)
      target_x = player_pos.x - LEFTEND;
    else
      target_x = cached_translation.x;

    // that's the distance we would have to travel to reach target_x
    float delta_x = cached_translation.x - target_x;
    // the speed we'd need to travel to reach target_x in this frame
    float speed_x = delta_x / elapsed_time;

    // limit our speed
    float player_speed_x = player_delta.x / elapsed_time;
    float maxv = config.max_speed_x + (fabsf(player_speed_x * config.dynamic_max_speed_x));
    speed_x = clamp(speed_x, -maxv, maxv);

    // apply scrolling
    cached_translation.x -= speed_x * elapsed_time;
  }
  if(xmode == 3) {
    float halfsize = config.kirby_rectsize_x * 0.5f;
    cached_translation.x = clamp(cached_translation.x,
                                 player_pos.x - SCREEN_WIDTH * (0.5f + halfsize),
                                 player_pos.x - SCREEN_WIDTH * (0.5f - halfsize));
  }
  if(xmode == 4) {
    float LEFTEND = SCREEN_WIDTH * config.edge_x;
    float RIGHTEND = SCREEN_WIDTH * (1 - config.edge_x);

    if (player_delta.x < -CAMERA_EPSILON) {
      // walking left
      lookahead_pos.x -= player_delta.x * config.dynamic_speed_sm;
      if(lookahead_pos.x > RIGHTEND) {
        lookahead_pos.x = RIGHTEND;
      }

    } else if (player_delta.x > CAMERA_EPSILON) {
      // walking right
      lookahead_pos.x -= player_delta.x * config.dynamic_speed_sm;
      if(lookahead_pos.x < LEFTEND) {
        lookahead_pos.x = LEFTEND;
      }
    }

    // adjust for level ends
    if (player_pos.x < LEFTEND) {
      lookahead_pos.x = LEFTEND;
    }
    if (player_pos.x > sector->get_width() - LEFTEND) {
      lookahead_pos.x = RIGHTEND;
    }

    cached_translation.x = player_pos.x - lookahead_pos.x;
  }

  translation.x = cached_translation.x;

  if(xmode != 0) {
    float left_edge, right_edge;
    if(config.clamp_x <= 0) {
      left_edge = 0;
      right_edge = SCREEN_WIDTH;
    } else {
      left_edge = SCREEN_WIDTH*config.clamp_x;
      right_edge = SCREEN_WIDTH*(1-config.clamp_x);
    }

    float peek_to = 0;
    float translation_compensation = player_pos.x - translation.x;

    if(player->peeking_direction_x() == ::LEFT) {
      peek_to = right_edge - translation_compensation;
    } else if(player->peeking_direction_x() == ::RIGHT) {
      peek_to = left_edge - translation_compensation;
    }

    float peek_move = (peek_to - peek_pos.x) * PEEK_ARRIVE_RATIO;
    if(fabs(peek_move) < 1.0) {
      peek_move = 0.0;
    }

    peek_pos.x += peek_move;

    translation.x -= peek_pos.x;

    if(config.clamp_x > 0) {
      translation.x = clamp(translation.x,
                            player_pos.x - SCREEN_WIDTH * (1-config.clamp_x),
                            player_pos.x - SCREEN_WIDTH * config.clamp_x);

      cached_translation.x = clamp(cached_translation.x,
                                   player_pos.x - SCREEN_WIDTH * (1-config.clamp_x),
                                   player_pos.x - SCREEN_WIDTH * config.clamp_x);
    }
  }

  keep_in_bounds(translation);
  keep_in_bounds(cached_translation);
}
예제 #6
0
Vec2i Player::getSelect(){
	return player_pos() + selection;
}