代码之家  ›  专栏  ›  技术社区  ›  agayev169

GLUT暂停键盘工作

  •  0
  • agayev169  · 技术社区  · 7 年前

    我试图在GLUT c++上编写“经典蛇”,但遇到了一些问题。

    例如,当我的蛇向右移动时,我将目的地更改为向上,同时将其更改为向右,蛇就会进入自身内部(我禁止将目的地从右向左更改)。打了一秒钟电话后,我想尝试暂停键盘功能,但我找不到任何决定。

    我将在此处附上一段代码:

    void keyboardSpecial(int k, int x, int y) {
        switch (k) {
            case GLUT_KEY_UP:
                if (snake.dest == UP || snake.dest == DOWN) break;
                else snake.dest = UP;
                break;
            case GLUT_KEY_RIGHT:
                if (snake.dest == LEFT || snake.dest == RIGHT) break;
                else snake.dest = RIGHT;
                break;
            case GLUT_KEY_DOWN:
                if (snake.dest == UP || snake.dest == DOWN) break;
                else snake.dest = DOWN;
                break;
            case GLUT_KEY_LEFT:
                if (snake.dest == LEFT || snake.dest == RIGHT) break;
                else snake.dest = LEFT;
                break;
        }
    }
    
    void timer(int) {
        //Eating and growing
        if(snake.sn[snake.size - 1].x == food.pos.x && snake.sn[snake.size - 1].y == food.pos.y) {
            food.eat();
            snake.sn[snake.size].x = snake.sn[snake.size - 1].x;
            snake.sn[snake.size].y = snake.sn[snake.size - 1].y;
            snake.size++;
        }
    
        //Motion
        for (int i = 1; i < snake.size; i++) {
            snake.sn[i - 1].x = snake.sn[i].x;
            snake.sn[i - 1].y = snake.sn[i].y;
        }
        if (snake.dest == RIGHT) {
            snake.sn[snake.size - 1].x++;
        }
        if (snake.dest == UP) {
            snake.sn[snake.size - 1].y--;
        }
        if (snake.dest == LEFT) {
            snake.sn[snake.size - 1].x--;
        }
        if (snake.dest == DOWN) {
            snake.sn[snake.size - 1].y++;
        }
    
        //Walls
        if(snake.sn[snake.size - 1].x <= 0) snake.sn[snake.size - 1].x += 640 / dx;
        if(snake.sn[snake.size - 1].x >= 640 / dx) snake.sn[snake.size - 1].x -= 640 / dx;
        if(snake.sn[snake.size - 1].y <= 0) snake.sn[snake.size - 1].y += 480 / dy;
        if(snake.sn[snake.size - 1].y >= 480 / dy) snake.sn[snake.size - 1].y -= 480 / dy;
    
        //Game Over
        for (int i = 0; i < snake.size - 1; i++) {
            if(snake.sn[snake.size - 1].x == snake.sn[i].x && snake.sn[snake.size - 1].y == snake.sn[i].y) {cout << "Game Over!" << endl;exit(0);}
        }
    
        display();
        glutTimerFunc(200 - snake.size, timer, 0);
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   SoronelHaetir    7 年前

    有一个保存的时间值,可以与键盘处理程序开头的值进行比较,如果没有足够的时间,只需返回即可。接下来,仅当接受键操作时更新该值。