From b36f0720092c79e0ea0ca65ad6aa6ee68c1a2ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Mon, 11 Apr 2016 02:49:40 +0200 Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20initiale=20des=20blocs=20?= =?UTF-8?q?d'arriv=C3=A9e=20/=20tueurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/block.hpp | 4 +- include/finish_block.hpp | 60 ++++++++++++++++++++++++++ include/gravity_block.hpp | 4 +- include/kill_block.hpp | 60 ++++++++++++++++++++++++++ include/widget_toolbar.hpp | 10 +++++ res/textures/finish_block.tga | Bin 0 -> 2302 bytes res/textures/kill_block.tga | Bin 0 -> 3535 bytes res/textures/toolbar_finish_block.tga | Bin 0 -> 1173 bytes res/textures/toolbar_kill_block.tga | Bin 0 -> 1490 bytes src/block.cpp | 25 +++++------ src/finish_block.cpp | 42 ++++++++++++++++++ src/gravity_block.cpp | 5 +-- src/kill_block.cpp | 41 ++++++++++++++++++ src/widget_toolbar.cpp | 31 +++++++++++-- 14 files changed, 257 insertions(+), 25 deletions(-) create mode 100644 include/finish_block.hpp create mode 100644 include/kill_block.hpp create mode 100644 res/textures/finish_block.tga create mode 100644 res/textures/kill_block.tga create mode 100644 res/textures/toolbar_finish_block.tga create mode 100644 res/textures/toolbar_kill_block.tga create mode 100644 src/finish_block.cpp create mode 100644 src/kill_block.cpp diff --git a/include/block.hpp b/include/block.hpp index 4a5f644..ed71f85 100644 --- a/include/block.hpp +++ b/include/block.hpp @@ -46,9 +46,9 @@ public: virtual float getRadius() const; /** - * Calcule la texture à afficher pour ce bloc + * Prépare les textures avant le dessin du bloc */ - virtual std::string getTexture(); + virtual void prepareDraw(ResourceManager& resources); /** * Dessin du bloc dans la fenêtre donnée diff --git a/include/finish_block.hpp b/include/finish_block.hpp new file mode 100644 index 0000000..8365813 --- /dev/null +++ b/include/finish_block.hpp @@ -0,0 +1,60 @@ +#ifndef __PTF_FINISH_BLOCK_HPP__ +#define __PTF_FINISH_BLOCK_HPP__ + +#include +#include +#include "block.hpp" +#include "level.hpp" + +class FinishBlock : public Block { +public: + typedef std::shared_ptr Ptr; + +protected: + /** + * Initialisation des propriétés du bloc d'arrivée donné + * depuis le fichier donné + */ + static void init(std::ifstream& file, Object::Ptr object); + +public: + /** + * Identifiant unique du type "bloc d'arrivée" + */ + static const unsigned int TYPE_ID; + + FinishBlock(); + virtual ~FinishBlock(); + + /** + * Clone ce bloc d'arrivée en un bloc d'arrivée avec les mêmes propriétés + */ + virtual Object::Ptr clone() const; + + /** + * Prépare les textures avant le dessin du bloc + */ + virtual void prepareDraw(ResourceManager& resources); + + /** + * Appelé lorsque le bloc d'arrivée est activé par un objet + */ + virtual void activate(Level& level, Object* object); + + /** + * Récupère l'identifiant de type des blocs d'arrivée + */ + virtual unsigned int getTypeId() const; + + /** + * Chargement d'un bloc d'arrivée depuis le fichier donné + */ + static Object::Ptr load(std::ifstream& file); + + /** + * Sauvegarde le bloc d'arrivée dans le fichier donné + */ + virtual void save(std::ofstream& file) const; +}; + +#endif diff --git a/include/gravity_block.hpp b/include/gravity_block.hpp index d765e54..f27d131 100644 --- a/include/gravity_block.hpp +++ b/include/gravity_block.hpp @@ -35,9 +35,9 @@ public: virtual Object::Ptr clone() const; /** - * Calcule la texture à afficher pour ce bloc + * Prépare les textures avant le dessin du bloc */ - virtual std::string getTexture(); + virtual void prepareDraw(ResourceManager& resources); /** * Appelé lorsque le bloc de gravité est activé par un objet diff --git a/include/kill_block.hpp b/include/kill_block.hpp new file mode 100644 index 0000000..eb5f6c9 --- /dev/null +++ b/include/kill_block.hpp @@ -0,0 +1,60 @@ +#ifndef __PTF_KILL_BLOCK_HPP__ +#define __PTF_KILL_BLOCK_HPP__ + +#include +#include +#include "block.hpp" +#include "level.hpp" + +class KillBlock : public Block { +public: + typedef std::shared_ptr Ptr; + +protected: + /** + * Initialisation des propriétés du bloc tueur donné + * depuis le fichier donné + */ + static void init(std::ifstream& file, Object::Ptr object); + +public: + /** + * Identifiant unique du type "bloc tueur" + */ + static const unsigned int TYPE_ID; + + KillBlock(); + virtual ~KillBlock(); + + /** + * Clone ce bloc tueur en un bloc tueur avec les mêmes propriétés + */ + virtual Object::Ptr clone() const; + + /** + * Prépare les textures avant le dessin du bloc + */ + virtual void prepareDraw(ResourceManager& resources); + + /** + * Appelé lorsque le bloc tueur est activé par un objet + */ + virtual void activate(Level& level, Object* object); + + /** + * Récupère l'identifiant de type des blocs tueurs + */ + virtual unsigned int getTypeId() const; + + /** + * Chargement d'un bloc tueur depuis le fichier donné + */ + static Object::Ptr load(std::ifstream& file); + + /** + * Sauvegarde le bloc tueur dans le fichier donné + */ + virtual void save(std::ofstream& file) const; +}; + +#endif diff --git a/include/widget_toolbar.hpp b/include/widget_toolbar.hpp index 3c3481b..768dc5d 100644 --- a/include/widget_toolbar.hpp +++ b/include/widget_toolbar.hpp @@ -67,6 +67,16 @@ private: */ Object::Ptr createPlayer(); + /** + * Crée un objet de type FinishBlock + */ + Object::Ptr createFinishBlock(); + + /** + * Crée un objet de type KillBlock + */ + Object::Ptr createKillBlock(); + /** * Crée un objet de type GravityBlock */ diff --git a/res/textures/finish_block.tga b/res/textures/finish_block.tga new file mode 100644 index 0000000000000000000000000000000000000000..18a4c65e6b022bb677fa5c7d307901d5d56a8d69 GIT binary patch literal 2302 zcmb`IO-vI}5XX17AC#7lVpI@X#C8!LZ36!w4wB2f^n1GeecchKht?{XDSF< zA$e5^HA0yNXUtzvP_QoHNTbm_hqvU#b-b8=adD9;aAY={H?p&{U%*)Mpbf8tU5TU7 z(a|)9#0037b-K6MWoh5Y>dHLf8qFE4yJ zLvC&^U-37?IyZ(+r{f#6TJ3>`4X!K5{E!AH6#iZvXvoUSig1G;Xi%%wd<7V`60YXv z<`|6<2c=S}wnU{;xe2=&aq9K@%|0mYhzA~9BE*Tcw6w(Ozy(Alg+g%$c5Bn;^RZ{M zv$ISZ8yjPA+|lOd<~V&i0=SD}{R;p$;MNWf4su}n7!ls4ZyLKv4eUkO?RIl$`o@W- zT0y!R4&irudwV?dhfwWc{B5d1q|X2yY-?-V&7`R&k&aPqBV7T%WVyAqHP(koiZe4a zY;tmv^=70@l`lw=v_l;PwWSd0huv3Tui`2uz!>ppBf(_zKu~!W| zqkj%msvz%|7K>$le0-dBPfScO(cy4l7h;cbCb?WLmXnjSjjA4a2qN4P{Mx532>MF| z{VME4>`8JKg1n->Bv}oE4>U_HU4*5N|7qz0_?l1m_0LOINjmbWLpFx)E6s+`J+mR$ zEEk8a%cVgJDO; zC+XM3C6o>hAgBZ{OW{RLJ-^D20}gZmYz{pH5sLwGlxE?zrIy@SH3!6CT; zQM}v`oPqm6xpDQfTogVwkcx&CdQPpfESO3|wjo?jUQIV{)!OTC);Bhsy?wR*T5Xl^ E2T#^9#Q*>R literal 0 HcmV?d00001 diff --git a/res/textures/kill_block.tga b/res/textures/kill_block.tga new file mode 100644 index 0000000000000000000000000000000000000000..010385da05a96104bf7f18285ff6d9d1322c2890 GIT binary patch literal 3535 zcmZvfS7=pf5XbL5H>PW1P$LS959$ib3W5QC>`r-#!^XetbX#*{%pyH;kY)NKTzPRc6ngEt4ltR{Q1UdO#}!YG z6HhL8jHa^Y&Yi1qP-*0zIA+b7C7U;ImfgE|OHNLX%$YMs@LgS9?Z~3Xvs%&&taka! zcKqezFZk}=yQ;rt%^F30!h{LxZ^@D+;-5Bcn)vXtWy=<=d-AM$YCYFweU)QfV~7Hk zva&MOjf;zu4I4Jd+O=zC{`~nGJ@vb2(IUYcNORt?V@ItwDnE}H)mNU&m*4TV8mW-I zd-tjzkOzf9g9b@nUY?8@Ge(|0duC@L1bj!08l{y@C)~StPjf}ysAjdL9`o_&3+yId zw=@5mcuWEfl(1~sGA&gS@c8j#JufLK5z3oZB56<%SAX^Dm9`Ht18ZVpqF#6F)~%{{ z=gu9OK7G2x$HyyWk$8#@C~MJ>0v8x9>cT20DA4>JKYm<5q%IuLUZwkseKNvyLRnzf+{2^Z)s_%goK2Ag17aE z0;7;`-n^;LIK(7P0zQ~f$_PS&5J0qP)251)pDRaj_rk(L)q#e<6yoLZ+_`how{Krf zaUDKIgyM;ciu%_?VR(`E%|T=7(xuu_1jGcuFx-X!-{D6(o#(-W2Wu#F1kZHx(W6Ig zYr(J+Z!cW9ps7N8;>3w^`SN93LOuU1kQUH82#g**+5wR2fOs*98NzPUri}(kiBdsO z0k>`5yt$r30mx%ZujtFl%F>#lcCe^#0|IH*tl2w#RKUHPHf@pv2M*ZqTV1<$)jOK` zDfE_j9K&92NB`=3D>5=t9zJ|1J$m%8U09s2T)9%`NIn1Cw>PP@ohl_*kY$Gs9kiyQ z3-NiqUZEU9 z?>EUNLpH&OF1koEKnH{>XZhtJwrG=LG_KpZm8^KuEATn zQF-BS*sHNpXlUrifN)t8NE)B&(M#h3TjOeR6zu|pztYpwm0k)JVd@8zX|Be~aG845 zQDniyj1B5l2cgBB>cpPOFjf5MhHMoNfhYgPH28{Wn&pn0> zK3m3VR!mIH2Uw^a#@2|wXE^W?*g*61el+IjPvdGkfcX>#-#iG`ST zq^+&3I5#>vTI5|W*L#!6v<^URic!PE!}6Rg%T%+pwDfswZ0xHfNzcJlKc%*7(LOmj z`7NDJQ;7HinWUPjIb^;sFE3N%Y&IKmXA)|TJLL8g2x>B!424%W0Mh>fjKyO6Nd))re%tlH@Dc&Z!SZg+tfMR6w*iEKi*w(h~7BIk5EDdCU%lGs7JmptcSLwjOfD(_#Ke3h)SepWmld)JVx1!PL&Ivd;IHMlV2uXDK^ zO{zR*nHCC#l$Ms3(li#!>2x}?!{Nv!J32a^aCW=>snKYBbq6(~*XuX#G763+kQ+=> zUETcOs~U(S)StROBQ;fqq~?;}CX{TK3Dw@lmyTl#V#DKSNlC0w9*&P752W)I2P;tx zr4Z7L0(GY?mGPDTARzU_C}?a`Dq{> mQ-eP9uvIJvtc}XKSxoTgyA~L7g}g!URsY4X+uQGICqDqch3CQm literal 0 HcmV?d00001 diff --git a/res/textures/toolbar_kill_block.tga b/res/textures/toolbar_kill_block.tga new file mode 100644 index 0000000000000000000000000000000000000000..318f6bbb54b4a8dac8eb9336704529998b1c0fec GIT binary patch literal 1490 zcmZuxNl05!6#YLDwYn;_=t6Kn7cSa`3vnTWL)2(Yr4!YS3qiDq6ADf^BvG^)XK+O8 zfTB`x9;g#FD1w3@>Ov)ImC{8EU9?!Ly?y5<(FFS!3IF|j&pYp&bDt!+Nw&vR@|1jB zC2w!<%ZB9SxLs3JVKqdwZLXj*h6Qsfk)!TghlN(%#-4 z9UdN1d3ialuC7u;L&Gg3 zzP>(!7L}-$p@QIhQwdn5J+33H>&(my<>%*9Sy>r1Ha1dMR~HLXTU$#hDJe8EGD1v% zA%*leIzTGyAs>R}#KZ(E2yWnt^QWe!($>}%Ei5dsn%UXeyf!^OO?thaHyRroW6uQJ zzj{E+Vr!`Ikzw20+i7!ilSW5J+4$VtTsk;7pt-p@N=!^-h?A2OmKN|mJw0q7B4HJQ z41kriTJ0r6LZyt13>q99r2hVXT3=tMsHiBKnwlb1;ypY(oK{v=sJXeBz!vq$%RR^o zH(LM@NocRr=~z)AGzA3(@mf++65+ivJw2VAP_?_eYj3}mV?sj01$)jex`8Qj0~6po zl8WYmfdS6^#>NKW&?b|~(RVAHMx(KVQ>?A6QBhG5hrEhog2*GR4xzC&$H&KizT={p zpP%P|Kx|7h^n*SBYmSSHvulP#VwRt5wFd=Sf5#^vQ@QsBl34Gq0) zX=x!IA4%lxOv$4tNwO$@FS!1^U(DkxMMg%R@?|3j1_r(pgY$zco$O%|+=z&XQ@-wG ze}Df9aanxhI;DM`2=*yosj`ocPoW6USI1q0gM%-sKuq@Y^LrZ>7G^dIFU_(z*}1#B b`*$m6>E-iRs@Lil>Sx*~Z=%&2)l=yo!1!6A literal 0 HcmV?d00001 diff --git a/src/block.cpp b/src/block.cpp index 98d6af8..3159af9 100644 --- a/src/block.cpp +++ b/src/block.cpp @@ -6,12 +6,7 @@ const unsigned int Block::TYPE_ID = 2; -Block::Block() : Object() { - // déplacement de l'origine au centre du bloc - sprite.setOrigin(sf::Vector2f(23, 23)); - select_sprite.setOrigin(sf::Vector2f(23, 23)); -} - +Block::Block() : Object() {} Block::~Block() {} Object::Ptr Block::clone() const { @@ -34,18 +29,24 @@ void Block::save(std::ofstream& file) const { Object::save(file); } -std::string Block::getTexture() { +void Block::prepareDraw(ResourceManager& resources) { + std::string texture_name = "movable_block.tga"; + if (getMass() == 0) { - return "block.tga"; + texture_name = "block.tga"; } - return "movable_block.tga"; + sprite.setTexture(resources.getTexture(texture_name)); + sprite.setOrigin(sf::Vector2f(23, 23)); + + select_sprite.setTexture(resources.getTexture("block_select.tga")); + select_sprite.setOrigin(sf::Vector2f(23, 23)); } void Block::draw(Level& level) { // utilisation de la texture sf::RenderWindow& window = level.getWindow(); - sprite.setTexture(level.getResourceManager().getTexture(getTexture())); + prepareDraw(level.getResourceManager()); // coloration du bloc selon sa charge if (getCharge() > 0) { @@ -61,10 +62,6 @@ void Block::draw(Level& level) { if (isSelected()) { select_sprite.setPosition(getPosition()); - select_sprite.setTexture( - level.getResourceManager().getTexture("block_select.tga") - ); - window.draw(select_sprite); } } diff --git a/src/finish_block.cpp b/src/finish_block.cpp new file mode 100644 index 0000000..c50e0f6 --- /dev/null +++ b/src/finish_block.cpp @@ -0,0 +1,42 @@ +#include "finish_block.hpp" +#include "level.hpp" + +const unsigned int FinishBlock::TYPE_ID = 4; + +FinishBlock::FinishBlock() : Block() {} +FinishBlock::~FinishBlock() {} + +Object::Ptr FinishBlock::clone() const { + return Object::Ptr(new FinishBlock(*this)); +} + +void FinishBlock::prepareDraw(ResourceManager& resources) { + Block::prepareDraw(resources); + sprite.setOrigin(sf::Vector2f(23, 41)); + sprite.setTexture(resources.getTexture("finish_block.tga"), true); +} + +void FinishBlock::activate(Level& level, Object* object) { + Block::activate(level, object); + // TODO: implémenter le comportmeent des blocs d'arrivée +} + +unsigned int FinishBlock::getTypeId() const { + return TYPE_ID; +} + +void FinishBlock::init(std::ifstream& file, Object::Ptr object) { + // lecture des propriétés d'un bloc + Block::init(file, object); +} + +Object::Ptr FinishBlock::load(std::ifstream& file) { + Object::Ptr object = Object::Ptr(new FinishBlock); + FinishBlock::init(file, object); + return object; +} + +void FinishBlock::save(std::ofstream& file) const { + // écriture des propriétés d'un bloc + Block::save(file); +} diff --git a/src/gravity_block.cpp b/src/gravity_block.cpp index c279914..8d717c3 100644 --- a/src/gravity_block.cpp +++ b/src/gravity_block.cpp @@ -10,8 +10,7 @@ Object::Ptr GravityBlock::clone() const { return Object::Ptr(new GravityBlock(*this)); } -std::string GravityBlock::getTexture() { - // texturage et coloration du bloc selon ses propriétés +void GravityBlock::prepareDraw(ResourceManager& resources) { std::string texture_name = "gravity_block_"; switch (gravity_direction) { @@ -32,7 +31,7 @@ std::string GravityBlock::getTexture() { break; } - return texture_name + ".tga"; + sprite.setTexture(resources.getTexture(texture_name + ".tga")); } void GravityBlock::activate(Level& level, Object* object) { diff --git a/src/kill_block.cpp b/src/kill_block.cpp new file mode 100644 index 0000000..56a527f --- /dev/null +++ b/src/kill_block.cpp @@ -0,0 +1,41 @@ +#include "kill_block.hpp" +#include "level.hpp" + +const unsigned int KillBlock::TYPE_ID = 5; + +KillBlock::KillBlock() : Block() {} +KillBlock::~KillBlock() {} + +Object::Ptr KillBlock::clone() const { + return Object::Ptr(new KillBlock(*this)); +} + +void KillBlock::prepareDraw(ResourceManager& resources) { + Block::prepareDraw(resources); + sprite.setTexture(resources.getTexture("kill_block.tga")); +} + +void KillBlock::activate(Level& level, Object* object) { + Block::activate(level, object); + // TODO: implémenter le comportmeent des blocs tueurs +} + +unsigned int KillBlock::getTypeId() const { + return TYPE_ID; +} + +void KillBlock::init(std::ifstream& file, Object::Ptr object) { + // lecture des propriétés d'un bloc + Block::init(file, object); +} + +Object::Ptr KillBlock::load(std::ifstream& file) { + Object::Ptr object = Object::Ptr(new KillBlock); + KillBlock::init(file, object); + return object; +} + +void KillBlock::save(std::ofstream& file) const { + // écriture des propriétés d'un bloc + Block::save(file); +} diff --git a/src/widget_toolbar.cpp b/src/widget_toolbar.cpp index 7e69c91..bdbf577 100644 --- a/src/widget_toolbar.cpp +++ b/src/widget_toolbar.cpp @@ -2,6 +2,8 @@ #include "block.hpp" #include "player.hpp" #include "gravity_block.hpp" +#include "finish_block.hpp" +#include "kill_block.hpp" #include const int PADDING = 8; @@ -42,6 +44,14 @@ Object::Ptr WidgetToolbar::createPlayer() { return player; } +Object::Ptr WidgetToolbar::createFinishBlock() { + return Object::Ptr(new FinishBlock); +} + +Object::Ptr WidgetToolbar::createKillBlock() { + return Object::Ptr(new KillBlock); +} + Object::Ptr WidgetToolbar::createGravityBlock(GravityDirection direction) { GravityBlock::Ptr gravity_block = GravityBlock::Ptr(new GravityBlock); gravity_block->setGravityDirection(direction); @@ -59,23 +69,36 @@ Object::Ptr WidgetToolbar::createObject() { WidgetToolbar::WidgetToolbar(Manager& manager) : manager(manager), selected(nullptr) { // catégorie des objets plaçables de base ResourceManager& resources = manager.getResourceManager(); - ToolbarCategory::Ptr basic_cat = addCategory("BASE"); + ToolbarCategory::Ptr block_cat = addCategory("BLOCS"); - selected = basic_cat->addObject( + selected = block_cat->addObject( resources.getTexture("toolbar_block.tga"), std::bind(&WidgetToolbar::createBlock, this) ); - basic_cat->addObject( + block_cat->addObject( resources.getTexture("toolbar_movable_block.tga"), std::bind(&WidgetToolbar::createMovableBlock, this) ); - basic_cat->addObject( + // catégorie des blocs contrôlant les joueurs + ToolbarCategory::Ptr player_cat = addCategory("JOUEURS"); + + player_cat->addObject( resources.getTexture("toolbar_player.tga"), std::bind(&WidgetToolbar::createPlayer, this) ); + player_cat->addObject( + resources.getTexture("toolbar_kill_block.tga"), + std::bind(&WidgetToolbar::createKillBlock, this) + ); + + player_cat->addObject( + resources.getTexture("toolbar_finish_block.tga"), + std::bind(&WidgetToolbar::createFinishBlock, this) + ); + // catégorie des blocs changeant la gravité ToolbarCategory::Ptr gravity_cat = addCategory(L"GRAVITÉ");