私はOpenGLを学ぶクラスに入っています。教授はVisual Studioを使用していますが、これはParallelsのインストールとあまりうまく連携していないため、XCodeを使用することにしました(これは私が好む方法です)。基本的なサンプルコードが動作していますが、教授が私たちに与えた例を実行する際に問題があります。ここでは、次のとおりです。OpenGL:Visual StudioソースコードからXCode 4?
#include <glut.h> //must be included for OpenGL
#include <gl\gl.h> //must be included for OpenGL
#include <time.h> //must be included for time functions
#include <iostream> //must be included for console input/output
using namespace std;
#define WINDOW_WID 800
#define WINDOW_HEI 600
int randomPx, randomPy;
/////////////////////////////////////////
void myInit(void)
{
randomPx = 400;
randomPy = 300;
glClearColor (1.0, 1.0, 1.0, 0.0); // set background color to black
glShadeModel (GL_FLAT);
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT); // clear the screen
glColor3f(1,0,0); //set the drawing color
glPointSize(10); //set the point size
glBegin(GL_POINTS);
glVertex2d(randomPx,randomPy); //Set the position of the vertex
glEnd();
glutSwapBuffers(); //put everything on your screen
}
void myReshape (int w, int h)
{
glViewport (0, 0, w, h);
glMatrixMode (GL_PROJECTION); // set "camera type"
glLoadIdentity(); // clear the matrix
glOrtho(0.0, w, 0.0, h, -1.0, 1.0); // viewing transformation
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
}
void Animation()
{
srand(time(NULL)+rand()); //set the seed for your rand function
randomPx = rand()%WINDOW_WID;
randomPy = rand()%WINDOW_HEI;
Sleep(200); //put the program to sleep for 200 ms
myDisplay();
}
void myMouse(int button, int state, int x, int y)
{
y = WINDOW_HEI - y;
switch (button)
{
case GLUT_LEFT_BUTTON: //when left mouse button is clicked
if (state == GLUT_DOWN)
{
cout << "When mouse is up, animation starts\n";
}
else if(state == GLUT_UP)
{
glutIdleFunc(Animation); //do Animation when idle
}
break;
case GLUT_RIGHT_BUTTON: //when right mouse button is clicked
if (state == GLUT_DOWN)
{
glutIdleFunc(NULL); //do nothing when idle
}
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
{
exit (-1); //exit your program
}
break;
}
myDisplay();
}
void myMotion(int x, int y)
{
y = WINDOW_HEI - y;
myDisplay();
}
void myKeyboard(unsigned char key, int x, int y)
{
//TODO
myDisplay();
}
/*
* Request double buffer display mode.
* Register mouse input callback functions
*/
int main(int argc, char** argv)
{
glutInit(&argc, argv); // initialize the toolkit
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // set display mode
// glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // set display mode
glutInitWindowSize (WINDOW_WID, WINDOW_HEI); // set screen window size
glutInitWindowPosition (100, 100); // set window position on screen
glutCreateWindow (argv[0]); // open the screen window
myInit();
glutDisplayFunc(myDisplay); // register redraw function
glutReshapeFunc(myReshape); // register reshape function
glutMouseFunc(myMouse); //GLUT provides a way for you to register the function that will be responsable for processing events generated by mouse clicks.
glutMotionFunc(myMotion); //There are two types of motion that GLUT handles: active and passive motion. Active motion occurs when the mouse is moved and a button is pressed.
glutKeyboardFunc(myKeyboard);
//glutPassiveMotionFunc(myPassiveMotion); //Passive motion is when the mouse is moving but no buttons are pressed. If an application is tracking motion, an event will be generated per frame during the period that the mouse is moving.
//glutEntryFunc(processMouseEntry); //GLUT is also able to detect when the mouse leaves or enters the window region. A callback function can be registered to handle these two events.
glutMainLoop(); // go into a perpetual loop
return 0;
}
私は輸入文を取り出し、そして例えば、XCodeのOpenGLのコードを輸入して、それらを置き換え:
#include <iostream>
#include <GLUT/glut.h>
#include <time.h>
そして、私はすべてのエラーメッセージを得ることはありませんが、ときに私アプリケーションを実行してウィンドウをクリックすると、想定されているアニメーションが開始されません。 (クラス内の他のすべてのコンピュータ上のVisual Studioで、それがうまく働いたので、私は、それが動作を知っている。)
ははそれが出て印刷することによって、画面上でのクリックを登録し :
「マウスがアップすると、アニメーションが開始されます」しかしその後、私はXcodeを介して実行を停止するまで、私に死のスピニングビーチボールを与えます。だから私はこれを動作させるために調整する必要がある何か他にありますか?
バックスラッシュは教授のコードから来ています。その下に彼は書いた、彼は彼のシステムのためにそれをどのように置き換えましたか。 – datenwolf
それを指摘してくれてありがとう。実際の答えはObjective-Cを組み込んでいないので、小文字のsleep()が見つかりましたが、数秒で表示されます(アプリは凍っていました(ミリ秒単位だと思っていましたが、200秒間スリープしていました)マイクロセカンドで動作します。 – Derek