Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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/7/sql-server/27.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
如何使用Python和PyGame在OpenGL上显示二维图形_Python_Python 3.x_Opengl_Pygame_Pyopengl - Fatal编程技术网

如何使用Python和PyGame在OpenGL上显示二维图形

如何使用Python和PyGame在OpenGL上显示二维图形,python,python-3.x,opengl,pygame,pyopengl,Python,Python 3.x,Opengl,Pygame,Pyopengl,我正在尝试用python、pygame和OpenGL制作一个游戏,我想在屏幕中央制作一个十字线,这样当他们环顾四周时,就可以看到他们要点击的内容。我这样做,它隐藏了他们的光标,并将其移动到窗口的中心,但我不知道如何在pygame中的opengl上创建一个形状。我是pygame和opengl的初学者。这可能真的很容易,但我找不到答案请帮助解决您的问题,并提前表示感谢。 这是我的代码,如果你想确保你所做的工作在我的情况下工作 import pygame import time from pygame

我正在尝试用python、pygame和OpenGL制作一个游戏,我想在屏幕中央制作一个十字线,这样当他们环顾四周时,就可以看到他们要点击的内容。我这样做,它隐藏了他们的光标,并将其移动到窗口的中心,但我不知道如何在pygame中的opengl上创建一个形状。我是pygame和opengl的初学者。这可能真的很容易,但我找不到答案
请帮助解决您的问题,并提前表示感谢。

这是我的代码,如果你想确保你所做的工作在我的情况下工作

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

block = [
    [0,1,0],
    [1,0,0],
    [1,0,1],
    [0,0,1],
    [1,1,0],
    [0,1,1]
]


def Cube(x,y,z):
    glBegin(GL_TRIANGLES)
    glColor3f(block[0][0], block[0][1], block[0][2])  # N
    glVertex3f(x + .5, y + 1, z + .5)
    glVertex3f(x - .5, y + 1, z + .5)
    glVertex3f(x - .5, y,     z + .5)
    glVertex3f(x - .5, y,     z + .5)
    glVertex3f(x + .5, y,     z + .5)
    glVertex3f(x + .5, y + 1, z + .5)
    glColor3f(block[1][0], block[1][1], block[1][2])  # S
    glVertex3f(x - .5, y + 1, z - .5)
    glVertex3f(x + .5, y + 1, z - .5)
    glVertex3f(x + .5, y,     z - .5)
    glVertex3f(x + .5, y,     z - .5)
    glVertex3f(x - .5, y,     z - .5)
    glVertex3f(x - .5, y + 1, z - .5)
    glColor3f(block[2][0], block[2][1], block[2][2])  # W
    glVertex3f(x + .5, y + 1, z - .5)
    glVertex3f(x + .5, y + 1, z + .5)
    glVertex3f(x + .5, y,     z + .5)
    glVertex3f(x + .5, y,     z + .5)
    glVertex3f(x + .5, y,     z - .5)
    glVertex3f(x + .5, y + 1, z - .5)
    glColor3f(block[3][0], block[3][1], block[3][2])  # E
    glVertex3f(x - .5, y + 1, z + .5)
    glVertex3f(x - .5, y + 1, z - .5)
    glVertex3f(x - .5, y,     z - .5)
    glVertex3f(x - .5, y,     z - .5)
    glVertex3f(x - .5, y,     z + .5)
    glVertex3f(x - .5, y + 1, z + .5)
    glColor3f(block[4][0], block[4][1], block[4][2])  # U
    glVertex3f(x + .5, y + 1, z - .5)
    glVertex3f(x - .5, y + 1, z - .5)
    glVertex3f(x - .5, y + 1, z + .5)
    glVertex3f(x - .5, y + 1, z + .5)
    glVertex3f(x + .5, y + 1, z + .5)
    glVertex3f(x + .5, y + 1, z - .5)
    glColor3f(block[5][0], block[5][1], block[5][2])  # D
    glVertex3f(x + .5, y, z - .5)
    glVertex3f(x + .5, y, z + .5)
    glVertex3f(x - .5, y, z + .5)
    glVertex3f(x - .5, y, z + .5)
    glVertex3f(x - .5, y, z - .5)
    glVertex3f(x + .5, y, z - .5)
    glEnd()
def main():
    controls = False
    pygame.init()

    display = (800,600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glClearDepth(1.0)

    glDepthMask(GL_TRUE)
    glDepthFunc(GL_LESS)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_BACK)
    glFrontFace(GL_CCW)
    glShadeModel(GL_SMOOTH)
    glDepthRange(0.0,1.0)

    gluPerspective(45, (display[0]/display[1]), 0.1, 100.0)
    glTranslatef(0.0, 0.0, -5)
    while True:
        if controls:
            pygame.mouse.set_pos([400, 300])
            pygame.mouse.set_visible(False)
        else:
            pygame.mouse.set_visible(True)

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    controls = not controls
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        glRotatef(1, 3, 1, 1,)
        glClearDepth(1.0)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        Cube(0,0,0)
        Cube(0,1,0)
        Cube(1,1,1)
        glCullFace(GL_BACK)
        pygame.display.flip()
        time.sleep(.01)    


main()
请注意,几十年来,按序列绘制和固定函数矩阵堆栈一直被弃用


无论如何,我建议使用正交投影绘制元素

创建在窗口坐标中绘制十字线的函数:

def十字准线(x、y、w): glColor3f(1.0,1.0,1.0) glBegin(GLU线) glVertex2f(x-w,y) glVertex2f(x+w,y) glVertex2f(x,y-w) glVertex2f(x,y+w) 格伦德() 将投影矩阵应用于投影矩阵堆栈,将模型矩阵应用于模型视图矩阵堆栈。见:

glMatrixMode(GL_投影)
透视图(45,(显示[0]/显示[1]),0.11100.0)
glMatrixMode(GLU模型视图)
glTranslatef(0.0,0.0,-5)
由于十字线应始终位于视图顶部,因此必须禁用

glDisable(GL\u深度\u测试)
mX,mY=pygame.mouse.get_pos()
十字线(mX,600车型年款,20)
glEnable(GL_深度_测试)
可能您可以将深度函数()更改为
GL\u ALWAYS
,并更改

用于lad和用于设置与窗口坐标成1:1的正交投影

glLoadIdentity()
格洛托(0.0,显示[0],0.0,显示[1],-1.0,1.0)
用于存储和恢复矩阵堆栈上的矩阵:

glMatrixMode(GL_投影)
透视图(45,(显示[0]/显示[1]),0.11100.0)
glMatrixMode(GLU模型视图)
glTranslatef(0.0,0.0,-5)
尽管如此:
如果控制:
pygame.mouse.set_pos([400300])
pygame.mouse.set_可见(False)
其他:
pygame.mouse.set_可见(True)
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_a:
控件=非控件
如果event.type==pygame.QUIT:
pygame.quit()
退出
glClearDepth(1.0)
glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)
glRotate(1,3,1,1,)
立方体(0,0,0)
立方体(0,1,0)
立方体(1,1,1)
glMatrixMode(GL_投影)
glPushMatrix()
glLoadIdentity()
格洛托(0.0,显示[0],0.0,显示[1],-1.0,1.0)
glMatrixMode(GLU模型视图)
glPushMatrix()
glLoadIdentity()
glDisable(GLU深度测试)
mX,mY=pygame.mouse.get_pos()
十字线(mX,600车型年款,20)
glEnable(GL_深度_测试)
glMatrixMode(GL_投影)
GLPOP矩阵()
glMatrixMode(GLU模型视图)
GLPOP矩阵()
正面(背面)
pygame.display.flip()
时间。睡眠(.01)