Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <list>
- #include <cmath>
- #include <algorithm>
- #include <GL/glut.h>
- #include <GL/gl.h>
- #include <GL/glu.h>
- using namespace std;
- double scale = 1.0;
- double car_x = 0, car_y = 0;
- double car_vx = 0, car_vy = 0;
- void render_square(double x, double y) {
- glPushMatrix();
- double dx = 0.5;
- double dy = 0.5;
- glBegin(GL_POLYGON);
- glVertex2f(x, y);
- glVertex2f(x + dx, y);
- glVertex2f(x + dx, y - dy);
- glVertex2f(x, y - dy);
- glEnd();
- glPopMatrix();
- }
- void draw_line(double x, double y, double x1, double y1) {
- glBegin(GL_LINES);
- glVertex2d(x, y);
- glVertex2d(x1, y1);
- glEnd();
- }
- void draw_home(double x,double y){
- draw_line(0+x,0+y,3+x,0+y);
- draw_line(3+x,0+y,3+x,3+y);
- draw_line(3+x,3+y,0+x,3+y);
- draw_line(0+x,3+y,0+x,0+y);
- draw_line(0+x,3+y,1.5+x,3.75+y);
- draw_line(3+x,3+y,1.5+x,3.75+y);
- draw_line(1.25+x,1.25+y,1.25+x,1.25+y);
- draw_line(1.75+x,1.25+y,1.75+x,1.75+y);
- draw_line(1.75+x,1.75+y,1.25+x,1.75+y);
- draw_line(1.25+x,1.75+y,1.25+x,1.25+y);
- draw_line(1.25+x,1.25+y,1.75+x,1.25+y);
- }
- void draw_car(double x,double y){
- glColor3d(1, 0, 0);
- draw_line(0+x,0+y,1+x,0+y);
- draw_line(1+x,0+y,1+x,1+y);
- draw_line(1+x,1+y,0+x,1+y);
- draw_line(0+x,1+y,0+x,0+y);
- }
- void Render() {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0, 0, -10);
- glColor3d(1, 1, 0);
- glScalef(scale, scale, scale);
- for(double x = -25; x < 25; x+= 5.5) {
- for(double y = -25; y < 25; y+= 5.5) {
- draw_home(x,y);
- }
- }
- draw_car(car_x,car_y);
- glFlush();
- }
- void update(int t) {
- double dt = 0.05;
- car_x += car_vx * dt;
- car_y += car_vy * dt;
- Render();
- glutTimerFunc(50, update, 0);
- }
- void keyb(unsigned char key, int x, int y) {
- if(key == '+') {
- scale *= 1.5;
- }
- if(key == '-') {
- scale *= 0.5;
- }
- if(key == 'w'){
- car_vy+=0.25;
- }
- if(key == 's'){
- car_vy-=0.25;
- }
- if(key == 'a'){
- car_vx-=0.25;
- }
- if(key == 'd'){
- car_vx+=0.25;
- }
- if(key == ' '){
- car_vx*=0.45;
- car_vy*=0.45;
- }
- cout<<key<<endl;
- Render();
- }
- void reshape(int w, int h) {
- // предупредим деление на ноль
- // если окно сильно перетянуто будет
- if(h == 0)
- h = 1;
- float ratio = 1.0* w / h;
- // используем матрицу проекции
- glMatrixMode(GL_PROJECTION);
- // Reset матрицы
- glLoadIdentity();
- // определяем окно просмотра
- glViewport(0, 0, w, h);
- // установить корректную перспективу.
- gluPerspective(45,ratio,1,1000);
- // вернуться к модели
- glMatrixMode(GL_MODELVIEW);
- }
- int main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(800, 600);
- glutCreateWindow("Physics Engine");
- glEnable(GL_DEPTH_TEST);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glClearColor(0.0, 0.5, 0.5, 1.0);
- glutTimerFunc(50, update, 0);
- glutReshapeFunc(reshape);
- glutDisplayFunc(Render);
- glutKeyboardFunc(keyb);
- glutMainLoop();
- }
Add Comment
Please, Sign In to add comment