X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fangrystone.cpp;h=cd74332880ee812673293abf0e4caba1c67f4971;hb=2ad3ecbc14b77d373c796ad04d6389489666cc01;hp=865e43061095fefd0f487ea5a3c9e6f5586ea228;hpb=fea3446f05e1e7673607b835c269d3e8d1929ab3;p=supertux.git diff --git a/src/badguy/angrystone.cpp b/src/badguy/angrystone.cpp index 865e43061..cd7433288 100644 --- a/src/badguy/angrystone.cpp +++ b/src/badguy/angrystone.cpp @@ -1,7 +1,7 @@ // $Id$ // // 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 @@ -22,6 +22,11 @@ #include "angrystone.hpp" +#include "lisp/writer.hpp" +#include "object/player.hpp" +#include "object_factory.hpp" +#include "sprite/sprite.hpp" + static const float SPEED = 240; static const float CHARGE_TIME = .5; @@ -29,8 +34,12 @@ static const float ATTACK_TIME = 1; static const float RECOVER_TIME = .5; AngryStone::AngryStone(const lisp::Lisp& reader) - : BadGuy(reader, "images/creatures/angrystone/angrystone.sprite"), state(IDLE) + : BadGuy(reader, "images/creatures/angrystone/angrystone.sprite"), state(IDLE) { + physic.set_velocity_x(0); + physic.set_velocity_y(0); + physic.enable_gravity(true); + sprite->set_action("idle"); } void @@ -38,22 +47,13 @@ AngryStone::write(lisp::Writer& writer) { writer.start_list("angrystone"); - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); + writer.write("x", start_position.x); + writer.write("y", start_position.y); writer.end_list("angrystone"); } void -AngryStone::activate() -{ - physic.set_velocity_x(0); - physic.set_velocity_y(0); - physic.enable_gravity(true); - sprite->set_action("idle"); -} - -void AngryStone::collision_solid(const CollisionHit& hit) { // TODO @@ -95,47 +95,49 @@ AngryStone::active_update(float elapsed_time) { if (state == IDLE) { MovingObject* player = this->get_nearest_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; + 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; + } } - } 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) {