如何在opengl和pygames中用键盘键移动立方体?

2024-09-30 16:25:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用OpenGL和pygames制作一个3d蛇游戏。我可以生成一个立方体,也可以在任意位置“生成”它。但是我不知道怎么用键盘移动立方体。后来我也应该有可能多加些“身体碎片”,它们也朝着同一个方向移动。我希望有人能帮助我。我将张贴孔程序,但我是一个新手程序员,所以请不要把我的“糟糕的编程”和我的英语。如果您有任何问题需要更多的细节,请随时提问。我会尽快做出反应。在

谢谢你

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

Tags: ineventnewforifpygamedictmax
1条回答
网友
1楼 · 发布于 2024-09-30 16:25:42

按下的键存储在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)

相关问题 更多 >