Воскресенье, 22 Декабря 2024, 08:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
lwjgl правильно составить логику...
zvxДата: Суббота, 02 Марта 2013, 22:08 | Сообщение # 1
был не раз
Сейчас нет на сайте
Подскажите, как правильно составить логику, чтобы двигались объекты. То есть надо сделать, что бы 2 объекта независимо друг от друга, вращались, увеличивались, уменьшались.

у меня происходит, что первый метод выполняется(буква Е крутиться влево и в право), но не увеличивается и уменьшается(то есть этот метод не вызывается, на экране просто ничего не происходит). Не могу понять в чем дела?

Код

public class Lab2 {

     Point[] point;
     double angleFirstLetter =  0.0;
     float scaleLeftLetter = 0.0F;

     public void start() {
         try {
             Display.setDisplayMode(new DisplayMode(640, 480));   //set Window 640 x 480
             Display.setTitle("Lab1");
             Display.create();
         } catch (LWJGLException e) {
             e.printStackTrace();
              System.exit(0);
         }
         //Init
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         gluOrtho2D(0,10F,0,10F);
         glClearColor(255,0,0,1);

         glMatrixMode(GL_MODELVIEW);

         while (!Display.isCloseRequested()) {
             // render OpenGL here
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
             loadObject();
             pollInput();
             scaleLeftLetter();
             rotateLeftLetter();
             Display.update();
         }

         Display.destroy();
     }

     private void loadObject (){
         point = new Point[12];
         for(int i = 0; i < point.length; i++) {
             point[i] = new Point();
         }
         //First letter (E)
         point[0].x = 4F; point[0].y = 6.5F;
         point[1].x = 4F; point[1].y = 4.5F;
         point[2].x = 4F; point[2].y = 4.5F;
         point[3].x = 5F; point[3].y = 4.5F;
         point[4].x = 4F; point[4].y = 5.5F;
         point[5].x = 5F; point[5].y = 5.5F;
         point[6].x = 4F; point[6].y = 6.5F;
         point[7].x = 5F; point[7].y = 6.5F;
         //Second Letter (V)
         point[8].x = 6F; point[8].y = 6.5F;
         point[9].x = 7F; point[9].y = 4.5F;
         point[10].x = 7F; point[10].y = 4.5F;
         point[11].x = 8F; point[11].y = 6.5F;
     }

     private void drawFirstLetter() {
         glColor3f(200,255,0);
         glBegin(GL_LINES);

         for (int i = 0; i < 8; i++)
             glVertex2f(point[i].x, point[i].y);
         glEnd();
     }

     private void drawSecondLetter() {
         glColor3f(0,0,255);
         glBegin(GL_LINES);

         for (int i = 8; i < point.length; i++)
             glVertex2f(point[i].x, point[i].y);
         glEnd();
     }

     private void pollInput() {

         if (Mouse.isButtonDown(0)) {
             int x = Mouse.getX();
             int y = Mouse.getY();

             System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y);
         }

         if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
             System.out.println("SPACE KEY IS DOWN");
         }

         while (Keyboard.next()) {
             if (Keyboard.getEventKeyState()) {
                 if (Keyboard.getEventKey() == Keyboard.KEY_UP) {
                     scaleLeftLetter +=0.9F;
                     System.out.println(scaleLeftLetter);
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_DOWN) {
                     scaleLeftLetter -= 0.9F;
                     System.out.println(scaleLeftLetter);
                     scaleLeftLetter();
                 }
               
                  
                 //Rotate around left point to left
                 if (Keyboard.getEventKey() == Keyboard.KEY_W) {
                     angleFirstLetter  += 0.9D;
                     }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_E) {
                     angleFirstLetter  -= 0.9D;
                 }
             }
         }
     }
   private void rotateLeftLetter (){
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glPushMatrix();
       glTranslatef(4F,5.5F,0);
       glRotated(angleFirstLetter,0,0,1);
       glTranslatef(-4F,-5.5F,0);
       drawFirstLetter();
       glPopMatrix();
       drawSecondLetter();
   }
     private void scaleLeftLetter(){
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         glPushMatrix();
         glTranslatef(4F,5.5F,0);
         glScalef(scaleLeftLetter, scaleLeftLetter, 0);
         glTranslatef(-4F, -5.5F, 0);
         drawFirstLetter();
         glPopMatrix();
         drawSecondLetter();

     }

     public class Point {
         float x;
         float y;
     }

     public static void main(String[] argv) {
         Lab2 app = new Lab2();
         app.start();
     }
}
TimKruzДата: Суббота, 02 Марта 2013, 23:02 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата (zvx)
у меня происходит, что первый метод выполняется(буква Е крутиться влево и в право), но не увеличивается и уменьшается(то есть этот метод не вызывается, на экране просто ничего не происходит). Не могу понять в чем дела?

