X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fscripted_object.cpp;h=feace6c078b611dee6b60440a0260c51d85cbaf6;hb=fe138b9ec292ca9679b43cf5c4555f0193bab25d;hp=b9378fde5453ffa21ac358341477fce039a69646;hpb=61fefdd27bed4650cfb515f2511c4fb3de393193;p=supertux.git diff --git a/src/object/scripted_object.cpp b/src/object/scripted_object.cpp index b9378fde5..feace6c07 100644 --- a/src/object/scripted_object.cpp +++ b/src/object/scripted_object.cpp @@ -1,17 +1,38 @@ +// $Id$ +// +// SuperTux +// 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 +// as published by the Free Software Foundation; either version 2 +// 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. + #include #include +#include #include "scripted_object.hpp" #include "video/drawing_context.hpp" #include "sprite/sprite_manager.hpp" +#include "scripting/squirrel_util.hpp" #include "resources.hpp" #include "object_factory.hpp" #include "math/vector.hpp" ScriptedObject::ScriptedObject(const lisp::Lisp& lisp) : solid(true), physic_enabled(true), visible(true), new_vel_set(false), - layer(LAYER_OBJECTS) + z_pos(LAYER_OBJECTS) { lisp.get("name", name); if(name == "") @@ -34,7 +55,7 @@ ScriptedObject::ScriptedObject(const lisp::Lisp& lisp) lisp.get("solid", solid); lisp.get("physic-enabled", physic_enabled); lisp.get("visible", visible); - lisp.get("layer", layer); + lisp.get("z-pos", z_pos); if(solid) flags |= FLAG_SOLID; } @@ -45,6 +66,19 @@ ScriptedObject::~ScriptedObject() } void +ScriptedObject::expose(HSQUIRRELVM vm, SQInteger table_idx) +{ + Scripting::ScriptedObject* interface = static_cast (this); + expose_object(vm, table_idx, interface, name, false); +} + +void +ScriptedObject::unexpose(HSQUIRRELVM vm, SQInteger table_idx) +{ + Scripting::unexpose_object(vm, table_idx, name); +} + +void ScriptedObject::move(float x, float y) { bbox.move(Vector(x, y)); @@ -108,7 +142,7 @@ ScriptedObject::set_action(const std::string& animation) std::string ScriptedObject::get_action() { - return sprite->get_action_name(); + return sprite->get_action(); } std::string @@ -136,11 +170,11 @@ ScriptedObject::draw(DrawingContext& context) if(!visible) return; - sprite->draw(context, get_pos(), layer); + sprite->draw(context, get_pos(), z_pos); } HitResponse -ScriptedObject::collision(GameObject& other, const CollisionHit& ) +ScriptedObject::collision(GameObject& other, const CollisionHit& hit) { if(!physic_enabled) return FORCE_MOVE; @@ -148,8 +182,22 @@ ScriptedObject::collision(GameObject& other, const CollisionHit& ) if(!(other.get_flags() & FLAG_SOLID)) return FORCE_MOVE; - physic.set_velocity(0, 0); - return CONTINUE; + if(other.get_flags() & FLAG_SOLID) { + if(hit.normal.y < 0) { // landed on floor + if(physic.get_velocity_y() < 0) + physic.set_velocity_y(0); + } else if(hit.normal.y > 0) { // bumped against roof + physic.set_velocity_y(.1); + } + + if(fabsf(hit.normal.x) > .9) { // hit on side? + physic.set_velocity_x(0); + } + + return CONTINUE; + } + + return FORCE_MOVE; } IMPLEMENT_FACTORY(ScriptedObject, "scriptedobject");