Python_plusSharp
Python_plusSharp

Reputation: 62

Pygame and PyOpenGL: No shapes appear on screen

I have created a complete snake game using C++ and OpenGL before, and I want to do the same using Python, pygame, and PyOpenGL. The current problem I have is that after I spawn a fruit, it does not appear on the screen. Here's the code for my main function:

def main():     # Main function
    # Initialize game components
    game = Game(800, 600)
    test_fruit = game.spawn_fruit(Point(100, 100))

    # Initialize pygame module
    pygame.init()
    pygame.display.set_mode(game.get_window_size(), DOUBLEBUF | OPENGL)
    pygame.display.set_caption("Python Game")

    # Define variable to control main loop
    running = True

    # Main loop
    while running:
        # event handling, gets all event from the event queue
        for event in pygame.event.get():
            # only do something if the event is of type QUIT
            if event.type == pygame.QUIT:
                # change the value to False, to exit the main loop
                running = False

        # Modify game properties
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        game.draw_shapes()
        pygame.display.flip()
        pygame.time.wait(5)

It's possible I'm missing a pygame or pyopengl function, but I'm not sure. I've also tried changing pygame.display.flip() to pygame.display.update(), yet it gives me an error ("cannot update an OpenGL display") instead.

Here's the code for the shape I am attempting to display:

class Circle:
    def __init__(self, pivot: Point, radius: int, sides: int, fill: bool, color: Color):
        self.pivot = pivot
        self.radius = radius
        self.sides = sides
        self.fill = fill
        self.color = color

    # Draw the shape of the circle
    def draw(self):
        glColor3f(self.color.r, self.color.g, self.color.b)
        if self.fill:
            glBegin(GL_POLYGON)
        else:
            glBegin(GL_LINE_LOOP)
        for i in range(100):
            cosine = self.radius * cos(i*2*pi/self.sides) + self.pivot.x
            sine = self.radius * sin(i*2*pi/self.sides) + self.pivot.y
            glVertex2f(cosine, sine)
        glEnd()

Upvotes: 1

Views: 649

Answers (1)

Rabbid76
Rabbid76

Reputation: 210909

OpenGL coordinates are in range [-1.0, 1.0] (Normalized Device Space). The Normalized device space is a unique cube from the left, bottom, near (-1, -1, -1) to the right, top, far (1, 1, 1).
If you want to use "window" coordinates, you must specify an Orthographic projection using glOrtho:

glOrtho(0, 800, 600, 0, -1, 1)

Choose the matrix mode with glMatrixMode and load the Identity matrix with glLoadIdentity.

Example:

def main():     # Main function
    # Initialize game components
    game = Game(800, 600)
    test_fruit = game.spawn_fruit(Point(100, 100))

    # Initialize pygame module
    pygame.init()
    pygame.display.set_mode(game.get_window_size(), DOUBLEBUF | OPENGL)
    pygame.display.set_caption("Python Game")

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0, 800, 600, 0, -1, 1)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity() 

    # Define variable to control main loop
    running = True

    # [...]

Upvotes: 1

Related Questions