Оба метода выполняются, тут всё хорошо. Однако, команда glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) очищает буферы изображения и глубины, т.е., в данном случае, полностью стирает картинку. Сначала ты вызываешь scaleLeftLetter, она очищает буферы, рисует обе буквы, возвращает управление; далее идёт rotateLeftLetter, которая, в свою очередь, стирает всё, что нарисовала предыдущая функция (при чём та картинка так и не была выведена в видимый буфер), и рисует буквы уже по-своему.

Общий алгоритм можно составить по-разному, но нужно помнить, что очищение буфера обычно происходит перед прорисовкой кадра, затем буферы (видимый и задний) меняются местами и рисуется следующий кадр. При этом поворот, смещение и масштаб должны производиться один раз перед единичным вызовом прорисовки объекта, т.к. если нарисовать второй раз - это будет как бы уже другой объект (визуально). И, конечно, удобнее все эти операции делать в одной функции DrawXXX, соответствующей конкретному объекту (например, если использовать классы, то достаточно будет вызвать экземпляр_класса.draw).
Ну, скажем, так:
Код
loadObject(); //Загрузка объектов должна производиться один раз до основного цикла
while (!Display.isCloseRequested())
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Очищаем буфер
   pollInput(); //Анализируем клаву и мышь
   drawLeftLetter(); //Рисуем объекты
   drawSecondLetter();
   Display.update();
}

Код
private void drawFirstLetter()
{
   glPushMatrix();
     glTranslatef(4F,5.5F,0);
     glScalef(scaleLeftLetter, scaleLeftLetter, 0); //Масштаб
     glRotated(angleFirstLetter,0,0,1); //Поворот
     glTranslatef(-4F,-5.5F,0);
     //Дальше рисуем уже наш объект
     glColor3f(200,255,0);
     glBegin(GL_LINES);
       for (int i = 0; i < 8; i++)
         glVertex2f(point[i].x, point[i].y);
     glEnd();
   glPopMatrix();
}

Блок кода, начиная с glColor... и кончая glEnd можно заменить вызовом glCallList(id-списка), предварительно создав соответствующий список (тогда массив point[] можно спокойно удалить). Использование дисплейных списков удобнее и в чём-то эффективнее.
Ну вот, как-то так. Не факт, что будет работать правильно, но, надеюсь, алгоритм ясен.

P.S. Оформляй код аккуратнее, и соблюдай порядок функций (например, описание drawFirstLetter логичнее расположить до основного цикла, а описание класса Point до его непосредственного использования), а то с первого раза ничего не понятно было.




Сообщение отредактировал TimKruz - Суббота, 02 Марта 2013, 23:06
zvxДата: Воскресенье, 03 Марта 2013, 00:40 | Сообщение # 3
был не раз
Сейчас нет на сайте
Большое спасибо! Теперь стало все, вроде, понятней.

Единственное, когда вызываю этот метод (drawFirstLetter();) буква сама не рисуется, то есть изначально экран пустой, пока не нажмешь на клавиатуре, чтобы вызвалось увеличение или уменьшение, только после этого появляется бука и начинают работать поворот и увлечение. С чем это может быть связано?

Извините, что код не оформлен, это так сказать черновик для испытаний)

Если, возникнут вопросы, могу я ещё тут спросить?
TimKruzДата: Воскресенье, 03 Марта 2013, 16:58 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата (zvx)
Единственное, когда вызываю этот метод (drawFirstLetter();) буква сама не рисуется, то есть изначально экран пустой, пока не нажмешь на клавиатуре, чтобы вызвалось увеличение или уменьшение, только после этого появляется бука и начинают работать поворот и увлечение. С чем это может быть связано?

А, ну у тебя задано изначально float scaleLeftLetter = 0.0F, а вызов glScalef(0,0,0) просто сожмёт картинку как бы в точку (возможно, невидимую). Чтобы сохранить изначальные размеры, нужно вызывать glScalef(1,1,1), для увеличения использовать значения >1, а для уменьшения - от 0 до 1, т.к. glScalef умножает матрицу координат на матрицу увеличения, основанную на выбранных значениях x, y и z. Например, glScalef(2,2,1) увеличит изображение в два раза (в плоскости экрана), а glScalef(0.5,0.5,1) - уменьшит в два раза. На счёт отрицательных значений не уверен, но, вроде бы, картинка просто перевернётся/вывернется.
Цитата (zvx)
Если, возникнут вопросы, могу я ещё тут спросить?

Можно, конечно...




