如何解决我试图在 C++ 中只移动一个对象,但它移动了整个屏幕,我如何使用 WASD 在 Visual Studios 2017 中移动一个对象
我正在尝试重新创建游戏乒乓球,我花了几个小时试图弄清楚如何上下移动玩家 a 的矩形,我终于成功了,但是,而不是只移动玩家,它移动整个屏幕,当我在它时,我还想问一下如何使用 w 和 s 键移动玩家 b 以及?我不知道如何检测 w 和 s 键输入,这是我的代码,如果能得到任何帮助,我将不胜感激
#include "GL/freeglut.h"
#include <windows.h>
#include <iostream>
using namespace std;
HANDLE g_hImage;
HWND g_hWnd = NULL;
float yr = 50.0;
int xr = 10,zr = 0;
void speicalkeys(int key,int x,int y) { // controls for player A
switch (key) {
case gluT_KEY_UP:
yr = yr + 5;
cout << y << endl;
glutPostRedisplay();
break;
case gluT_KEY_DOWN:
yr = yr - 5;
cout << y << endl;
glutPostRedisplay();
break;
}
}
class Vertex {
public:
GLdouble x,y,z;
Vertex(GLdouble x1,GLdouble y1,GLdouble z1) {
x = x1;
y = y1;
z = z1;
}
};
GLdouble angle_around = 2.0;
GLdouble setangle_around = 2.0;
void Game_Init() {
g_hImage = LoadImage(NULL,"images/HTP.bmp",IMAGE_BITMAP,LR_LOADFROMFILE);
}
void Game_HTP() {
HDC hDC = GetDC(g_hWnd);
HDC hImageDC = CreateCompatibleDC(hDC);
BITMAP Bitmap;
Getobject(g_hImage,sizeof(BITMAP),&Bitmap);
int w = Bitmap.bmWidth;
int h = Bitmap.bmHeight;
SelectObject(hImageDC,g_hImage);
BitBlt(hDC,100,125,w,h,hImageDC,SRCcopY);
DeleteDC(hImageDC);
ReleaseDC(g_hWnd,hDC);
}
void Game_Shutdown() {
DeleteObject(g_hImage);
}
void drawRectangle(Vertex v1,Vertex v2,Vertex v3,Vertex v4) {
glBegin(GL_QUADS);
glVertex3d(v1.x,v1.y,v1.z);
glVertex3d(v2.x,v2.y,v2.z);
glVertex3d(v3.x,v3.y,v3.z);
glVertex3d(v4.x,v4.y,v4.z);
glEnd();
}
void drawStick(GLdouble length,GLdouble width,GLdouble height,GLdouble red,GLdouble green,GLdouble blue) {
Vertex v1(length,height / 2,width / 2);
Vertex v2(0.0,width / 2);
Vertex v3(0.0,-width / 2);
Vertex v4(length,-width / 2);
Vertex v5(length,-height / 2,width / 2);
Vertex v6(0.0,width / 2);
Vertex v7(0.0,-width / 2);
Vertex v8(length,-width / 2);
glColor3d(red,green,blue);
drawRectangle(v1,v2,v3,v4); // top face
drawRectangle(v5,v6,v7,v8); // bottom face
drawRectangle(v1,v5,v2); // front face
drawRectangle(v4,v8,v3); // back face
drawRectangle(v2,v6); // left face
drawRectangle(v1,v4,v5); // right face
}
void initRendering() {
glEnable(GL_DEPTH_TEST); // makes 3D drawing work
}
void cameraSetup(int w,int h) {
glViewport(0,400,400); // set the viewport
glMatrixMode(GL_PROJECTION); // select projection matrix
glLoadIdentity(); // reset projection matrix
gluPerspective(90.0,1,1.0,100.0); // set up a perspective projection matrix
}
void display() {
glClearColor(0.5,0.5,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen and Depth Buffer
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//*** Build object ***//
glTranslated(43.0,0.0,-48.0);
drawStick(2.0,4.0,100.0,0.4,0.1); //Right stick
glTranslated(-88.0,0.0);
drawStick(2.0,0.1); //Left stick
glTranslated(0.0,45.0,0.0);
drawStick(87.5,2.0,0.0); //Top stick
glTranslated(0.0,-90.0,0.0); //Down stick
glTranslated(xr,yr,zr);
drawStick(2.0,15.0,0.0); //player A
glTranslated(100.0,2.5,30.0,1.0); //player B
glTranslated(-69,0.0);
glColor3d(1.0,0.0);
glutSolidSphere(3.5,10,10); //Ball
glTranslated(-85.0,0.0);
drawStick(181,181.0,0.7,0.7); //plane
//*** Build object ***//
glFlush();
glutPostRedisplay();
glutSwapBuffers();
}
void keyboard(unsigned char key,int mousePositionX,int mousePositionY) {
switch (key) {
case 27: // [ESCAPE] key
exit(0);
break;
//*** Task-B,C,D,E Step-3 ***
case 'h':
g_hImage = LoadImage(NULL,LR_LOADFROMFILE);
Game_HTP();
break;
//*** Task-B,E Step-3 ***
default: break;
}
}
int main(int argc,char **argv) {
cout << "Programmer: <pong game>\n";
cout << "Compiled on " __DATE__ "," __TIME__ << endl << endl;
// init gluT and create Window
glutinit(&argc,argv); // gluT initialization
glutinitdisplayMode(gluT_DOUBLE | gluT_RGB | gluT_DEPTH);
glutinitwindowSize(400,400); // set the window size
// create the window
glutCreateWindow("pong game");
initRendering(); // initialize rendering
// set handler functions
glutdisplayFunc(display); // display function
glutKeyboardFunc(keyboard); // keyboard handler
glutReshapeFunc(cameraSetup); // resizes window and camera setup
glutSpecialFunc(speicalkeys); // keyboard callback function
glutMainLoop(); //run gluT mainloop
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。