From 11a3b78a422c0deac010eef7de06c97d6b83bad0 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Fri, 25 May 2007 14:29:37 +0000 Subject: [PATCH] text object supports anchor points now SVN-Revision: 5013 --- src/object/text_object.cpp | 15 ++-- src/object/text_object.hpp | 33 +++++++++ src/scripting/text.hpp | 5 ++ src/scripting/wrapper.cpp | 168 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+), 4 deletions(-) diff --git a/src/object/text_object.cpp b/src/object/text_object.cpp index aa16a2989..42716282b 100644 --- a/src/object/text_object.cpp +++ b/src/object/text_object.cpp @@ -23,12 +23,14 @@ #include #include "resources.hpp" +#include "main.hpp" #include "video/drawing_context.hpp" #include "scripting/squirrel_util.hpp" #include "log.hpp" TextObject::TextObject(std::string name) - : fading(0), fadetime(0), visible(false) + : fading(0), fadetime(0), visible(false), anchor(ANCHOR_MIDDLE), + pos(0, 0) { this->name = name; font = blue_text; @@ -124,12 +126,17 @@ TextObject::draw(DrawingContext& context) return; } - context.draw_filled_rect(Vector(125, 50), Vector(550, 120), + float width = 500; + float height = 70; + Vector spos = pos + get_anchor_pos(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), + width, height, anchor); + + context.draw_filled_rect(spos, Vector(width, height), Color(0.6f, 0.7f, 0.8f, 0.5f), LAYER_GUI-50); if (centered) { - context.draw_center_text(font, text, Vector(0, 50+35), LAYER_GUI-40); + context.draw_center_text(font, text, spos, LAYER_GUI-40); } else { - context.draw_text(font, text, Vector(125+35, 50+35), ALIGN_LEFT, LAYER_GUI-40); + context.draw_text(font, text, spos + Vector(10, 10), ALIGN_LEFT, LAYER_GUI-40); } context.pop_transform(); diff --git a/src/object/text_object.hpp b/src/object/text_object.hpp index 20581add6..b5e0862ec 100644 --- a/src/object/text_object.hpp +++ b/src/object/text_object.hpp @@ -23,6 +23,7 @@ #include "game_object.hpp" #include "scripting/text.hpp" #include "script_interface.hpp" +#include "anchor_point.hpp" class Font; @@ -45,6 +46,36 @@ public: void set_centered(bool centered); bool is_visible(); + void set_anchor_point(AnchorPoint anchor) { + this->anchor = anchor; + } + AnchorPoint get_anchor_point() const { + return anchor; + } + + void set_pos(const Vector& pos) { + this->pos = pos; + } + void set_pos(float x, float y) { + set_pos(Vector(x, y)); + } + const Vector& get_pos() const { + return pos; + } + float get_pos_x() { + return pos.x; + } + float get_pos_y() { + return pos.y; + } + + void set_anchor_point(int anchor) { + set_anchor_point((AnchorPoint) anchor); + } + int get_anchor_point() { + return (int) get_anchor_point(); + } + void draw(DrawingContext& context); void update(float elapsed_time); @@ -55,6 +86,8 @@ private: float fadetime; bool visible; bool centered; + AnchorPoint anchor; + Vector pos; }; #endif diff --git a/src/scripting/text.hpp b/src/scripting/text.hpp index d25febfa7..89ff0f3a9 100644 --- a/src/scripting/text.hpp +++ b/src/scripting/text.hpp @@ -37,6 +37,11 @@ public: virtual void fade_out(float fadetime) = 0; virtual void set_visible(bool visible) = 0; virtual void set_centered(bool centered) = 0; + virtual void set_pos(float x, float y) = 0; + virtual float get_pos_x() = 0; + virtual float get_pos_y() = 0; + virtual void set_anchor_point(int anchor) = 0; + virtual int get_anchor_point() = 0; }; } diff --git a/src/scripting/wrapper.cpp b/src/scripting/wrapper.cpp index 216758891..91c0cda0b 100644 --- a/src/scripting/wrapper.cpp +++ b/src/scripting/wrapper.cpp @@ -1062,6 +1062,144 @@ static SQInteger Text_set_centered_wrapper(HSQUIRRELVM vm) } +static SQInteger Text_set_pos_wrapper(HSQUIRRELVM vm) +{ + SQUserPointer data; + if(SQ_FAILED(sq_getinstanceup(vm, 1, &data, 0))) { + sq_throwerror(vm, _SC("'set_pos' called without instance")); + return SQ_ERROR; + } + Scripting::Text* _this = reinterpret_cast (data); + SQFloat arg0; + if(SQ_FAILED(sq_getfloat(vm, 2, &arg0))) { + sq_throwerror(vm, _SC("Argument 1 not a float")); + return SQ_ERROR; + } + SQFloat arg1; + if(SQ_FAILED(sq_getfloat(vm, 3, &arg1))) { + sq_throwerror(vm, _SC("Argument 2 not a float")); + return SQ_ERROR; + } + + try { + _this->set_pos(static_cast (arg0), static_cast (arg1)); + + return 0; + + } catch(std::exception& e) { + sq_throwerror(vm, e.what()); + return SQ_ERROR; + } catch(...) { + sq_throwerror(vm, _SC("Unexpected exception while executing function 'set_pos'")); + return SQ_ERROR; + } + +} + +static SQInteger Text_get_pos_x_wrapper(HSQUIRRELVM vm) +{ + SQUserPointer data; + if(SQ_FAILED(sq_getinstanceup(vm, 1, &data, 0))) { + sq_throwerror(vm, _SC("'get_pos_x' called without instance")); + return SQ_ERROR; + } + Scripting::Text* _this = reinterpret_cast (data); + + try { + float return_value = _this->get_pos_x(); + + sq_pushfloat(vm, return_value); + return 1; + + } catch(std::exception& e) { + sq_throwerror(vm, e.what()); + return SQ_ERROR; + } catch(...) { + sq_throwerror(vm, _SC("Unexpected exception while executing function 'get_pos_x'")); + return SQ_ERROR; + } + +} + +static SQInteger Text_get_pos_y_wrapper(HSQUIRRELVM vm) +{ + SQUserPointer data; + if(SQ_FAILED(sq_getinstanceup(vm, 1, &data, 0))) { + sq_throwerror(vm, _SC("'get_pos_y' called without instance")); + return SQ_ERROR; + } + Scripting::Text* _this = reinterpret_cast (data); + + try { + float return_value = _this->get_pos_y(); + + sq_pushfloat(vm, return_value); + return 1; + + } catch(std::exception& e) { + sq_throwerror(vm, e.what()); + return SQ_ERROR; + } catch(...) { + sq_throwerror(vm, _SC("Unexpected exception while executing function 'get_pos_y'")); + return SQ_ERROR; + } + +} + +static SQInteger Text_set_anchor_point_wrapper(HSQUIRRELVM vm) +{ + SQUserPointer data; + if(SQ_FAILED(sq_getinstanceup(vm, 1, &data, 0))) { + sq_throwerror(vm, _SC("'set_anchor_point' called without instance")); + return SQ_ERROR; + } + Scripting::Text* _this = reinterpret_cast (data); + SQInteger arg0; + if(SQ_FAILED(sq_getinteger(vm, 2, &arg0))) { + sq_throwerror(vm, _SC("Argument 1 not an integer")); + return SQ_ERROR; + } + + try { + _this->set_anchor_point(static_cast (arg0)); + + return 0; + + } catch(std::exception& e) { + sq_throwerror(vm, e.what()); + return SQ_ERROR; + } catch(...) { + sq_throwerror(vm, _SC("Unexpected exception while executing function 'set_anchor_point'")); + return SQ_ERROR; + } + +} + +static SQInteger Text_get_anchor_point_wrapper(HSQUIRRELVM vm) +{ + SQUserPointer data; + if(SQ_FAILED(sq_getinstanceup(vm, 1, &data, 0))) { + sq_throwerror(vm, _SC("'get_anchor_point' called without instance")); + return SQ_ERROR; + } + Scripting::Text* _this = reinterpret_cast (data); + + try { + int return_value = _this->get_anchor_point(); + + sq_pushinteger(vm, return_value); + return 1; + + } catch(std::exception& e) { + sq_throwerror(vm, e.what()); + return SQ_ERROR; + } catch(...) { + sq_throwerror(vm, _SC("Unexpected exception while executing function 'get_anchor_point'")); + return SQ_ERROR; + } + +} + static SQInteger Player_release_hook(SQUserPointer ptr, SQInteger ) { Scripting::Player* _this = reinterpret_cast (ptr); @@ -4279,6 +4417,36 @@ void register_supertux_wrapper(HSQUIRRELVM v) throw SquirrelError(v, "Couldn't register function 'set_centered'"); } + sq_pushstring(v, "set_pos", -1); + sq_newclosure(v, &Text_set_pos_wrapper, 0); + if(SQ_FAILED(sq_createslot(v, -3))) { + throw SquirrelError(v, "Couldn't register function 'set_pos'"); + } + + sq_pushstring(v, "get_pos_x", -1); + sq_newclosure(v, &Text_get_pos_x_wrapper, 0); + if(SQ_FAILED(sq_createslot(v, -3))) { + throw SquirrelError(v, "Couldn't register function 'get_pos_x'"); + } + + sq_pushstring(v, "get_pos_y", -1); + sq_newclosure(v, &Text_get_pos_y_wrapper, 0); + if(SQ_FAILED(sq_createslot(v, -3))) { + throw SquirrelError(v, "Couldn't register function 'get_pos_y'"); + } + + sq_pushstring(v, "set_anchor_point", -1); + sq_newclosure(v, &Text_set_anchor_point_wrapper, 0); + if(SQ_FAILED(sq_createslot(v, -3))) { + throw SquirrelError(v, "Couldn't register function 'set_anchor_point'"); + } + + sq_pushstring(v, "get_anchor_point", -1); + sq_newclosure(v, &Text_get_anchor_point_wrapper, 0); + if(SQ_FAILED(sq_createslot(v, -3))) { + throw SquirrelError(v, "Couldn't register function 'get_anchor_point'"); + } + if(SQ_FAILED(sq_createslot(v, -3))) { throw SquirrelError(v, "Couldn't register class 'Text'"); } -- 2.11.0