Сообщение отредактировал TimKruz - Воскресенье, 03 Марта 2013, 17:00
zvxДата: Пятница, 22 Марта 2013, 17:36 | Сообщение # 5
был не раз
Сейчас нет на сайте
Теперь, все работает. Только вот есть, маленькая беда. Если я кручу объект относительно его центра, а потом захочу покрутить относительно верхней точки, то он сразу прыгает на другую координату(то есть, видно как он с одного места прыгает в другое и там только начинает крутится), а не двигается с того места где ранее производились действия. Я так понимаю, что куда то надо добавить ещё Push/Pop,но не могу понять куда.

Код

package Labi;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.gluOrtho2D;

public class Lab2 {

     Point[] point;
     double angleFirstLetter =  0.0;
     float scaleFirstLetter = (float) 1;
     float firstDiagMove = (float) 0.0;
     float firstLetterGlTranslateX = 4.5F;
     float firstLetterGlTranslateY = 5.5F;
   //Varibels for second letter V
     double angleSecondLetter =  0.0;
     float scaleSecondLetter = (float) 1;
     float seocndDiagMove = (float) 0.0;
     float secondLetterGlTranslateX = 7.0F;
     float secondLetterGlTranslateY = 4.5F;

     private void drawFirstLetter() {
         glPushMatrix();
         glTranslatef(firstLetterGlTranslateX,firstLetterGlTranslateY,0);
         glRotated(angleFirstLetter,0,0,1); //Поворот
         glScalef(scaleFirstLetter, scaleFirstLetter, 0); //Масштаб
         glTranslatef(-firstLetterGlTranslateX,-firstLetterGlTranslateY,0);
         glTranslatef(firstDiagMove,firstDiagMove, 0);  //двигаем по диаганали
         //Дальше рисуем уже наш объект
         glColor3f(200,255,0);
         glBegin(GL_LINES);
         for (int i = 0; i < 8; i++)
             glVertex2f(point[i].x, point[i].y);
         glEnd();
         glPopMatrix();
     }

     private void drawSecondLetter() {
         glPushMatrix();
         glTranslatef(secondLetterGlTranslateX,secondLetterGlTranslateY,0);
         glRotated(angleSecondLetter,0,0,1); //Поворот
         glScalef(scaleSecondLetter, scaleSecondLetter, 0); //Масштаб
         glTranslatef(-secondLetterGlTranslateX,-secondLetterGlTranslateY,0);
         glTranslatef(seocndDiagMove,seocndDiagMove, 0);  //двигаем по диаганали
         //Дальше рисуем уже наш объект
         glColor3f(0,0,255);
         glBegin(GL_LINES);

         for (int i = 8; i < point.length; i++)
             glVertex2f(point[i].x, point[i].y);
         glEnd();
         glPopMatrix();
     }

     public void start() {
         try {
             Display.setDisplayMode(new DisplayMode(640, 480));   //set Window 640 x 480
             Display.setTitle("Lab1");
             Display.create();
         } catch (LWJGLException e) {
             e.printStackTrace();
              System.exit(0);
         }
         //Init
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         gluOrtho2D(0,10F,0,10F);
         glClearColor(255,0,0,1);
         loadObject();
         glMatrixMode(GL_MODELVIEW);

         while (!Display.isCloseRequested()) {
             // render OpenGL here
             glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
             pollInput();
             drawFirstLetter();
             drawSecondLetter();
             Display.update();
         }

         Display.destroy();
     }

     public class Point {
         float x;
         float y;
     }

     private void loadObject (){
         point = new Point[12];
         for(int i = 0; i < point.length; i++) {
             point[i] = new Point();
         }
         //First letter (E)
         point[0].x = 4F; point[0].y = 6.5F;
         point[1].x = 4F; point[1].y = 4.5F;
         point[2].x = 4F; point[2].y = 4.5F;
         point[3].x = 5F; point[3].y = 4.5F;
         point[4].x = 4F; point[4].y = 5.5F;
         point[5].x = 5F; point[5].y = 5.5F;
         point[6].x = 4F; point[6].y = 6.5F;
         point[7].x = 5F; point[7].y = 6.5F;
         //Second Letter (V)
         point[8].x = 6F; point[8].y = 6.5F;
         point[9].x = 7F; point[9].y = 4.5F;
         point[10].x = 7F; point[10].y = 4.5F;
         point[11].x = 8F; point[11].y = 6.5F;
     }

     private void pollInput() {

         if (Mouse.isButtonDown(0)) {
             int x = Mouse.getX();
             int y = Mouse.getY();

             System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y);
         }

