Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PyOpenGL在Python中只移动2个立方体中的一个_Python_Opengl_Pygame_Pyopengl_Opengl Compat - Fatal编程技术网

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

使用PyOpenGL在Python中只移动2个立方体中的一个,python,opengl,pygame,pyopengl,opengl-compat,Python,Opengl,Pygame,Pyopengl,Opengl Compat,所以,我对PyOpenGL非常陌生,我想制作一个简单的3D游戏 我创建了一个较大的立方体(它应该代表玩家)和一个较小的立方体(它应该代表敌人)。 我需要一个球员能够左右移动,敌人从前面来。 问题是他们处于相同的位置 我使用glTranslatef(x,y,z)移动玩家,但敌人移动到与玩家相同的位置 这是我的密码: import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import*

所以,我对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()
现在,我只希望敌人和玩家移动时不要处于同一位置。 无论如何,谢谢你的帮助

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

#设置投影矩阵
glMatrixMode(GL_投影)
透视图(70,(显示宽度/显示高度),0.1,50.0)
#集合视图矩阵
glMatrixMode(GLU模型视图)
glTranslatef(0.0,-5.0,-12.0)
glRotatef(20,1,0.0,0.0)
游戏结束=错误
虽然游戏尚未结束:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
游戏结束=正确
display.clear()
player.move()
player.draw()
敌人,抽签
display.update()
此设置允许以后更改视角

场景中每个对象的单独运动、动画和位置可以通过每个对象的模型矩阵实现。绘制对象前存储当前模型视图矩阵,绘制对象后恢复矩阵。
这样可以为每个对象设置单独的位置。在属性中存储对象的当前位置(
self.pos=[0,0,0]
)。在绘制对象之前,操纵
move
(例如
self.pos[0]-=0.2
)中的位置,并将模型转换矩阵乘以当前模型视图矩阵(
glTranslatef(*self.pos)
)。e、 g:

职业玩家:
定义初始化(自身、顶点、边):
self.vertices=顶点
self.edges=边
self.pos=[0,0,0]
def移动(自我):
self.k_press=pygame.key.get_press()
如果self.k_按[pygame.k_左]:
自身位置[0]=0.2
如果self.k_按[pygame.k_RIGHT]:
self.pos[0]+=0.2
def牵引(自):
glPushMatrix()
GLTRANSTEF(*self.pos)
glBegin(GLU线)
对于player.edges中的edge:
对于边中的顶点:
glVertex3fv(播放器.顶点[顶点])
格伦德()
GLPOP矩阵()
class敌人:
定义初始化(自身、顶点、边):
self.vertices=顶点
self.edges=边
self.pos=[0,0,0]
def牵引(自):
glPushMatrix()
GLTRANSTEF(*self.pos)
glBegin(GLU线)
对于敌人中的边缘。边缘:
对于边中的顶点:
glVertex3fv(敌方顶点[顶点])
格伦德()
GLPOP矩阵()

谢谢,老兄,很抱歉打扰你,但我刚开始讲这个,对此我不太了解。再次感谢!