From 20f975e6fefc179e110cff27d424ec231b8d3801 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Wed, 30 Mar 2005 03:02:01 +0000 Subject: [PATCH] added unstable_tile object SVN-Revision: 2296 --- data/images/shared/unstable_tile.png | Bin 0 -> 2240 bytes data/images/supertux.strf | 5 +++ src/object/unstable_tile.cpp | 79 +++++++++++++++++++++++++++++++++++ src/object/unstable_tile.h | 36 ++++++++++++++++ src/timer.h | 3 ++ 5 files changed, 123 insertions(+) create mode 100644 data/images/shared/unstable_tile.png create mode 100644 src/object/unstable_tile.cpp create mode 100644 src/object/unstable_tile.h diff --git a/data/images/shared/unstable_tile.png b/data/images/shared/unstable_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..f98477131603f0d624fc02299938fa4163a269b9 GIT binary patch literal 2240 zcmV;x2tW6UP)WFU8GbZ8({Xk{QrNlj4iWF>9@00<;WL_t(o!|hg0Y+P3r z{_fBFnK$pfv1c4Rj)%$ENg9$iiCd*KO-t(tsYS4g6v~DLh!xYSELxCKDQU}s1rkCc zWOgJ}LP$t}P*kZkNgGF%kdu-Gn*`iu9LFIw8UH07zu$T9-pe8{m1EqdAa-!1ySTdd zo}cfY^PL0yU;fvH{1(eC_t_+t|E$^Uq&=@x?!`i9l~}@2f%xJ5AHa zk|fy@$FU)V2o1xC(==5{l1M3~0ALY9Y|eR6*Yy-Y0^pkf%GoLaFfv4+1<>{2gAZbE zZVrQkgM9#Q(bdKag#w0#hCnGjpzHc}LP-AZSr7zn6h$Qf>nWwZN~xj{A}@qU089b6 z4xksnIsgs;9l%FfwQU?58+(LOiej;dv9Yns08ZS4z`Awoez0rTuEW)86^yaAWm!{k z9G9e&PMW42Qc9|nqMY-TbM7mpbV_N`ZnrOMns$kEUIO3(=mwAna0|c<0B-{b(lqT2 z!w{D*Uxw#-ZvxnOj|2Vv{f=pxn3`VRuzy|P~=Xssuo;??R-~Xo)=120%^I3_Q>4mr~lCbK(2G;+(_x{SHEip_H0748u1J zqmK|$%<|wX0Ir=pd2(FW^}!uGb|6d8v-dc#u&^K(78U>ijYi{3l}hE;j^ms*4C9pN zd5?0=`zWOjfFkFd20_5%IOdEoA%yUfBss?zvni#!G)>bOV~wl=EC4?%l}ZPCdV1jd zJ^=gED6pO_}l+tkkIm0lx5P~F05~pdZOw-gk=ORthhEnQBxm>P8O8K2AigIb1 z-cU-70(b^ME=$D6r>3To$;rvPOnHY1>-D+|-~j+%0I+la{{1tJMq{g#5>XTtecvzT z^Z8}NFlN&<4O*?1mCxrlIF2KNAebVAyyd#?LrSUVq?A2LlC%jSe`kz60iY{0-UXo9 zXf$S47#{*K!U6mkzy<&zfW?lEj?s3zy~VPuvT2%_ot>@p_xHaorL@8@WUlKf*LA}r zNtTm4jP&@eTenK4X>R14LrUq{wp}5FSW?PGrBuWiD*`CA+wJzM{xZU|68QkYG5`jk zymRNyo7b;jFE1`GVrFKh5Cnl=sZ{!e5bG$Vi=OAjVHol-47-$4Wu=s5nkJ$sYEepc z#+c@Lo*&0?K`9k=c6REFv6H^<7Xf^4WztaqrvS`leV`w}I@`7zOG``B=g*(V#KZ(R z=LZ0EQcAA?AZeOPDdiLZPARo*+a{W(&Bt*}l~T^~^0K|WyxbiGfhMJllv2M3aA_^t z=Kvnd%A^P&25<$yUvJ*L`GG zckkY5DJ4Gq@Iwp_4{y_T{S;$t&iDO+BuO5klu}*S5k--ieGijThH0860G4!JKbz0z zfAReD&p)!t`0FbNl2HKfXAn&R=m78y02{V$-TL0?)2BC1PEKNeettWEfhdYTpCn12 zlv0yY(lkwF5CkS;42-cGQc8_6meVxt1Ix1BV2oV{aBYS0eOY(>7=c3o-l)}T=dw!J z2jFu6uJ!fx9l3b%;+bZ%iO$YWOiWDtP}lXGX_|9F2*wyo^7(w*ah%k3-EmFRrj=4f zP18Pd9H(ws)_b*D?cG(8kKB_3wOVa{#XbQr2Hy2f+j1O-00@&Lxz=vCpP`gCZQDL{@ZiB#k|gh}8uLc}qp7%Bt*QeD4q$e6 z7Nt_@x0OoeDItVrnx;o76#$xX99M!MV2rVsUwP$~Z%ZkkT4T)Hw^}#5pYeLVZY!m} zW}0ScbaWJjLScJvZ|`z0my?8$1i(!I#VCrphlhvhv17-+E~VVKO3l6ueymjm_miYt zF8}h%l`C*v7sX-`tyXJ&7>2g*`}w7%rH7i$=9aT(&*mD9hO=t&eLX{YFH@yDwQ_|2M4dd@WKlx0F2jaHThZci{Iz}DS+Ks zw=C$ozFaPs51u=B?)^fc@I}{k_4Vu5Z+PjYmwuH|xt*2pjf~jtEB^!@ip2ffi@SLM O0000 + +#include "unstable_tile.h" +#include "lisp/lisp.h" +#include "object_factory.h" +#include "player.h" +#include "sector.h" +#include "resources.h" +#include "special/sprite_manager.h" +#include "special/sprite.h" + +static const float CRACKTIME = 1; +static const float FALLTIME = 1.5; + +UnstableTile::UnstableTile(const lisp::Lisp& lisp) + : hit(false), falling(false) +{ + lisp.get("x", bbox.p1.x); + lisp.get("y", bbox.p1.y); + bbox.set_size(32, 32); + sprite = sprite_manager->create("unstable_tile"); + flags |= FLAG_SOLID; +} + +UnstableTile::~UnstableTile() +{ + delete sprite; +} + +HitResponse +UnstableTile::collision(GameObject& other, const CollisionHit& hitdata) +{ + if(hitdata.normal.y < 0.8) + return FORCE_MOVE; + + Player* player = dynamic_cast (&other); + if(player) + hit = true; + + return FORCE_MOVE; +} + +void +UnstableTile::draw(DrawingContext& context) +{ + Vector pos = get_pos(); + // shacking + if(timer.get_timegone() > CRACKTIME) { + pos.x += (rand() % 6) - 3; + } + + sprite->draw(context, pos, LAYER_TILES); +} + +void +UnstableTile::action(float elapsed_time) +{ + if(falling) { + movement = physic.get_movement(elapsed_time); + if(!Sector::current()->inside(bbox)) { + remove_me(); + return; + } + } else if(hit) { + if(timer.check()) { + falling = true; + physic.enable_gravity(true); + flags &= ~FLAG_SOLID; + timer.stop(); + } else if(!timer.started()) { + timer.start(FALLTIME); + } + } else { + timer.stop(); + } + hit = false; +} + +IMPLEMENT_FACTORY(UnstableTile, "unstable_tile"); diff --git a/src/object/unstable_tile.h b/src/object/unstable_tile.h new file mode 100644 index 000000000..3aca83571 --- /dev/null +++ b/src/object/unstable_tile.h @@ -0,0 +1,36 @@ +#ifndef __UNSTABLE_TILE_H__ +#define __UNSTABLE_TILE_H__ + +#include "special/moving_object.h" +#include "lisp/lisp.h" +#include "math/physic.h" +#include "timer.h" + +namespace SuperTux { + class Sprite; +} +class Player; + +using namespace SuperTux; + +/** A tile that starts falling down if tux stands to long on it */ +class UnstableTile : public MovingObject +{ +public: + UnstableTile(const lisp::Lisp& lisp); + ~UnstableTile(); + + HitResponse collision(GameObject& other, const CollisionHit& hit); + void action(float elapsed_time); + void draw(DrawingContext& context); + +private: + Physic physic; + Sprite* sprite; + Timer2 timer; + bool hit; + bool falling; +}; + +#endif + diff --git a/src/timer.h b/src/timer.h index 4640e575b..9e93c9032 100644 --- a/src/timer.h +++ b/src/timer.h @@ -21,6 +21,9 @@ public: * successfull check */ bool check(); + /** stop the timer */ + void stop() + { start(0); } /** returns the period of the timer or 0 if it isn't started */ float get_period() const -- 2.11.0