         if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
             System.out.println("SPACE KEY IS DOWN");
         }

         while (Keyboard.next()) {
             if (Keyboard.getEventKeyState()) {
//                if (Keyboard.getEventKey() == Keyboard.KEY_UP) {
//                    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//                    glTranslatef(0, 0.9F, 0);
//                    drawFirstLetter();
//                    drawSecondLetter();
//                }
                 if (Keyboard.getEventKey() == Keyboard.KEY_UP) {     //увеличение относительно центра
                    scaleFirstLetter +=0.9F;
                     System.out.println(scaleFirstLetter);
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_DOWN) {   //уменьшение относительно центра
                     scaleFirstLetter -= 0.9F;
                     System.out.println(scaleFirstLetter);
                     //scaleLeftLetter();
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_LEFT) {
                    firstDiagMove+=1F;
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_RIGHT) {
                     firstDiagMove-=1F;
                 }
                 //Rotate around top point
                 if (Keyboard.getEventKey() == Keyboard.KEY_Q) {

                 }
                 //Rotate around left point to left
                 if (Keyboard.getEventKey() == Keyboard.KEY_W) {    //вращение относительно центра
                     firstLetterGlTranslateX = 4.5F;
                     firstLetterGlTranslateY = 5.5F;
                     angleFirstLetter  += 5.0D;
                     }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_E) {
                     firstLetterGlTranslateX = 4.5F;                //вращение относительно центра
                     firstLetterGlTranslateY = 5.5F;
                     angleFirstLetter  -= 5.0D;
                 }
                 //Rotate around left point to left
                 if (Keyboard.getEventKey() == Keyboard.KEY_R) {    //вращение самой верхней точки
                     firstLetterGlTranslateX = 4.5F;
                     firstLetterGlTranslateY = 6.5F;
                     angleFirstLetter  += 5.0D;
                 }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_T) {
                     firstLetterGlTranslateX = 4.5F;                //вращение самой верхней точки
                     firstLetterGlTranslateY = 6.5F;
                     angleFirstLetter  -= 5.0D;
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_Y) {    //вращение самой левой точки
                     firstLetterGlTranslateX = 4.0F;
                     firstLetterGlTranslateY = 5.5F;
                     angleFirstLetter  += 5.0D;
                 }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_U) {
                     firstLetterGlTranslateX = 4.0F;                //вращение самой левой точки
                     firstLetterGlTranslateY = 5.5F;
                     angleFirstLetter  -= 5.0D;
                 }
                 //Control for Second Letter V////////////////////////////////////////////////////////
                 if (Keyboard.getEventKey() == Keyboard.KEY_Z) {     //увеличение относительно центра
                     scaleSecondLetter +=0.5F;
                     System.out.println(scaleSecondLetter);
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_X) {   //уменьшение относительно центра
                     scaleSecondLetter -= 0.5F;
                     System.out.println(scaleSecondLetter);
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_C) {
                     seocndDiagMove+=1F;
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_V) {
                     seocndDiagMove-=1F;
                 }
                 //Rotate around left point to left
                 if (Keyboard.getEventKey() == Keyboard.KEY_A) {    //вращение относительно центра
                     secondLetterGlTranslateX = 7.0F;
                     secondLetterGlTranslateY = 5.5F;
                     angleSecondLetter  += 5.0D;
                 }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_S) {
                     secondLetterGlTranslateX = 7.0F;                //вращение относительно центра
                     secondLetterGlTranslateY = 5.5F;
                     angleSecondLetter  -= 5.0D;
                 }
                 //Rotate around left point to left
                 if (Keyboard.getEventKey() == Keyboard.KEY_D) {    //вращение самой верхней точки
                     secondLetterGlTranslateX = 7.0F;
                     secondLetterGlTranslateY = 6.5F;
                     angleSecondLetter  += 5.0D;
                 }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_F) {
                     secondLetterGlTranslateX = 7.0F;                //вращение самой верхней точки
                     secondLetterGlTranslateY = 6.5F;
                     angleSecondLetter  -= 5.0D;
                 }
                 if (Keyboard.getEventKey() == Keyboard.KEY_G) {    //вращение самой левой точки
                     secondLetterGlTranslateX = 6.0F;
                     secondLetterGlTranslateY = 6.5F;
                     angleSecondLetter  += 5.0D;
                 }
                 //Rotate around left point to rigth
                 if (Keyboard.getEventKey() == Keyboard.KEY_H) {
                     secondLetterGlTranslateX = 6.0F;                //вращение самой левой точки
                     secondLetterGlTranslateY = 6.5F;
                     angleSecondLetter  -= 5.0D;
                 }
             }
         }
     }

     public static void main(String[] argv) {
         Lab2 app = new Lab2();
         app.start();
     }
}
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг