Advertisement
Wan_ich1

Oooo

Feb 3rd, 2021
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.10 KB | None | 0 0
  1. #include <windows.h> // Заголовочные файлы для Windows
  2. #include <GL/glut.h>
  3. #include < GL/gl.h >
  4. #include < GL/glut.h >
  5. #include <string>
  6. #include <math.h>
  7. #include <iostream>
  8. #include <locale>
  9.  
  10. using namespace std;
  11.  
  12. const float WIN_WIDTH = 800;
  13. const float WIN_HEIGHT = 600;
  14.  
  15. float offset_x = 0.0, offset_y = 0.0;
  16.  
  17. const int H = 20;
  18. const int W = 100;
  19.  
  20. float ground = 32.0;
  21. float gravity = 0.07;
  22.  
  23. string Map[H] = {
  24. " ",
  25. " ",
  26. " ",
  27. " ",
  28. " ",
  29. " ",
  30. " ",
  31. " ",
  32. " ",
  33. " ",
  34. " W",
  35. " BWB W",
  36. " W",
  37. " BB W",
  38. " WBW WWWWWW W",
  39. " W",
  40. "W WWB W",
  41. "W WW W WWWWWW W",
  42. "WW B WWWWW WWWWWWWWWW W",
  43. "WWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
  44. };
  45.  
  46. class Mario{
  47. public:
  48. float x_pos, y_pos, dx, dy;
  49. bool Right, Left, Up, Down, LastRight, LastLeft, LastUp, OnGround;
  50. void Draw()
  51. {
  52. glColor3f(1.0, 0.0, 0.0);
  53. if (x_pos > 16.0)
  54. glRectf(x_pos - offset_x, y_pos - offset_y, x_pos + 32.0 - offset_x, y_pos + 32.0 - offset_y);
  55. else
  56. glRectf(x_pos, y_pos - offset_y, x_pos + 32.0, y_pos + 32.0 - offset_y);
  57. }
  58.  
  59. void Move()
  60. {
  61. Collision();
  62. /*if (y_pos >= ground)
  63. {
  64. y_pos = ground;
  65. dy = 0;
  66. OnGround = true;
  67. }*/
  68. if (y_pos < 32.0)
  69. {
  70. y_pos = 32.0;
  71. dy = 0;
  72. }
  73. if (Right && x_pos < W * 32.0 - 32.0)
  74. {
  75. dx = 1.0;
  76. x_pos += dx;
  77. }
  78.  
  79. if (Left && x_pos > 0)
  80. {
  81. dx = -1.0;
  82. x_pos += dx;
  83. }
  84.  
  85. if (Up)
  86. {
  87. dy = 1.0;
  88. y_pos += dy;
  89. }
  90. if (Down && y_pos > 32.0)
  91. {
  92. dy = -1.0;
  93. y_pos += dy;
  94.  
  95. }
  96. /* if (!OnGround)
  97. dy += gravity;*/
  98. }
  99. void Collision()
  100. {
  101. for (int i = 19.0 - (y_pos + 32.0) / 32.0; i <= 19.0 - y_pos / 32.0; i++)
  102. {
  103. for (int j = x_pos / 32.0; j <= (x_pos + 32.0) / 32.0; j++)
  104. {
  105. if (Map[i][j] == 'W')
  106. {
  107. if (dx > 0)
  108. {
  109. x_pos = j * 32.0 - 32.0;
  110. cout << i << " " << j << " " << x_pos << endl;
  111. }
  112.  
  113. if (dx < 0)
  114. {
  115. x_pos = j * 32.0 + 32.0;
  116. cout << i << " " << j << " " << x_pos << endl;
  117. }
  118. if (dy > 0)
  119. {
  120. y_pos = i * 32.0 - 32.0;
  121. cout << i << " " << j << " " << y_pos << endl;
  122. }
  123. if (dy < 0)
  124. {
  125. y_pos = i * 32.0 + 32.0;
  126. cout << i << " " << j << " " << y_pos << endl;
  127. }
  128. }
  129. if (Map[i][j] == 'B')
  130. {
  131. Map[i][j] = ' ';
  132. }
  133. }
  134. }
  135. }
  136. Mario()
  137. {
  138. x_pos = 96.0;
  139. y_pos = 96.0;
  140. dx = dy = 0.0;
  141. }
  142. } Mario;
  143.  
  144. void Initialize()
  145. {
  146. glClearColor(0.0, 0.0, 1.0, 1.0);
  147. glMatrixMode(GL_PROJECTION);
  148. glLoadIdentity();
  149. glOrtho(0.0, 800.0, 0.0, 600.0, -1.0, 1.0);
  150. }
  151.  
  152. void DrawField()
  153. {
  154. if (Mario.x_pos >= WIN_WIDTH / 2)
  155. {
  156. offset_x = Mario.x_pos - WIN_WIDTH / 2;
  157. }
  158. if ((Mario.x_pos >= WIN_WIDTH / 2) && (offset_x >= 2400.0))
  159. {
  160. offset_x = 2400.0;
  161. }
  162. /*if (Mario.y_pos > WIN_HEIGHT / 2)
  163. offset_y = Mario.y_pos + 16.0 - WIN_HEIGHT / 2;*/
  164.  
  165. for (int i = 0; i < H; i++)
  166. for (int j = 0; j < W; j++)
  167. {
  168. if (Map[i][j] == 'W')
  169. {
  170. //glBegin(GL_POLYGON);
  171. glColor3f(0.7, 0.4, 0.2); //Выбираем цвет
  172. glRectf(j*32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y, j*32.0 + 32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
  173. /*glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y); //Координаты квадрата
  174. glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
  175. glVertex2f(j*32.0 + 32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
  176. glVertex2f(j*32. + 32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y);*/
  177. //glEnd();
  178. }
  179. if (Map[i][j] == 'B')
  180. {
  181. //glBegin(GL_POLYGON);
  182. glColor3f(0.0, 1.0, 0.0); //Выбираем цвет
  183. glRectf(j*32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y, j*32.0 + 32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
  184. /*glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y); //Координаты квадрата
  185. glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
  186. glVertex2f(j*32.0 + 32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
  187. glVertex2f(j*32. + 32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y);*/
  188. //glEnd();
  189. }
  190. }
  191. }
  192.  
  193. void display()
  194. {
  195. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  196. DrawField();
  197. Mario.Draw();
  198. Mario.Move();
  199. glutSwapBuffers();
  200. glFlush();
  201.  
  202. }
  203.  
  204. void Tick()
  205. {
  206. Mario.Move();
  207. }
  208.  
  209. void timer(int = 0)
  210. {
  211. display();
  212. Tick();
  213. glutTimerFunc(40, timer, 0); //Устанавливаем новый таймер.
  214. }
  215.  
  216. void Keyboard(int key, int x, int y)
  217. {
  218. if (key == GLUT_KEY_LEFT)
  219. {
  220. Mario.Left = true;
  221. }
  222. else if (key == GLUT_KEY_UP)
  223. {
  224. Mario.Up = true;
  225. }
  226. else if (key == GLUT_KEY_RIGHT)
  227. {
  228. Mario.Right = true;
  229. }
  230. else if (key == GLUT_KEY_DOWN)
  231. {
  232. Mario.Down = true;
  233. }
  234. }
  235.  
  236. void KeyboardUp(int key, int x, int y)
  237. {
  238. if (key == GLUT_KEY_LEFT)
  239. {
  240. Mario.Left = false;
  241. }
  242. else if (key == GLUT_KEY_UP)
  243. {
  244. Mario.Up = false;
  245. }
  246. else if (key == GLUT_KEY_RIGHT)
  247. {
  248. Mario.Right = false;
  249. }
  250. else if (key == GLUT_KEY_DOWN)
  251. {
  252. Mario.Down = false;
  253. }
  254. }
  255.  
  256. int main(int argc, char **argv)
  257. {
  258. setlocale(LC_ALL, "rus");
  259.  
  260. //Mario.x_pos = 96.0;
  261. //Mario.y_pos = 32.0;
  262.  
  263. //Mario.dx = 2.0;
  264. //Mario.dy = 0.0;
  265.  
  266. Mario.LastLeft = Mario.LastRight = false;
  267.  
  268. glutInit(&argc, argv);
  269. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //один буфер, 8 бит на пиксель
  270. glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); //Указываем размер окна
  271. glutInitWindowPosition(100, 100); //Позиция окна
  272. glutCreateWindow("Super Mario Bros ©"); //Имя окна
  273.  
  274. Initialize(); //Вызов функции Initialize
  275.  
  276. glutDisplayFunc(display); //Вызов функции отрисовки
  277. glutIdleFunc(display);
  278. glutTimerFunc(40, timer, 0);
  279. glutSpecialFunc(Keyboard);
  280. glutSpecialUpFunc(KeyboardUp);
  281. glutMainLoop();
  282. return 0;
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement