Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Программирование графики
Перезагрузить страницу OpenGL. 2D Game.
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Prosto_Toxa Prosto_Toxa вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.08.2014
По умолчанию OpenGL. 2D Game. - 12.05.2015, 22:24

Здравствуйте.
Времени мало, а курсовую делать нужно.

Игра Танграм.
Знаний в графике 0.
C++ на базовом уровне.
Использую GLUT.

Мне нужно:
1. Грузить фигуры по координатам из файла (пока не обязательно)
2. Передвигать фигуры мышкой.
3. И еще куча мелочей.

Находил в интернетах очень много хорошей информации, но мне совсем не хватает времени.

Помогите пожалуйста, пните в верном направлении.

Покажите пример двиганья мышью фигурки. Да пока даже одной и без проверки координат мыши и фигуры.
Возможно я не могу это реализовать, ибо не получается перевести координаты мыши в координаты от -1 до 1.

Большое спасибо.
Ответить с цитированием
  (#2 (permalink)) Старый
Prosto_Toxa Prosto_Toxa вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.08.2014
По умолчанию 13.05.2015, 00:55

Не пинайте за мои костыли, сделал, как представляю.
Что здесь нужно поправить?
Как оптимизировать?

В head файле я сделал структуру с данными о вершинах квадрата:

cpp Код:
struct quad
{
    int x1, y1;
    int x2, y2;
    int x3, y3;
    int x4, y4;

    int mx1, my1;
    int mx2, my2;
    int mx3, my3;
    int mx4, my4;
};

extern quad q;

В main я присваиваю значения вершинам.
В void MouseMotion() изменяю координаты вершины (изменение координат мыши + старые координаты вершины)
Это записываю в новую вершину.
С помощью этих новых вершин строю квадрат в void display().
После отпускания кнопки мыши текущие координаты квадрата становятся старыми void mouse()


cpp Код:
#include "head.h"
#include <stdio.h>
#include <GL/glut.h>

void display();
void reshape(int width, int height);
void mouse(int button, int state, int x, int y);
void MouseMotion(int x , int y);

int height=600, width=600;

int xold, yold;
int xpos=0, ypos=0;

quad q;

int ButtonStatus = 0;

void GLUT_CALL_FUNC()
{
       
        glutReshapeFunc(reshape);
        glutDisplayFunc(display);
        glutMouseFunc(mouse);
        glutMotionFunc(MouseMotion);

}

void MY_INIT()
{
        glClearColor(1.0, 1.0, 1.0,1.0);
}

void reshape(int width, int height)
{
        glViewport(0, 0, width, height);
       
    glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
       
        glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
   
        glBegin(GL_QUADS);
        glColor3f(0.6, 0.1, 0.6);
    glVertex2i(q.x1, q.y1);
        glVertex2i(q.x2, q.y2);
        glVertex2i(q.x3, q.y3);
        glVertex2i(q.x4, q.y4);
        glEnd();
         glutSwapBuffers();
        //glFlush();
}

void mouse(int button, int state, int x, int y) //
{
        if(button==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
        {
                ButtonStatus = 1;
        xold = x;
        yold = y;
        }
        else if(button == GLUT_LEFT_BUTTON && state == GLUT_UP)
        {
                ButtonStatus = 0;
        q.oldx1 = q.x1;
        q.oldy1 = q.y1;

        q.oldx2 = q.x2;
        q.oldy2 = q.y2;

        q.oldx3 = q.x3;
        q.oldy3 = q.y3;

        q.oldx4 = q.x4;
        q.oldy4 = q.y4;
        }
}


void MouseMotion(int x , int y)
{      
        if(ButtonStatus == 1)
        {
        xpos = x- xold;
        ypos = yold - y;

        q.x1 = q.oldx1+xpos;
        q.y1 = q.oldy1+ypos;

        q.x2 = q.oldx2+xpos;
        q.y2 = q.oldy2+ypos;

        q.x3 = q.oldx3+xpos;
        q.y3 = q.oldy3+ypos;

        q.x4 = q.oldx4+xpos;
        q.y4 = q.oldy4+ypos;
        }
    display();
    //glutPostRedisplay();
}


/**************** main ********************/
int main(int argc,char *argv[])
{
    q.oldx1=100;
    q.oldy1=200;

    q.oldx2=100;
    q.oldy2=0;

    q.oldx3=400;
    q.oldy3=0;

    q.oldx4=400;
    q.oldy4=200;

        glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize (width, height);
        glutCreateWindow("Hello OpenGL");

        GLUT_CALL_FUNC(); //

        MY_INIT();  //
       
        glutMainLoop();

        return 0;

}

Получается слишком много действий, но работает.
Ответить с цитированием
  (#3 (permalink)) Старый
Prosto_Toxa Prosto_Toxa вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.08.2014
По умолчанию 13.05.2015, 21:36

Я опечатался и закинул старый .h
Но это всё равно никто не читает, поэтому всё норм.

Немного оптимизировал структуру.

Вот так сейчас выглядит head.h

cpp Код:
struct quad
{
    int x1, y1;
    int x2, y2;
    int x3, y3;
    int x4, y4;

    int status; //0 - движение запрещено. 1 - движение разрешено. 2 - движение.
};

extern quad q, qold, outline; //текущие координаты фигуры, старые координаты фигуры, контур

Рисую я пока самое простое - четырёхугольники, поэтому структура так и называется.
Структуру я использую для самой фигуры, и для очертания, куда эту фигуру нужно перетянуть.

Кому не лень разбираться, вот весь файл .цпп

cpp Код:
#include "head.h"
#include <stdio.h>
#include <GL/glut.h>

void display();
void reshape(int width, int height);
void mouse(int button, int state, int x, int y);
void MouseMotion(int x , int y);

int height=600, width=600;

int xold, yold;
int xpos=0, ypos=0;

quad q, qold, outline;

int ButtonStatus = 0;

void GLUT_CALL_FUNC()
{
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    glutMotionFunc(MouseMotion);
}

void MY_INIT()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
}

void reshape(int width, int height)
{
    glViewport(0, 0, width, height);
       
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, height, 0);
       
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glLineWidth(2);
    glBegin(GL_LINES);
    glColor3f(0.0, 0.0, 0.0);

    glVertex2i(outline.x1, outline.y1);
    glVertex2i(outline.x2, outline.y2);

    glVertex2i(outline.x2, outline.y2);
    glVertex2i(outline.x3, outline.y3);

    glVertex2i(outline.x3, outline.y3);
    glVertex2i(outline.x4, outline.y4);

    glVertex2i(outline.x4, outline.y4);
    glVertex2i(outline.x1, outline.y1);
    glEnd();


    glBegin(GL_QUADS);
    glColor3f(0.6, 0.1, 0.6);
    glVertex2i(q.x1, q.y1);
    glVertex2i(q.x2, q.y2);
    glVertex2i(q.x3, q.y3);
    glVertex2i(q.x4, q.y4);
    glEnd();

    glutSwapBuffers();
    //glFlush();
}

void mouse(int button, int state, int x, int y) //
{
    if (button==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        ButtonStatus = 1;
        xold = x;
        yold = y;
        if (q.status != 0 && x>=q.x1 && x<=q.x3 && y>=q.y2 && y<=q.y1)
            q.status = 2;
    }
    else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
    {
        ButtonStatus = 0;
        q.status = 1;

        qold.x1 = q.x1;
        qold.y1 = q.y1;

        qold.x2 = q.x2;
        qold.y2 = q.y2;

        qold.x3 = q.x3;
        qold.y3 = q.y3;

        qold.x4 = q.x4;
        qold.y4 = q.y4;

        if ((q.x1>=outline.x1-10 && q.x1<=outline.x1+10) && (q.y3>=outline.y3-10 && q.y3<=outline.y3+10))
        {
            q=outline;
            q.status=0;
            display();
        }
    }
}

void MouseMotion(int x , int y)
{      
    if (ButtonStatus == 1 && q.status == 2)
    {
        xpos = x - xold;
        ypos = y - yold;

        q.x1 = qold.x1+xpos;
        q.y1 = qold.y1+ypos;

        q.x2 = qold.x2+xpos;
        q.y2 = qold.y2+ypos;

        q.x3 = qold.x3+xpos;
        q.y3 = qold.y3+ypos;

        q.x4 = qold.x4+xpos;
        q.y4 = qold.y4+ypos;
    }
    display();
    //glutPostRedisplay();
}

int main(int argc,char *argv[])
{
    qold.x1=100;
    qold.y1=200;
    qold.x2=100;
    qold.y2=0;
    qold.x3=400;
    qold.y3=0;
    qold.x4=400;
    qold.y4=200;
    q=qold;
    q.status=1;

    outline.x1 = 100;
    outline.y1 = 500;

    outline.x2 = 100;
    outline.y2 = 300;

    outline.x3 = 400;
    outline.y3 = 300;

    outline.x4 = 400;
    outline.y4 = 500;

    GLUT_CALL_FUNC();

    MY_INIT();
       
    glutMainLoop();

    return 0;
}

В main я присваиваю координаты фигуре и контуру.
В готовой реализации буду брать всё это из файла и в отдельной функции.
Проверяю положение курсора.
Если кнопка нажата и координаты курсора входят в координаты фигуры, то состояние фигуры меняю на status = 2, что означает, что фигура двигается.
Когда кнопка отпущена, статус меняется на 1, что означает, что фигура может быть передвинута. Если координаты фигуры совпадают с координатами контура с погрешностью в 10 пикселей в обе стороны, то координаты фигуры получают значение координат контура, а состояние фигуры меняется на 0, то есть двигать её нельзя.

Может кому пригодятся мои костыли?
Если кто знает, как это допилить, то я буду очень рад Вас выслушать.

Спасибо.

Последний раз редактировалось Prosto_Toxa; 13.05.2015 в 21:40
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалять ZAXAR GAME BROWSER andrj Любые вопросы от новичков 10 02.04.2014 11:26
Вопрос по Game Maker Богдан программист Вопросы начинающих программистов 0 02.11.2013 01:05
адрес сайта game Spartaker IT 10 01.04.2010 00:03
Game-computer viger Подбор комплектующих 15 20.09.2008 17:39
AMD GAME! VipeR Процессоры 4 20.05.2008 19:15
Игра на Intel Game Contest kilometr Зацените! 0 21.07.2007 00:31
Hacker's game взлом компьютерных игр MULDER Игры разума 7 22.11.2006 16:02
Как пользоваться COM, LPT, Game портами в VB Zaryk Visual Basic 2 27.08.2005 15:23
Programing Game with Studio.Net как использовать Mike. .NET 3 26.05.2005 02:57
Написание программы для Game port Chuvak C++ Builder 1 27.07.2004 00:53
Real Online Game Out Visual C++ 1 01.08.2003 10:56



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов