python - 如何在opengl和pygame中用键盘按键移动立方体?

标签 python opengl keyboard pygame

我正在尝试使用 OpenGL 和 pygames 制作 3d 贪吃蛇游戏。我能够生成一个立方体并在随机位置“生成”它。但我不知道如何使用键盘移动立方体。稍后我还应该可以添加更多的“ body 部件”,它们也朝同一方向移动。我希望有一个人可以帮助我。我将发布漏洞程序,但我是一个新手程序员,所以请不要因为我的“糟糕的编程”和我的英语而评判我。如果您对更多详细信息有任何疑问,请随时询问。我会尽力尽快回复。

谢谢

import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

import random

xr = 0
yr = 0
zr = 0

snakevertices = (
    (2+xr, 0+yr, 0+zr),
    (2+xr, 2+yr, 0+zr),
    (0+xr, 2+yr, 0+zr),
    (0+xr, 0+yr, 0+zr),
    (2+xr, 0+yr, 2+zr),
    (2+xr, 2+yr, 2+zr),
    (0+xr, 0+yr, 2+zr),
    (0+xr, 2+yr, 2+zr),
    )

edges = (
    (0, 1),
    (0, 3),
    (0, 4),
    (2, 1),
    (2, 3),
    (2, 7),
    (6, 3),
    (6, 4),
    (6, 7),
    (5, 1),
    (5, 4),
    (5, 7),
    )

surfaces = (
    (0,1,2,3),
    (3,2,7,6),
    (6,7,5,4),
    (4,5,1,0),
    (1,5,7,2),
    (4,0,3,6),
    )

snakecolors = (
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    (0.1,1,0.1),
    )


def set_snakevertices(max_snakedistance):

    x_snake_change = 1 + xr#random.randrange(-1,10)
    y_snake_change = 1 + yr#random.randrange(-5,5)
    z_snake_change = random.randrange(-15,-5)
    new_snakevertices = []


    for snakevert in snakevertices:
        new_snakevert = []

        new_snakex = snakevert[0] + x_snake_change
        new_snakey = snakevert[1] + y_snake_change
        new_snakez = snakevert[2] + z_snake_change

        new_snakevert.append(new_snakex)
        new_snakevert.append(new_snakey)
        new_snakevert.append(new_snakez)

        new_snakevertices.append(new_snakevert)

    return new_snakevertices



def Snake(snakevertices):
    glBegin(GL_QUADS)
    for surface in surfaces:

        for vertex in surface:

            glColor3fv((0,1,0))
            glVertex3fv(snakevertices[vertex])
    glEnd()

    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glColor3fv((0,0,0))
            glVertex3fv(snakevertices[vertex])

    glEnd()

def main():


    pygame.init()
    display = (800,600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

    gluPerspective(45, (display[0]/display[1]), 0.1, 100.0)

    x_koor = 0
    y_koor = 0
    glTranslatef(x_koor, y_koor, -5)


    glRotatef(25, 0, 50, 0)
    object_passed = False


    max_snakedistance = 100
    snake_dict = {}
    for x in range(1):                                          #anzahl würfel
        snake_dict[x] = set_snakevertices(max_snakedistance)



    while not object_passed:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.type == pygame.K_a:
                    xr += -1
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)
                if event.type == pygame.K_d:
                    xr += 1
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)
                if event.type == pygame.K_w:
                    yr += -1
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)
                if event.type == pygame.K_s:
                    yr += 1
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)
                if event.type == pygame.K_o:
                    zr += -1
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)
                if event.type == pygame.K_l:
                    zr += 1
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)


                if event.key == pygame.K_m:
                    for x in range(1):
                        snake_dict[x] = set_snakevertices(max_snakedistance)



            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 4:
                    glTranslatef(0,0,1.0)

                if event.button == 5:
                    glTranslatef(0,0,-1.0)



        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        glTranslatef(x_koor,y_koor,0)
        for each_Snake in snake_dict:
            Snake(snake_dict[each_Snake])

        pygame.display.flip()
        pygame.time.wait(1)

main()
pygame.quit()
quit()

最佳答案

按下的键存储在 key 成员中,而不是 event 对象的 type 成员中:

当您检查按下的键时,将type更改为key:

例如

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT :
        glTranslatef(-1.0,0,0.0)
    if event.key == pygame.K_RIGHT :
        glTranslatef(1.0,0,0.0)
    if event.key == pygame.K_UP :
        glTranslatef(0.0,0,-1.0)
    if event.key == pygame.K_DOWN :
        glTranslatef(0.0,0,1.0)

关于python - 如何在opengl和pygame中用键盘按键移动立方体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52128972/

相关文章:

python - 你如何在 Ruby 中做等同于 python 的列表切片?

python - 复制的旧列表引用被 python 中的新列表对象修改所更改

python - 实现模式匹配 - 何时使用缓存?

javascript - PythonJS 本地服务器

c - eclipse 上 openGl 的问题

c# - 单击 winforms (C#) 中的按钮后,如何将 `SendKeys` 发送到最后一个事件输入文本框?

ios - 使用键盘和中心自动布局管理 View

c++ - 如何在不使用 glaux 的情况下添加多个纹理?

opengl - Shader的功能参数表现

java - Android - 获取键盘按键