Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. // memmy (c) mjt, 25.2.2014
  2.  
  3. #pragma once
  4. #include "Program.h"
  5.  
  6. const int X=4, Y=4;
  7. class Game_Memmu : public Program
  8. {
  9. Model block[Y][X];
  10. scene::ISceneNode *selectedSceneNode[2];
  11. ITexture *bg;
  12.  
  13. int tries;
  14. float _ang;
  15. int anim;
  16. int selected;
  17. int delay;
  18.  
  19. public:
  20.  
  21. void createScene()
  22. {
  23. device->setWindowCaption(L"Memmu");
  24.  
  25. srand(device->getTimer()->getRealTime());
  26.  
  27. delay=0;
  28. _ang=0;
  29. tries=0;
  30. const stringc DIR="memmu/";
  31.  
  32. stringc imgName[]={"1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg",
  33. "1.jpg","2.jpg","3.jpg","4.jpg","5.jpg","6.jpg","7.jpg","8.jpg",};
  34.  
  35. bg = driver->getTexture(DATA_DIR + DIR + "bg.jpg");
  36.  
  37. for(int y=0;y<Y;y++)
  38. {
  39. for(int x=0;x<X; x++)
  40. {
  41. block[y][x].load(DIR + "memmu_block.3ds");
  42. block[y][x].getNode()->setMaterialFlag(video::EMF_LIGHTING, false);
  43. block[y][x].getNode()->setScale(vector3df(0.3f, 0.3f, 0.3f));
  44. block[y][x].getNode()->setPosition(vector3df(x-1.5f, y-1.5f, 0));
  45. block[y][x].getNode()->setRotation(vector3df(90, 0, 0));
  46. //block[y][x].getNode()->setMaterialTexture(0, driver->getTexture(DATA_DIR + "demoback.jpg"));
  47. block[y][x].getNode()->getMaterial(0).setTexture(0, driver->getTexture(DATA_DIR + DIR + "blk.jpg"));
  48.  
  49. while(1)
  50. {
  51. int rnd=rand()%16;
  52. if(imgName[rnd]=="") continue;
  53. block[y][x].getNode()->getMaterial(1).setTexture(0, driver->getTexture(DATA_DIR + DIR + imgName[rnd]));
  54. block[y][x].getNode()->setName(imgName[rnd]);
  55. block[y][x].getNode()->setID(1);
  56. imgName[rnd]="";
  57. break;
  58. }
  59. }
  60. }
  61. IMetaTriangleSelector *meta = createTriangleSelectors();
  62. meta->drop();
  63.  
  64. IGUIStaticText *text = guienv->addStaticText(L"Memmu (c) mjt, 2014", rect<s32>(1,1,500,60), false, false, 0, 0 );
  65. text->setOverrideColor(SColor(255, 100,255,50));
  66.  
  67. camera = sceneManager->addCameraSceneNode();
  68. camera->setPosition(vector3df(0,0,-3));
  69. camera->setNearValue(0.1f);
  70. camera->setFarValue(1000);
  71. camera->setTarget(vector3df(0,0,0));
  72.  
  73. anim=0;
  74. selected=0;
  75. }
  76.  
  77. void clearScene()
  78. {
  79. sceneManager->clear();
  80. guienv->clear();
  81. }
  82.  
  83. void render(f32 frameDeltaTime)
  84. {
  85. if(input.IsKeyDown(irr::KEY_ESCAPE))
  86. running=false; //device->closeDevice();
  87.  
  88. _ang+=frameDeltaTime;
  89.  
  90. SColor colors[4];
  91. for(int q=0;q<4;q++)
  92. colors[q]=SColor(255, 255,255, (int)(sinf(_ang)*128)+128);
  93.  
  94.  
  95. driver->enableMaterial2D(true);
  96. driver->getMaterial2D().Lighting = false;
  97. driver->getMaterial2D().ZWriteEnable = false;
  98. driver->getMaterial2D().ZBuffer = false;
  99. driver->getMaterial2D().BackfaceCulling = false;
  100. driver->draw2DImage(bg, rect<s32>(0,0,screenWidth, screenHeight),rect<s32>(0,0,bg->getSize().Width, bg->getSize().Width),
  101. 0,colors);
  102. driver->enableMaterial2D(false);
  103.  
  104. sceneManager->drawAll();
  105.  
  106.  
  107. // jos klikataan eikä animaatiota vielä päällä
  108. if(input.MouseState.Buttons[0] && anim==0)
  109. {
  110. ISceneCollisionManager *collMananger = sceneManager->getSceneCollisionManager();
  111. triangle3df triangle;
  112. vector3df point;
  113. position2di pos=position2di(input.MouseState.Position.X, input.MouseState.Position.Y);
  114. line3df ray = collMananger->getRayFromScreenCoordinates(pos);
  115. ISceneNode *newnode = collMananger->getSceneNodeAndCollisionPointFromRay(ray, point, triangle);
  116. if(newnode && newnode->getID()==1) // jos valittu obu on blokki
  117. {
  118. if(selected>0 || newnode!=selectedSceneNode[selected-1]) // jos se ei ole sama joka on jo valittu
  119. {
  120. selectedSceneNode[selected] = newnode;
  121. selectedSceneNode[selected]->setScale(vector3df(0.33f, 0.33f, 0.33f));
  122. anim=1; // 1==pyöräytä
  123. selected++;
  124. }
  125. }
  126. }
  127.  
  128. // pyöräytä valittu obu
  129. if(anim==1)
  130. {
  131. vector3df r=selectedSceneNode[selected-1]->getRotation();
  132. if(r.X<270)
  133. {
  134. r.X+=5;
  135. r.Z+=10;
  136. selectedSceneNode[selected-1]->setRotation(r);
  137. }
  138. else
  139. if(selected==2) // kummatkin obut pyöräytetty oikeinpäin
  140. {
  141. if(stringc(selectedSceneNode[0]->getName()) == stringc(selectedSceneNode[1]->getName()))
  142. {
  143. anim=2;
  144. }
  145. else
  146. {
  147. tries++;
  148. anim=-1; // palauta obut 'väärinpäin'
  149. delay=0;
  150. }
  151. }
  152. else anim=0; // että voidaan valita toinen obu
  153. }
  154.  
  155. // skaalaus pieneks
  156. if(anim==2)
  157. {
  158. float S=selectedSceneNode[0]->getScale().X-0.01f;
  159. selectedSceneNode[0]->setScale(vector3df(S,S,S));
  160. selectedSceneNode[1]->setScale(vector3df(S,S,S));
  161. if(S<=0)
  162. {
  163. selectedSceneNode[0]->setScale(vector3df(0,0,0));
  164. selectedSceneNode[1]->setScale(vector3df(0,0,0));
  165. anim=0;
  166. selectedSceneNode[0]=0;
  167. selectedSceneNode[1]=0;
  168. selected=0;
  169. }
  170. }
  171.  
  172. // skip delay
  173. if(anim==-1 && input.MouseState.Buttons[0])
  174. delay=50;
  175.  
  176. // palauta obut 'väärinpäin'
  177. if(anim==-1 && delay++ >= 50)
  178. {
  179. bool stillRotate=false;
  180. for(int y=0;y<Y; y++)
  181. for(int x=0;x<X;x++)
  182. {
  183. if(block[y][x].getNode()->getScale().X==0) continue;
  184.  
  185. vector3df r=block[y][x].getNode()->getRotation();
  186. if(r.X>90)
  187. {
  188. stillRotate=true;
  189. r.X-=10;
  190. r.Z-=20;
  191. block[y][x].getNode()->setRotation(r);
  192. block[y][x].getNode()->setScale(vector3df(0.3f, 0.3f, 0.3f));
  193. }
  194. }
  195.  
  196. if(stillRotate==false)
  197. {
  198. anim=0;
  199. selectedSceneNode[0]=0;
  200. selectedSceneNode[1]=0;
  201. selected=0;
  202. }
  203. }
  204.  
  205. bool objleft=false;
  206. for(int y=0;y<Y; y++)
  207. for(int x=0;x<X;x++)
  208. if(block[y][x].getNode()->getScale().X!=0)
  209. {
  210. y=Y;
  211. objleft=true;
  212. break;
  213. }
  214.  
  215. guienv->drawAll();
  216.  
  217. stringc triestxt="Tries: ";
  218. triestxt+=tries;
  219. font->draw(triestxt, rect<s32>(1,35, 50,300), SColor(255,255,0,0));
  220.  
  221. if(!objleft)
  222. {
  223. int x=(int)(sin(_ang)*60)+60;
  224. int y=(int)(cos(_ang)*100)+80;
  225. font->draw("Game over!", rect<s32>(x,y, 50,300), SColor(255,255,255,255));
  226. }
  227.  
  228. }
  229. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement