我想为这个http://www.sciencekids.co.nz/gamesactivities/movinggrowing.html
创建一个类似的游戏1 - 如何根据鼠标的坐标移动图像?我知道如何翻译我喜欢多边形而不是图像的对象?
2-如何检查它是否正确,并使其卡在那里 我使用gltranslate,但图像没有移动,并尝试copypixl但它不断复制图像 鼠标击中的每一个地方。
#include <windows.h>
#include <GL/glut.h>
#include <gl/glaux.h>
#pragma comment(lib,"glaux.lib")
AUX_RGBImageRec *image ;
GLsizei wh = 600, ww = 800;
//-----------------------------------------------------------------------------------------------
void display(void){
image = new AUX_RGBImageRec();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
image = auxDIBImageLoad(L"boy.bmp");
glDrawPixels(image->sizeX, image->sizeY, GL_RGB,
GL_UNSIGNED_BYTE,image->data);
glFlush();
}
//-----------------------------------------------------------------------------------------------
void mouse (int btn , int state , int x , int y){
int h = wh-y ;
if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
/*glPushMatrix();*/
/*glTranslatef(x , h , 0);*/
glRasterPos2i(x,h);
glCopyPixels(0,0,image->sizeX, image->sizeY,GL_COLOR);
//glPopMatrix();}
if(btn == GLUT_LEFT_BUTTON && state == GLUT_UP) {
// check if it is in right place to stuck it else will retuen to original place
}
}glFlush();
}
//-----------------------------------------------------------------------------------------------
void intiate(){
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D(0,ww,0,wh);
}
//-----------------------------------------------------------------------------------------------
void main()
{
glutInitDisplayMode (GLUT_RGB);
glutInitWindowSize (ww, wh);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Inside my Body");
intiate();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
}
答案 0 :(得分:1)
1 - 如何根据鼠标的坐标移动图像?我知道如何翻译我喜欢多边形而不是图像的对象?
首先:请不要使用glDrawPixels。使用纹理代替,应用于常规几何体。 OpenGL不处理用户输入,因此您必须自己实现鼠标交互。 从不将OpenGL绘图命令放在输入事件处理程序中。在输入事件处理程序中,更改一些变量,设置标志等但不绘制。设置标志后,发出重绘以便绘制更新。
2-如何检查它是否在正确的位置并使其卡在那里
OpenGL是一个绘图API,而不是场景图。你告诉它画什么,就是这样。如果事情看起来不像你期待的那样,那么你就没有把它们画好。
Pro-Tip:将所有OpenGL命令放在绘图程序中。不要在任何其他地方调用任何OpenGL函数。您在initiate
函数中执行的操作实际上属于显示功能。