示例#1
0
void
WillOWisp::vanish()
{
  mystate = STATE_VANISHING;
  sprite->set_action("vanishing", 1);
  set_colgroup_active(COLGROUP_DISABLED);
}
示例#2
0
文件: fish.cpp 项目: leyyin/supertux
void
Fish::jump()
{
  physic.set_velocity_y(FISH_JUMP_POWER);
  physic.enable_gravity(true);
  set_colgroup_active(COLGROUP_MOVING);
}
示例#3
0
void
GoldBomb::ungrab(MovingObject& object, Direction dir_)
{
  int toss_velocity_x = 0;
  int toss_velocity_y = 0;
  auto player = dynamic_cast<Player*> (&object);

  // toss upwards
  if(dir_ == UP)
    toss_velocity_y += -500;

  // toss to the side when moving sideways
  if(player && player->m_physic.get_velocity_x()*(dir_ == LEFT ? -1 : 1) > 1) {
    toss_velocity_x += (dir_ == LEFT) ? -200 : 200;
    toss_velocity_y = (toss_velocity_y < -200) ? toss_velocity_y : -200;
    // toss farther when running
    if(player && player->m_physic.get_velocity_x()*(dir_ == LEFT ? -1 : 1) > 200)
      toss_velocity_x += static_cast<int>(player->m_physic.get_velocity_x() - (190*(dir_ == LEFT ? -1 : 1)));
  }
  log_warning << toss_velocity_x << toss_velocity_y << std::endl;////

  //set_pos(object.get_pos() + Vector((dir_ == LEFT ? -33 : 33), get_bbox().get_height()*0.66666 - 32));
  physic.set_velocity(static_cast<float>(toss_velocity_x),
                      static_cast<float>(toss_velocity_y));
  set_colgroup_active(COLGROUP_MOVING);
  grabbed = false;
}
示例#4
0
void
MrBomb::ungrab(MovingObject& , Direction dir_)
{
  this->dir = dir_;
  set_colgroup_active(COLGROUP_MOVING);
  grabbed = false;
}
示例#5
0
void
Bomb::ungrab(MovingObject& object, Direction dir_)
{
  this->dir = dir_;
  // This object is now thrown.
  int toss_velocity_x = 0;
  int toss_velocity_y = 0;
  auto player = dynamic_cast<Player*> (&object);

  // toss upwards
  if(dir_ == UP)
    toss_velocity_y += -500;

  // toss to the side when moving sideways
  if(player && player->physic.get_velocity_x()*(dir_ == LEFT ? -1 : 1) > 1) {
    toss_velocity_x += (dir_ == LEFT) ? -200 : 200;
    toss_velocity_y = (toss_velocity_y < -200) ? toss_velocity_y : -200;
    // toss farther when running
    if(player && player->physic.get_velocity_x()*(dir_ == LEFT ? -1 : 1) > 200)
      toss_velocity_x += player->physic.get_velocity_x()-(190*(dir_ == LEFT ? -1 : 1));
  }

  physic.set_velocity(toss_velocity_x, toss_velocity_y);

  set_colgroup_active(COLGROUP_MOVING);
  grabbed = false;
}
示例#6
0
void
Stalactite::active_update(float elapsed_time)
{
  if(state == STALACTITE_HANGING) {
    Player* player = this->get_nearest_player();
    if (player) {
      if(player->get_bbox().p2.x > bbox.p1.x - SHAKE_RANGE_X
         && player->get_bbox().p1.x < bbox.p2.x + SHAKE_RANGE_X
         && player->get_bbox().p2.y > bbox.p1.y
         && player->get_bbox().p1.y < bbox.p2.y + SHAKE_RANGE_Y
         && Sector::current()->can_see_player(get_bbox().get_middle())) {
        timer.start(SHAKE_TIME);
        state = STALACTITE_SHAKING;
        SoundManager::current()->play("sounds/cracking.wav", get_pos());
      }
    }
  } else if(state == STALACTITE_SHAKING) {
    shake_delta = Vector(graphicsRandom.rand(-3,3), 0);
    if(timer.check()) {
      state = STALACTITE_FALLING;
      physic.enable_gravity(true);
      set_colgroup_active(COLGROUP_MOVING);
    }
  } else if(state == STALACTITE_FALLING) {
    movement = physic.get_movement(elapsed_time);
  }
}
示例#7
0
void Yeti::take_hit(Player& )
{
  if(safe_timer.started())
    return;

  SoundManager::current()->play("sounds/yeti_roar.wav");
  hit_points--;

  if(hit_points <= 0) {
    // We're dead
    physic.set_velocity_x(((dir==RIGHT)?+RUN_VX:-RUN_VX)/5);
    physic.set_velocity_y(0);

    // Set the badguy layer to be above the foremost, so that
    // this does not reveal secret tilemaps:
    layer = Sector::current()->get_foremost_layer() + 1;
    state = SQUISHED;
    state_timer.start(YETI_SQUISH_TIME);
    set_colgroup_active(COLGROUP_MOVING_ONLY_STATIC);
    //sprite->set_action("dead"); // This sprite does not look very good
  }
  else {
    safe_timer.start(SAFE_TIME);
  }
}
示例#8
0
文件: fish.cpp 项目: leyyin/supertux
void
Fish::start_waiting()
{
  waiting.start(FISH_WAIT_TIME);
  set_colgroup_active(COLGROUP_DISABLED);
  physic.enable_gravity(false);
  physic.set_velocity_y(0);
}
示例#9
0
Dispenser::Dispenser(const Reader& reader) :
  BadGuy(reader, "images/creatures/dispenser/dispenser.sprite"),
  colgroup_active(),
  cycle(),
  badguys(),
  next_badguy(),
  dispense_timer(),
  autotarget(),
  swivel(),
  broken(),
  random(),
  type()
{
  set_colgroup_active(COLGROUP_MOVING_STATIC);
  SoundManager::current()->preload("sounds/squish.wav");
  reader.get("cycle", cycle);
  reader.get("badguy", badguys);
  random = false; // default
  reader.get("random", random);
  type = "dropper"; //default
  reader.get("type", type);
  next_badguy = 0;
  autotarget = false;
  swivel = false;
  broken = false;

  if (badguys.size() <= 0)
    throw std::runtime_error("No badguys in dispenser.");

  if (type == "rocketlauncher") {
    sprite->set_action(dir == LEFT ? "working-left" : "working-right");
    set_colgroup_active(COLGROUP_MOVING); //if this were COLGROUP_MOVING_STATIC MrRocket would explode on launch.

    if (start_dir == AUTO) {
      autotarget = true;
    }
  } else if (type == "cannon") {
    sprite->set_action("working");
  } else {
    sprite->set_action("dropper");
  }

  bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height());
  countMe = false;
}
示例#10
0
void
MrIceBlock::grab(MovingObject&, const Vector& pos, Direction dir_)
{
  movement = pos - get_pos();
  this->dir = dir_;
  this->set_action(dir_ == LEFT ? "flat-left" : "flat-right", /* loops = */ -1);
  set_state(ICESTATE_GRABBED);
  set_colgroup_active(COLGROUP_DISABLED);
}
示例#11
0
void
Snail::grab(MovingObject&, const Vector& pos, Direction dir_)
{
  m_col.m_movement = pos - get_pos();
  m_dir = dir_;
  set_action(dir_ == Direction::LEFT ? "flat-left" : "flat-right", /* loops = */ -1);
  be_grabbed();
  set_colgroup_active(COLGROUP_DISABLED);
}
示例#12
0
void
SkyDive::ungrab (MovingObject& , Direction)
{
  is_grabbed = false;

  physic.set_velocity_y (0);
  physic.set_acceleration_y (0);
  physic.enable_gravity (true);
  set_colgroup_active (COLGROUP_MOVING);
}
示例#13
0
void
MrBomb::grab(MovingObject&, const Vector& pos, Direction dir_)
{
  assert(frozen);
  movement = pos - get_pos();
  this->dir = dir_;
  sprite->set_action(dir_ == LEFT ? "iced-left" : "iced-right");
  set_colgroup_active(COLGROUP_DISABLED);
  grabbed = true;
}
示例#14
0
void
Bomb::ungrab(MovingObject& object, Direction dir_)
{
  this->dir = dir_;
  // portable objects are usually pushed away from Tux when dropped, but we
  // don't want that, so we set the position
  //FIXME: why don't we want that? shouldn't behavior be consistent?
  set_pos(object.get_pos() + Vector(dir_ == LEFT ? -16 : 16, get_bbox().get_height()*0.66666 - 32));
  set_colgroup_active(COLGROUP_MOVING);
  grabbed = false;
}
示例#15
0
void
MrIceBlock::ungrab(MovingObject& , Direction dir_)
{
  if(dir_ == UP) {
    set_state(ICESTATE_FLAT, true);
  } else {
    this->dir = dir_;
    set_state(ICESTATE_KICKED);
  }
  set_colgroup_active(COLGROUP_MOVING);
}
示例#16
0
void
Snail::ungrab(MovingObject& , Direction dir_)
{
  if (dir_ == Direction::UP) {
    be_flat();
  } else {
    m_dir = dir_;
    be_kicked();
  }
  set_colgroup_active(COLGROUP_MOVING);
}
示例#17
0
Stalactite::Stalactite(const Reader& lisp) :
  BadGuy(lisp, "images/creatures/stalactite/stalactite.sprite", LAYER_TILES - 1),
  timer(),
  state(STALACTITE_HANGING),
  shake_delta()
{
  countMe = false;
  set_colgroup_active(COLGROUP_TOUCHABLE);
  SoundManager::current()->preload("sounds/cracking.wav");
  SoundManager::current()->preload("sounds/sizzle.ogg");
  SoundManager::current()->preload("sounds/icecrash.ogg");
}
示例#18
0
Root::Root(const Vector& pos) :
  BadGuy(pos, "images/creatures/ghosttree/root.sprite", LAYER_TILES-1),
  mystate(STATE_APPEARING),
  base_sprite(SpriteManager::current()->create("images/creatures/ghosttree/root-base.sprite")),
  offset_y(0),
  hatch_timer()
{
  base_sprite->set_action("appearing", 1);
  base_sprite->set_animation_loops(1); // TODO: necessary because set_action ignores loops for default action
  m_physic.enable_gravity(false);
  set_colgroup_active(COLGROUP_TOUCHABLE);
}
示例#19
0
void
Bomb::grab(MovingObject& object, const Vector& pos, Direction dir_)
{
  movement = pos - get_pos();
  this->dir = dir_;

  // We actually face the opposite direction of Tux here to make the fuse more
  // visible instead of hiding it behind Tux
  sprite->set_action_continued(dir == LEFT ? "ticking-right" : "ticking-left");
  set_colgroup_active(COLGROUP_DISABLED);
  grabbed = true;
  grabber = &object;
}
示例#20
0
void
GoldBomb::grab(MovingObject& object, const Vector& pos, Direction dir_)
{
  if(tstate == STATE_TICKING){
    movement = pos - get_pos();
    dir = dir_;

    // We actually face the opposite direction of Tux here to make the fuse more
    // visible instead of hiding it behind Tux
    sprite->set_action_continued(dir == LEFT ? "ticking-right" : "ticking-left");
    set_colgroup_active(COLGROUP_DISABLED);
    grabbed = true;
    grabber = &object;
  }
  else if(frozen){
    movement = pos - get_pos();
    dir = dir_;
    sprite->set_action(dir_ == LEFT ? "iced-left" : "iced-right");
    set_colgroup_active(COLGROUP_DISABLED);
    grabbed = true;
  }
}
示例#21
0
void
SkyDive::grab (MovingObject&, const Vector& pos, Direction dir_)
{
  movement = pos - get_pos();
  this->dir = dir_;

  is_grabbed = true;

  physic.set_velocity_x (movement.x * LOGICAL_FPS);
  physic.set_velocity_y (0.0);
  physic.set_acceleration_y (0.0);
  physic.enable_gravity (false);
  set_colgroup_active (COLGROUP_DISABLED);
}
void
YetiStalactite::update(float elapsed_time)
{
  // Respawn instead of removing once squished
  if(get_state() == STATE_SQUISHED && check_state_timer()) {
    set_state(STATE_ACTIVE);
    state = STALACTITE_HANGING;
    // Hopefully we shouldn't come into contact with anything...
    sprite->set_action("normal");
    set_pos(start_position);
    set_colgroup_active(COLGROUP_TOUCHABLE);
  }

  // Call back to badguy to do normal stuff
  BadGuy::update(elapsed_time);
}
示例#23
0
TreeWillOWisp::TreeWillOWisp(GhostTree* tree_, const Vector& pos,
                             float radius_, float speed_) :
  BadGuy(tree_->get_pos() + pos, "images/creatures/willowisp/willowisp.sprite",
         LAYER_OBJECTS - 20),
  was_sucked(false),
  mystate(STATE_DEFAULT),
  color(),
  angle(0),
  radius(radius_),
  speed(speed_),
  sound_source(),
  tree(tree_),
  suck_target()
{
  SoundManager::current()->preload(TREEWILLOSOUND);
  set_colgroup_active(COLGROUP_MOVING);
}
示例#24
0
//TODO: Add launching velocity to certain badguys
bool
Dispenser::collision_squished(GameObject& object)
{
  //Cannon launching MrRocket can be broken by jumping on it
  //other dispensers are not that fragile.
  if (broken || type != DT_ROCKETLAUNCHER) {
    return false;
  }

  sprite->set_action(dir == LEFT ? "broken-left" : "broken-right");
  dispense_timer.start(0);
  set_colgroup_active(COLGROUP_MOVING_STATIC); // Tux can stand on broken cannon.
  Player* player = dynamic_cast<Player*>(&object);
  if (player){
    player->bounce(*this);
  }
  SoundManager::current()->play("sounds/squish.wav", get_pos());
  broken = true;
  return true;
}
示例#25
0
Flame::Flame(const ReaderMapping& reader) :
  BadGuy(reader, "images/creatures/flame/flame.sprite", LAYER_FLOATINGOBJECTS,
         "images/objects/lightmap_light/lightmap_light-small.sprite"),
  angle(0),
  radius(),
  speed(),
  light(0.0f,0.0f,0.0f),
  sound_source()
{
  if ( !reader.get("radius", radius)) radius = 100;
  if ( !reader.get("speed", speed)) speed = 2;
  bbox.set_pos(Vector(start_position.x + cos(angle) * radius,
                      start_position.y + sin(angle) * radius));
  countMe = false;
  SoundManager::current()->preload(FLAME_SOUND);

  set_colgroup_active(COLGROUP_TOUCHABLE);

  lightsprite->set_color(Color(0.21f, 0.13f, 0.08f));
  glowing = true;
}
示例#26
0
GhostTree::GhostTree(const Reader& lisp) :
  BadGuy(lisp, "images/creatures/ghosttree/ghosttree.sprite", LAYER_OBJECTS - 10),
  mystate(STATE_IDLE),
  willowisp_timer(),
  willo_spawn_y(0),
  willo_radius(200),
  willo_speed(1.8f),
  willo_color(0),
  glow_sprite(SpriteManager::current()->create("images/creatures/ghosttree/ghosttree-glow.sprite")),
  colorchange_timer(),
  suck_timer(),
  root_timer(),
  treecolor(0),
  suck_lantern_color(),
  suck_lantern(0),
  willowisps()
{
  set_colgroup_active(COLGROUP_TOUCHABLE);
  SoundManager::current()->preload("sounds/tree_howling.ogg");
  SoundManager::current()->preload("sounds/tree_suck.ogg");
}
示例#27
0
Iceflame::Iceflame(const Reader& reader) :
  BadGuy(reader, "images/creatures/flame/iceflame.sprite", LAYER_FLOATINGOBJECTS),
  angle(0),
  radius(100),
  speed(2),
  light(0.0f,0.0f,0.0f),
  lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-small.sprite"))
{
  reader.get("radius", radius);
  reader.get("speed", speed);
  bbox.set_pos(Vector(start_position.x + cos(angle) * radius,
                      start_position.y + sin(angle) * radius));
  countMe = false;
  SoundManager::current()->preload("sounds/sizzle.ogg");

  set_colgroup_active(COLGROUP_TOUCHABLE);

  lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE));
  lightsprite->set_color(Color(0.00f, 0.13f, 0.18f));

}
TreeWillOWisp::TreeWillOWisp(GhostTree* tree, const Vector& pos,
                             float radius, float speed) :
  BadGuy(tree->get_pos() + pos, "images/creatures/willowisp/willowisp.sprite",
         LAYER_OBJECTS - 20), 
  was_sucked(false), 
  mystate(STATE_DEFAULT), 
  color(),
  angle(),
  radius(),
  speed(),
  sound_source(),
  tree(tree),
  suck_target()
{
  sound_manager->preload(TREEWILLOSOUND);

  this->radius = radius;
  this->angle  = 0;
  this->speed  = speed;

  set_colgroup_active(COLGROUP_MOVING);
}
示例#29
0
void
Mole::set_state(MoleState new_state)
{
  if (frozen)
    return;

  switch (new_state) {
    case PRE_THROWING:
      sprite->set_action("idle");
      set_colgroup_active(COLGROUP_DISABLED);
      timer.start(MOLE_WAIT_TIME);
      break;
    case THROWING:
      sprite->set_action("idle");
      set_colgroup_active(COLGROUP_DISABLED);
      timer.start(THROW_TIME);
      throw_timer.start(THROW_INTERVAL);
      break;
    case POST_THROWING:
      sprite->set_action("idle");
      set_colgroup_active(COLGROUP_DISABLED);
      timer.start(MOLE_WAIT_TIME);
      break;
    case PEEKING:
      sprite->set_action("peeking", 1);
      set_colgroup_active(COLGROUP_STATIC);
      break;
    case DEAD:
      sprite->set_action("idle");
      set_colgroup_active(COLGROUP_DISABLED);
      break;
    case BURNING:
      sprite->set_action("burning", 1);
      set_colgroup_active(COLGROUP_DISABLED);
      break;
  }

  state = new_state;
}
示例#30
0
Dispenser::Dispenser(const Reader& reader) :
  BadGuy(reader, "images/creatures/dispenser/dispenser.sprite"),
  colgroup_active(),
  cycle(),
  badguys(),
  next_badguy(),
  dispense_timer(),
  autotarget(),
  swivel(),
  broken(),
  random(),
  type()
{
  set_colgroup_active(COLGROUP_MOVING_STATIC);
  SoundManager::current()->preload("sounds/squish.wav");
  reader.get("cycle", cycle);
  reader.get("badguy", badguys);
  random = false; // default
  reader.get("random", random);
  std::string type_s = "dropper"; //default
  reader.get("type", type_s);
  if (type_s == "dropper") {
    type = DT_DROPPER;
  } else if (type_s == "rocketlauncher") {
    type = DT_ROCKETLAUNCHER;
  } else if (type_s == "cannon") {
    type = DT_CANNON;
  } else {
    log_warning << "Unknown type of dispenser:" << type_s << ", setting to dropper." << std::endl;
    type = DT_DROPPER;
  }
  next_badguy = 0;
  autotarget = false;
  swivel = false;
  broken = false;

  if (badguys.size() <= 0)
    throw std::runtime_error("No badguys in dispenser.");

  switch (type) {
    case DT_DROPPER:
      sprite->set_action("dropper");
      break;
    case DT_ROCKETLAUNCHER:
      sprite->set_action(dir == LEFT ? "working-left" : "working-right");
      set_colgroup_active(COLGROUP_MOVING); //if this were COLGROUP_MOVING_STATIC MrRocket would explode on launch.

      if (start_dir == AUTO) {
        autotarget = true;
      }
      break;
    case DT_CANNON:
      sprite->set_action("working");
      break;
    default:
      break;
  }

  bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height());
  countMe = false;
}