X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fangrystone.cpp;h=bb0b476b2cae6e6e8886f782ba3396f35f68646d;hb=4bbf74b32ab00e94162d90746cdb9ba9fd8a2aaa;hp=a3eb781221063432e32a7cbc731e4b37af4ae292;hpb=b158cdbc7139bcc35fd4c37a5cf640bf9f744998;p=supertux.git diff --git a/src/badguy/angrystone.cpp b/src/badguy/angrystone.cpp index a3eb78122..bb0b476b2 100644 --- a/src/badguy/angrystone.cpp +++ b/src/badguy/angrystone.cpp @@ -1,66 +1,53 @@ -// $Id: angrystone.cpp 2979 2006-01-10 00:00:04Z matzebraun $ -// // AngryStone - A spiked block that charges towards the player -// Copyright (C) 2006 Christoph Sommer +// Copyright (C) 2006 Christoph Sommer // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. +// along with this program. If not, see . -#include +#include "badguy/angrystone.hpp" -#include "angrystone.hpp" +#include "object/player.hpp" +#include "sprite/sprite.hpp" +#include "supertux/object_factory.hpp" -static const float SPEED = 240; +static const float CHARGE_SPEED = 240; static const float CHARGE_TIME = .5; static const float ATTACK_TIME = 1; static const float RECOVER_TIME = .5; -AngryStone::AngryStone(const lisp::Lisp& reader) -{ - reader.get("x", start_position.x); - reader.get("y", start_position.y); - bbox.set_size(87.8, 87.8); // sprite is (88px, 88px) - sprite = sprite_manager->create("images/creatures/angrystone/angrystone.sprite"); - state = IDLE; -} - -void -AngryStone::write(lisp::Writer& writer) -{ - writer.start_list("angrystone"); - - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); - - writer.end_list("angrystone"); -} - -void -AngryStone::activate() +AngryStone::AngryStone(const Reader& reader) : + BadGuy(reader, "images/creatures/angrystone/angrystone.sprite"), + attackDirection(), + oldWallDirection(), + timer(), + state(IDLE) { + countMe = false; physic.set_velocity_x(0); physic.set_velocity_y(0); physic.enable_gravity(true); sprite->set_action("idle"); } -HitResponse -AngryStone::collision_solid(GameObject& , const CollisionHit& hit) +void +AngryStone::collision_solid(const CollisionHit& hit) { - if ((state == ATTACKING) && (hit.normal.x == -attackDirection.x) && (hit.normal.y == attackDirection.y)) { + // TODO + (void) hit; +#if 0 + if ((state == ATTACKING) && + (hit.normal.x == -attackDirection.x) && (hit.normal.y == attackDirection.y)) { state = IDLE; sprite->set_action("idle"); physic.set_velocity_x(0); @@ -69,8 +56,7 @@ AngryStone::collision_solid(GameObject& , const CollisionHit& hit) oldWallDirection.x = attackDirection.x; oldWallDirection.y = attackDirection.y; } - - return CONTINUE; +#endif } void @@ -90,53 +76,55 @@ AngryStone::collision_badguy(BadGuy& badguy, const CollisionHit& ) return FORCE_MOVE; } -void +void AngryStone::active_update(float elapsed_time) { BadGuy::active_update(elapsed_time); if (state == IDLE) { - MovingObject* player = Sector::current()->player; - MovingObject* badguy = this; - const Vector playerPos = player->get_pos(); - const Vector badguyPos = badguy->get_pos(); - float dx = (playerPos.x - badguyPos.x); - float dy = (playerPos.y - badguyPos.y); - - float playerHeight = player->get_bbox().p2.y - player->get_bbox().p1.y; - float badguyHeight = badguy->get_bbox().p2.y - badguy->get_bbox().p1.y; - - float playerWidth = player->get_bbox().p2.x - player->get_bbox().p1.x; - float badguyWidth = badguy->get_bbox().p2.x - badguy->get_bbox().p1.x; - - if ((dx > -playerWidth) && (dx < badguyWidth)) { - if (dy > 0) { - attackDirection.x = 0; - attackDirection.y = -1; - } else { - attackDirection.x = 0; - attackDirection.y = 1; - } - if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) { - sprite->set_action("charging"); - timer.start(CHARGE_TIME); - state = CHARGING; - } - } else - if ((dy > -playerHeight) && (dy < badguyHeight)) { - if (dx > 0) { - attackDirection.x = 1; - attackDirection.y = 0; - } else { - attackDirection.x = -1; - attackDirection.y = 0; - } - if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) { - sprite->set_action("charging"); - timer.start(CHARGE_TIME); - state = CHARGING; - } - } + MovingObject* player = this->get_nearest_player(); + if(player) { + MovingObject* badguy = this; + const Vector playerPos = player->get_pos(); + const Vector badguyPos = badguy->get_pos(); + float dx = (playerPos.x - badguyPos.x); + float dy = (playerPos.y - badguyPos.y); + + float playerHeight = player->get_bbox().p2.y - player->get_bbox().p1.y; + float badguyHeight = badguy->get_bbox().p2.y - badguy->get_bbox().p1.y; + + float playerWidth = player->get_bbox().p2.x - player->get_bbox().p1.x; + float badguyWidth = badguy->get_bbox().p2.x - badguy->get_bbox().p1.x; + + if ((dx > -playerWidth) && (dx < badguyWidth)) { + if (dy > 0) { + attackDirection.x = 0; + attackDirection.y = 1; + } else { + attackDirection.x = 0; + attackDirection.y = -1; + } + if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) { + sprite->set_action("charging"); + timer.start(CHARGE_TIME); + state = CHARGING; + } + } else + if ((dy > -playerHeight) && (dy < badguyHeight)) { + if (dx > 0) { + attackDirection.x = 1; + attackDirection.y = 0; + } else { + attackDirection.x = -1; + attackDirection.y = 0; + } + if ((attackDirection.x != oldWallDirection.x) || (attackDirection.y != oldWallDirection.y)) { + sprite->set_action("charging"); + timer.start(CHARGE_TIME); + state = CHARGING; + } + } + } } if (state == CHARGING) { @@ -145,8 +133,8 @@ AngryStone::active_update(float elapsed_time) { timer.start(ATTACK_TIME); state = ATTACKING; physic.enable_gravity(false); - physic.set_velocity_x(SPEED * attackDirection.x); - physic.set_velocity_y(SPEED * attackDirection.y); + physic.set_velocity_x(CHARGE_SPEED * attackDirection.x); + physic.set_velocity_y(CHARGE_SPEED * attackDirection.y); oldWallDirection.x = 0; oldWallDirection.y = 0; } @@ -175,4 +163,4 @@ AngryStone::active_update(float elapsed_time) { } -IMPLEMENT_FACTORY(AngryStone, "angrystone") +/* EOF */