X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fplatform.cpp;h=d6dde0a7c983c15032cb53688fafbc71428c3769;hb=5f1c84ed5ce0ab5450f92082a9aaaa9ca0effc39;hp=c0a59a74adedec8a8fc259c3e784ca7279b3ba01;hpb=86181b0a14d89cf45daf97199c3556c4dd1ee7b7;p=supertux.git diff --git a/src/object/platform.cpp b/src/object/platform.cpp index c0a59a74a..d6dde0a7c 100644 --- a/src/object/platform.cpp +++ b/src/object/platform.cpp @@ -1,7 +1,7 @@ // $Id$ // // SuperTux -// Copyright (C) 2005 Marek Moeckel +// Copyright (C) 2006 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -12,49 +12,51 @@ // 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. +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include #include "platform.hpp" -#include +#include +#include "log.hpp" #include "video/drawing_context.hpp" #include "resources.hpp" #include "player.hpp" -#include "sprite/sprite_manager.hpp" +#include "path.hpp" +#include "path_walker.hpp" +#include "sprite/sprite.hpp" #include "lisp/lisp.hpp" #include "object_factory.hpp" +#include "scripting/platform.hpp" +#include "scripting/squirrel_util.hpp" Platform::Platform(const lisp::Lisp& reader) + : MovingSprite(reader, Vector(0,0), LAYER_OBJECTS, COLGROUP_STATIC), name(""), speed(Vector(0,0)) { - std::string use_path; - std::string type; - - reader.get("x", bbox.p1.x); - reader.get("y", bbox.p1.y); - reader.get("type", type); - reader.get("use_path", use_path); - sprite = sprite_manager->create("platform"); - sprite->set_action(type); - bbox.set_size(sprite->get_width(), sprite->get_height()); - + bool running = true; + reader.get("name", name); + reader.get("running", running); + const lisp::Lisp* pathLisp = reader.get_lisp("path"); + if(pathLisp == NULL) + throw std::runtime_error("No path specified for platform"); + path.reset(new Path()); + path->read(*pathLisp); + walker.reset(new PathWalker(path.get(), running)); + bbox.set_pos(path->get_base()); + flags |= FLAG_SOLID; - - path = Path::GetByName(use_path); - if (path == NULL) { - std::cerr << "Warning: Path for moving platform not found! Make sure that the name is spelled correctly,\nand that the path is initialized before the platform in the level file!\n"; - } - - path_offset = bbox.p1 - path->GetStart(); } -Platform::~Platform() +Platform::Platform(const Platform& other) + : MovingSprite(other), ScriptInterface(other), name(other.name), speed(other.speed) { - delete sprite; + path.reset(new Path(*other.path)); + walker.reset(new PathWalker(*other.walker)); + walker->path = &*path; } //TODO: Squish Tux when standing between platform and solid tile/object @@ -64,30 +66,58 @@ HitResponse Platform::collision(GameObject& other, const CollisionHit& hit) { if (typeid(other) == typeid(Player)) { - Player* player = (Player*) &other; - if ((hit.normal.x == 0) && (hit.normal.y == 1)) { + if (hit.normal.y >= 0.9) { //Tux is standing on the platform - player->movement += path->GetLastMovement(); + //Player* player = (Player*) &other; + //player->add_velocity(speed * 1.5); + return PASS_MOVEMENT; } } if(other.get_flags() & FLAG_SOLID) { //Collision with a solid tile - //does nothing, because the movement vector isn't used at the moment return ABORT_MOVE; } return FORCE_MOVE; } void -Platform::update(float ) +Platform::update(float elapsed_time) +{ + movement = walker->advance(elapsed_time); + speed = movement / elapsed_time; +} + +void +Platform::goto_node(int node_no) +{ + walker->goto_node(node_no); +} + +void +Platform::start_moving() +{ + walker->start_moving(); +} + +void +Platform::stop_moving() +{ + walker->stop_moving(); +} + +void +Platform::expose(HSQUIRRELVM vm, SQInteger table_idx) { - set_pos(path->GetPosition() + path_offset); + if (name == "") return; + Scripting::Platform* interface = new Scripting::Platform(this); + expose_object(vm, table_idx, interface, name, true); } void -Platform::draw(DrawingContext& context) +Platform::unexpose(HSQUIRRELVM vm, SQInteger table_idx) { - sprite->draw(context, get_pos(), LAYER_OBJECTS); + if (name == "") return; + Scripting::unexpose_object(vm, table_idx, name); } IMPLEMENT_FACTORY(Platform, "platform");