在使用PyOpenGL的Python中仅移动2个立方体中的一个

问题描述 投票:1回答:1

所以,我是PyOpenGL的新手,我想制作一个简单的3D游戏。

我创建了一个较大的立方体(应代表玩家)和一个较小的立方体(应代表敌人)。我需要一个能够左右移动的球员,并且需要敌人从前线来。问题在于它们处于同一位置。

我正在使用glTranslatef(x, y, z)来移动玩家,但敌人会移动到与玩家相同的位置。

这是我的代码:

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import*


class display:
    def __init__(self, width, height, window):
        self.width = width
        self.height = height
        self.window = window

    def update(self):
        pygame.display.flip()
        pygame.time.wait(10)

    def clear(self):
        glClearColor(0.15, 0.15, 0.15, 1)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)


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


class player:
    def __init__(self, vertices, edges):
        self.vertices = vertices
        self.edges = edges

    def begin(self):
        glTranslatef(0.0, -5.0, -12.0)
        glRotatef(20, 1, 0.0, 0.0)

    def move(self):
        self.k_press = pygame.key.get_pressed()
        if self.k_press[pygame.K_LEFT]:
            glTranslatef(-0.2, 0, 0)
        if self.k_press[pygame.K_RIGHT]:
            glTranslatef(0.2, 0, 0)

    def draw(self):
        glBegin(GL_LINES)
        for edge in player.edges:
            for vertex in edge:
                glVertex3fv(player.vertices[vertex])
        glEnd()


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


class enemy:
    def __init__(self, vertices, edges):
        self.vertices = vertices
        self.edges = edges

    def draw(self):
        glBegin(GL_LINES)
        for edge in enemy.edges:
            for vertex in edge:
                glVertex3fv(enemy.vertices[vertex])
        glEnd()


enemy = enemy(
    ((0.5, -0.5, -0.5), (0.5, 0.5, -0.5), (-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5), (0.5, -0.5, 0.5), (0.5, 0.5, 0.5), (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5)),
    ((0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7), (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7))
)


gluPerspective(70, (display.width/display.height), 0.1, 50.0)

player.begin()

game_over = False
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    display.clear()

    player.move()
    player.draw()
    enemy.draw()

    display.update()

pygame.quit()

现在,我只希望敌人和玩家在不处于同一位置的情况下移动。无论如何,谢谢您的帮助!

python pygame pyopengl opengl-compat
1个回答
0
投票

首先使用glMatrixMode区分投影矩阵和模型矩阵。投影矩阵应设置为当前投影矩阵,视图矩阵应设置为当前模型视图矩阵。

glMatrixMode

此设置将允许以后更改视角。

可以通过每个对象的模型矩阵来实现场景中每个对象的单独运动,动画和位置。在绘制对象之前存储当前模型视图矩阵,并在通过# set projection matrix glMatrixMode(GL_PROJECTION) gluPerspective(70, (display.width/display.height), 0.1, 50.0) # set view matrix glMatrixMode(GL_MODELVIEW) glTranslatef(0.0, -5.0, -12.0) glRotatef(20, 1, 0.0, 0.0) game_over = False while not game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True display.clear() player.move() player.draw() enemy.draw() display.update() 绘制对象之后恢复该矩阵视图矩阵。这样可以为每个对象设置一个单独的位置。将对象的当前位置存储在属性(glPushMatrix/glPopMatrix)中。操作glPushMatrix中的位置(例如glPopMatrix),然后在绘制对象之前将模型平移矩阵乘以当前模型视图矩阵(self.pos = [0, 0, 0])。例如:

move
self.pos[0] -= 0.2
© www.soinside.com 2019 - 2024. All rights reserved.