我试图在 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 (将#修改为@)