如何在opengl和pygames中使用键盘键移动多维数据集?

时间:2018-09-01 14:19:53

标签: python opengl keyboard pygame

我正在尝试使用OpenGL和pygames制作3D蛇游戏。我能够生成一个多维数据集,也可以在任意位置“生成”它。但是我不知道如何使用键盘移动立方体。后来我也应该在possilbe上添加更多的“身体部位”,它们也朝着相同的方向移动。我希望有一个人可以帮助我。我将发布Hole程序,但是我是一个新手程序员,所以请不要因为我的“不良编程”和我的英语而迷惑我。如果您有更多疑问,请随时提出。我将尝试尽快做出回应。

谢谢

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()

1 个答案:

答案 0 :(得分:2)

所按下的键存储在Shell "cmd /c cd %tmp% && echo hello > tmpfile", 0 Shell "cmd /c cd %tmp% && echo hello > tmpfile", 0 对象的key成员中,而不存储在type成员中:

在检查按下的键时,将event更改为type

例如

key