Advertisement
Mister_Magister

Untitled

Mar 2nd, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.00 KB | None | 0 0
  1. #include "oxygine-framework.h"
  2. #include "game.h"
  3. #include <functional>
  4. #include "helpers/positioning.h"
  5. #include <unistd.h>
  6. #include <ctime>
  7. #include <iostream>
  8. using namespace oxygine;
  9.  
  10. //it is our resources
  11. //in real project you would have more than one Resources declarations.
  12. //It is important on mobile devices with limited memory and you would load/unload them
  13. Resources gameResources;
  14.  
  15. MainActor::~MainActor() {}
  16.  
  17. MainActor::MainActor()
  18. {
  19. srand (time(NULL));
  20. spSprite sky = new Sprite;
  21. sky->setResAnim(gameResources.getResAnim("background"));
  22. sky->attachTo(this);
  23.  
  24. //create Sprites
  25. spSprite sudi = new Sprite();
  26. positioning positions;
  27. srand( time( NULL ) );
  28.  
  29. sudi->setResAnim(gameResources.getResAnim("pudi"));
  30.  
  31. //centered button at screen
  32. positions.alignToBottom(sudi);
  33. positions.alignToLeft(sudi);
  34. //sudi->setPosition(getStage()->getSize().x / 2 - sudi->getSize().x / 2, getStage()->getSize().y - sudi->getSize().y);
  35. /*char test[50];
  36. sprintf(test, "%f", getStage()->getSize().x);
  37. log::messageln(test);*/
  38.  
  39. pauseButton = new Button();
  40. pauseButton->setResAnim(gameResources.getResAnim("button"));
  41. pauseButton->setPosition(VectorT2<float>(5,5));
  42.  
  43. resumeButton = new Button();
  44. resumeButton->setResAnim(gameResources.getResAnim("wznow"));
  45. resumeButton->setSize(resumeButton->getSize()/2);
  46. resumeButton->setPosition(getStage()->getSize()/2 - resumeButton->getSize()/2);
  47. resumeButton->setVisible(false);
  48. resumeButton->setPriority(1001);
  49.  
  50. //register click handler to button
  51. EventCallback cb = CLOSURE(this, &MainActor::pauseButtonClicked);
  52. pauseButton->addEventListener(TouchEvent::CLICK, cb);
  53. resumeButton->addEventListener(TouchEvent::CLICK, cb);
  54.  
  55. addChild(pauseButton);
  56. addChild(resumeButton);
  57.  
  58. //attach pauseButton as child to current actor
  59. addChild(sudi);
  60. _sudi = sudi;
  61.  
  62. getStage()->addEventListener(TouchEvent::MOVE, CLOSURE(this, &MainActor::mouseHandler));
  63.  
  64. //create TextField Actor
  65. spTextField text = new TextField();
  66. //attach it as child to pauseButton
  67. text->attachTo(this);
  68. //centered in pauseButton
  69. text->setPosition(100, 10);
  70.  
  71. //initialize text style
  72. TextStyle style;
  73. style.font = gameResources.getResFont("font");
  74. style.color = Color::White;
  75. style.vAlign = TextStyle::VALIGN_TOP;
  76. style.hAlign = TextStyle::HALIGN_LEFT;
  77. style.fontSize = 50;
  78.  
  79. text->setStyle(style);
  80. text->setText("0");
  81. addChild(text);
  82.  
  83. _text = text;
  84. beginTime = getStage()->getClock()->getTime();
  85.  
  86. bar = new ProgressBar();
  87. bar->setResAnim(gameResources.getResAnim("button"));
  88. bar->setAnchor(Vector2(0.5f, 0.5f));
  89. bar->setPosition(500,500);
  90. bar->setProgress(0.0f);
  91. bar->setDirection(ProgressBar::dir_90);
  92. //bar->setSize(600, 200);
  93. this->addChild(bar);
  94.  
  95. dim = new Sprite();
  96. dim->setResAnim(gameResources.getResAnim("dim"));
  97. dim->setPosition(0, 0);
  98. dim->setVisible(false);
  99. addChild(dim);
  100. }
  101.  
  102. void MainActor::setPauseMenu(bool status) {
  103. dim->setVisible(status);
  104. dim->setPriority(1000);
  105. resumeButton->setVisible(status);
  106. }
  107.  
  108. bool calculateWidth(spActor arg1, spActor arg2) {
  109. if(abs(((arg2->getPosition().x+(arg2->getSize().x/2)) - (arg1->getPosition().x+(arg1->getSize().x/2)))) < 100)
  110. return true;
  111. return false;
  112. }
  113.  
  114. bool calculateHeight(spActor arg1, spActor arg2, int distance) {
  115. if(((arg2->getPosition().y+(arg2->getSize().y/2)) - (arg1->getPosition().y+(arg1->getSize().y/2))) < distance)
  116. return true;
  117. return false;
  118. }
  119.  
  120. void MainActor::doUpdate(const UpdateState& us) {
  121. for (MainActor::units::iterator i = _units.begin(); i != _units.end(); ++i)
  122. {
  123. spActor unit = *i;
  124. if(calculateWidth(unit, _sudi) && calculateHeight(unit, _sudi, 300)) {
  125. _sudi->setColumn(1);
  126. }
  127. if(calculateWidth(unit, _sudi) && calculateHeight(unit, _sudi, 10)) {
  128. if(unit->getName() == "jagodowy") {
  129. bactive = true;
  130. bspeed = speed;
  131. this->getClock()->setMultiplier(0.5f);
  132. bcounter = 0;
  133. silting--;
  134. points++;
  135. } else if(unit->getName() == "zepsuty") {
  136. if(points <= 5)
  137. points = 0;
  138. else
  139. points-=5;
  140. silting--;
  141. } else if(unit->getName() == "skwarki") {
  142. points += 5;
  143. silting--;
  144. } else if(unit->getName() == "kompot") {
  145. silting = 51;
  146. } else if(unit->getName() == "ruski") {
  147. silting--;
  148. points++;
  149. }
  150. unit->detach();
  151. _units.erase(i);
  152. _sudi->setColumn(0);
  153. break;
  154. } else if(unit->getPosition().y >= getStage()->getSize().y) {
  155. unit->detach();
  156. _units.erase(i);
  157. if(points > 0)
  158. points--;
  159. silting--;
  160. _sudi->setColumn(0);
  161. break;
  162. }
  163. }
  164. bar->setProgress(silting/50.0f);
  165. char test[10];
  166. sprintf(test, "Pkt: %d", points);
  167. _text->setText(test);
  168.  
  169. double s = (this->getClock()->getTime() - beginTime)/1000.0;
  170. if(s>=speed/1000) {
  171. beginTime = this->getClock()->getTime();
  172. runSprite();
  173.  
  174. if(bactive)
  175. bcounter++;
  176. else
  177. counter++;
  178.  
  179. // Wyłącz bonus jak się skończy limit
  180. if(bcounter==5) {
  181. bactive=false;
  182. speed = bspeed;
  183. this->getClock()->setMultiplier(1);
  184. }
  185.  
  186. // Jeżeli licznik przekroczył granice skoku i prędkość jest większa od 300 to przeskocz
  187. if(counter>=jump && speed>500) {
  188. speed -= 100; //skok
  189. counter = 0; // zeruj licznik
  190. if(speed <= 1500) //
  191. jump*=1.5;
  192. }
  193.  
  194. // Jeżeli bonus nie jest aktywny to losuj szansa 5/100
  195. if(!bactive && rand()%100 <= 4) {
  196. switch(rand()%2) {
  197. case 0:
  198. runSprite(0, speed/1.5f, "jagodowy");
  199. break;
  200. case 1:
  201. runSprite(0, speed/1.5f, "zepsuty");
  202. break;
  203. }
  204. }
  205.  
  206. // Kompot
  207. if(rand()%200 < 500.0f/silting) {
  208. runSprite(speed/2, speed, "kompot");
  209. }
  210.  
  211. // Skwarki
  212. if(rand()%100 < 33) {
  213. runSprite(speed/2, speed, "skwarki");
  214. }
  215. }
  216. }
  217.  
  218. void MainActor::pauseButtonClicked(Event* event) {
  219. if(!paused) {
  220. this->getClock()->pause();
  221. paused=true;
  222. } else {
  223. this->getClock()->resume();
  224. paused=false;
  225. }
  226. setPauseMenu(paused);
  227. }
  228.  
  229. void MainActor::mouseHandler(Event* event)
  230. {
  231. TouchEvent* te = safeCast<TouchEvent*>(event);
  232. //user clicked to button
  233. //log::messageln("button clicked");
  234. Vector2 pos = te->localPosition-_sudi->getSize()/2;
  235. if(te->localPosition.x>50 && te->localPosition.x<670 && !paused)
  236. _sudi->setPosition(pos.x, _sudi->getPosition().y);
  237. //animate button by chaning color
  238. //_sudi->setColor(Color::White);
  239. //_sudi->addTween(Sprite::TweenColor(Color::Green), 500, 1, true);
  240.  
  241. //animate text by scaling
  242. //_text->setScale(1.0f);
  243. //_text->addTween(Actor::TweenScale(1.1f), 500, 1, true);
  244.  
  245. //and change text
  246. //_text->setText("Clicked!");
  247.  
  248. //lets create and run sprite with simple animation
  249. //runSprite();
  250. }
  251.  
  252. void MainActor::runSprite()
  253. {
  254. runSprite(0, speed);
  255. }
  256.  
  257. void MainActor::runSprite(int delay)
  258. {
  259. runSprite(delay, speed);
  260. }
  261.  
  262. void MainActor::runSprite(int delay, int speed) {
  263. runSprite(delay, speed, "ruski");
  264. }
  265.  
  266. void MainActor::runSprite(int delay, int speed, std::string type)
  267. {
  268. spSprite sprite = new Sprite();
  269. addChild(sprite);
  270.  
  271. int duration = 600;//ms
  272. int loops = -1;//infinity loops
  273.  
  274. //animation has 8 columns - frames, check 'res.xml'
  275. ResAnim* animation = gameResources.getResAnim(type);
  276.  
  277. //add animation tween to sprite
  278. //TweenAnim would change animation frames
  279. sprite->addTween(Sprite::TweenAnim(animation), duration, loops);
  280.  
  281. Vector2 destPos = Vector2(rand()%((int)(getStage()->getSize().x-sprite->getWidth())), getStage()->getSize().y+sprite->getHeight());
  282. Vector2 srcPos = Vector2(destPos.x, -sprite->getHeight());
  283. //set sprite initial position
  284. sprite->setPosition(srcPos);
  285.  
  286. //add another tween: TweenQueue
  287. //TweenQueue is a collection of tweens
  288. spTweenQueue tweenQueue = new TweenQueue();
  289. tweenQueue->setDelay(delay);
  290. //first, move sprite to dest position
  291. tweenQueue->add(Sprite::TweenPosition(destPos), speed, 1);
  292. //then fade it out smoothly
  293. //tweenQueue->add(Sprite::TweenAlpha(0), 500, 1);
  294.  
  295. sprite->addTween(tweenQueue);
  296. sprite->setName(type);
  297. sprite->setPriority(10);
  298. _units.push_back(sprite);
  299.  
  300. //and remove sprite from tree when tweenQueue is empty
  301. //if you don't hold any references to sprite it would be deleted automatically
  302. tweenQueue->detachWhenDone();
  303. }
  304. //declare spMainActor as intrusive_ptr holder of MainActor
  305. typedef oxygine::intrusive_ptr<MainActor> spMainActor;
  306. //you could use DECLARE_SMART preprocessor definition it does the same:
  307. //DECLARE_SMART(MainActor, spMainActor)
  308.  
  309. void game_preinit() {}
  310.  
  311. //called from main.cpp
  312. void game_init()
  313. {
  314. //load xml file with resources definition
  315. gameResources.loadXML("res.xml");
  316.  
  317.  
  318. //lets create our client code simple actor
  319. //spMainActor was defined above as smart intrusive pointer (read more: http://www.boost.org/doc/libs/1_60_0/libs/smart_ptr/intrusive_ptr.html)
  320. spMainActor actor = new MainActor;
  321. actor->setClock(new Clock);
  322. //and add it to Stage as child
  323. getStage()->addChild(actor);
  324.  
  325. }
  326.  
  327.  
  328. //called each frame from main.cpp
  329. void game_update()
  330. {
  331. }
  332.  
  333. //called each frame from main.cpp
  334. void game_destroy()
  335. {
  336. //free previously loaded resources
  337. gameResources.free();
  338. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement