Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h> // Заголовочные файлы для Windows
- #include <GL/glut.h>
- #include < GL/gl.h >
- #include < GL/glut.h >
- #include <string>
- #include <math.h>
- #include <iostream>
- #include <locale>
- using namespace std;
- const float WIN_WIDTH = 800;
- const float WIN_HEIGHT = 600;
- float offset_x = 0.0, offset_y = 0.0;
- const int H = 20;
- const int W = 100;
- float ground = 32.0;
- float gravity = 0.07;
- string Map[H] = {
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " W",
- " BWB W",
- " W",
- " BB W",
- " WBW WWWWWW W",
- " W",
- "W WWB W",
- "W WW W WWWWWW W",
- "WW B WWWWW WWWWWWWWWW W",
- "WWWWWWWW WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"
- };
- class Mario{
- public:
- float x_pos, y_pos, dx, dy;
- bool Right, Left, Up, Down, LastRight, LastLeft, LastUp, OnGround;
- void Draw()
- {
- glColor3f(1.0, 0.0, 0.0);
- if (x_pos > 16.0)
- glRectf(x_pos - offset_x, y_pos - offset_y, x_pos + 32.0 - offset_x, y_pos + 32.0 - offset_y);
- else
- glRectf(x_pos, y_pos - offset_y, x_pos + 32.0, y_pos + 32.0 - offset_y);
- }
- void Move()
- {
- Collision();
- /*if (y_pos >= ground)
- {
- y_pos = ground;
- dy = 0;
- OnGround = true;
- }*/
- if (y_pos < 32.0)
- {
- y_pos = 32.0;
- dy = 0;
- }
- if (Right && x_pos < W * 32.0 - 32.0)
- {
- dx = 1.0;
- x_pos += dx;
- }
- if (Left && x_pos > 0)
- {
- dx = -1.0;
- x_pos += dx;
- }
- if (Up)
- {
- dy = 1.0;
- y_pos += dy;
- }
- if (Down && y_pos > 32.0)
- {
- dy = -1.0;
- y_pos += dy;
- }
- /* if (!OnGround)
- dy += gravity;*/
- }
- void Collision()
- {
- for (int i = 19.0 - (y_pos + 32.0) / 32.0; i <= 19.0 - y_pos / 32.0; i++)
- {
- for (int j = x_pos / 32.0; j <= (x_pos + 32.0) / 32.0; j++)
- {
- if (Map[i][j] == 'W')
- {
- if (dx > 0)
- {
- x_pos = j * 32.0 - 32.0;
- cout << i << " " << j << " " << x_pos << endl;
- }
- if (dx < 0)
- {
- x_pos = j * 32.0 + 32.0;
- cout << i << " " << j << " " << x_pos << endl;
- }
- if (dy > 0)
- {
- y_pos = i * 32.0 - 32.0;
- cout << i << " " << j << " " << y_pos << endl;
- }
- if (dy < 0)
- {
- y_pos = i * 32.0 + 32.0;
- cout << i << " " << j << " " << y_pos << endl;
- }
- }
- if (Map[i][j] == 'B')
- {
- Map[i][j] = ' ';
- }
- }
- }
- }
- Mario()
- {
- x_pos = 96.0;
- y_pos = 96.0;
- dx = dy = 0.0;
- }
- } Mario;
- void Initialize()
- {
- glClearColor(0.0, 0.0, 1.0, 1.0);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0, 800.0, 0.0, 600.0, -1.0, 1.0);
- }
- void DrawField()
- {
- if (Mario.x_pos >= WIN_WIDTH / 2)
- {
- offset_x = Mario.x_pos - WIN_WIDTH / 2;
- }
- if ((Mario.x_pos >= WIN_WIDTH / 2) && (offset_x >= 2400.0))
- {
- offset_x = 2400.0;
- }
- /*if (Mario.y_pos > WIN_HEIGHT / 2)
- offset_y = Mario.y_pos + 16.0 - WIN_HEIGHT / 2;*/
- for (int i = 0; i < H; i++)
- for (int j = 0; j < W; j++)
- {
- if (Map[i][j] == 'W')
- {
- //glBegin(GL_POLYGON);
- glColor3f(0.7, 0.4, 0.2); //Выбираем цвет
- 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);
- /*glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y); //Координаты квадрата
- glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
- glVertex2f(j*32.0 + 32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
- glVertex2f(j*32. + 32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y);*/
- //glEnd();
- }
- if (Map[i][j] == 'B')
- {
- //glBegin(GL_POLYGON);
- glColor3f(0.0, 1.0, 0.0); //Выбираем цвет
- 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);
- /*glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y); //Координаты квадрата
- glVertex2f(j*32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
- glVertex2f(j*32.0 + 32.0 - offset_x, abs(i - 19.0)*32.0 + 32.0 - offset_y);
- glVertex2f(j*32. + 32.0 - offset_x, abs(i - 19.0)*32.0 - offset_y);*/
- //glEnd();
- }
- }
- }
- void display()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- DrawField();
- Mario.Draw();
- Mario.Move();
- glutSwapBuffers();
- glFlush();
- }
- void Tick()
- {
- Mario.Move();
- }
- void timer(int = 0)
- {
- display();
- Tick();
- glutTimerFunc(40, timer, 0); //Устанавливаем новый таймер.
- }
- void Keyboard(int key, int x, int y)
- {
- if (key == GLUT_KEY_LEFT)
- {
- Mario.Left = true;
- }
- else if (key == GLUT_KEY_UP)
- {
- Mario.Up = true;
- }
- else if (key == GLUT_KEY_RIGHT)
- {
- Mario.Right = true;
- }
- else if (key == GLUT_KEY_DOWN)
- {
- Mario.Down = true;
- }
- }
- void KeyboardUp(int key, int x, int y)
- {
- if (key == GLUT_KEY_LEFT)
- {
- Mario.Left = false;
- }
- else if (key == GLUT_KEY_UP)
- {
- Mario.Up = false;
- }
- else if (key == GLUT_KEY_RIGHT)
- {
- Mario.Right = false;
- }
- else if (key == GLUT_KEY_DOWN)
- {
- Mario.Down = false;
- }
- }
- int main(int argc, char **argv)
- {
- setlocale(LC_ALL, "rus");
- //Mario.x_pos = 96.0;
- //Mario.y_pos = 32.0;
- //Mario.dx = 2.0;
- //Mario.dy = 0.0;
- Mario.LastLeft = Mario.LastRight = false;
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //один буфер, 8 бит на пиксель
- glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); //Указываем размер окна
- glutInitWindowPosition(100, 100); //Позиция окна
- glutCreateWindow("Super Mario Bros ©"); //Имя окна
- Initialize(); //Вызов функции Initialize
- glutDisplayFunc(display); //Вызов функции отрисовки
- glutIdleFunc(display);
- glutTimerFunc(40, timer, 0);
- glutSpecialFunc(Keyboard);
- glutSpecialUpFunc(KeyboardUp);
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement