详解Pygame PyOpenGL

  • Post category:Python

Pygame和PyOpenGL都是Python的库,用于在Python中创建游戏和图形应用程序。下面分别介绍它们的作用和使用方法。

Pygame

作用

Pygame是一个跨平台的Python模块,用于编写游戏和多媒体应用程序。它提供了一个简单易用的接口,能够访问计算机硬件(如声音和图形),从而使得开发者可以专注于游戏的逻辑和设计,而不用自己手动操作硬件设备。

使用方法

安装

Pygame可以在Python 2和Python 3中使用。使用pip安装Pygame最新版本的命令如下:

pip install pygame

示例1 – 创建游戏窗口和游戏循环

import pygame

# 初始化Pygame
pygame.init()

# 创建游戏窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("My Game")

# 游戏循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 渲染屏幕
    screen.fill((0, 0, 255))
    pygame.display.flip()

# 退出Pygame
pygame.quit()

示例2 – 播放音频

import pygame
import time

# 初始化Pygame
pygame.init()

# 加载音频文件
pygame.mixer.music.load("music.mp3")

# 播放音频
pygame.mixer.music.play()

# 等待5秒钟
time.sleep(5)

# 停止播放音频
pygame.mixer.music.stop()

# 退出Pygame
pygame.quit()

PyOpenGL

作用

PyOpenGL是Python的一个OpenGL绑定库,用于在Python中创建3D图形应用程序和游戏。它提供了OpenGL标准的Python实现,并且可以在多种不同的操作系统平台中运行。

使用方法

安装

使用pip安装PyOpenGL的命令如下:

pip install PyOpenGL

示例1 – 绘制3D立方体

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def draw_cube():
    # 绘制立方体的8个点
    vertices = [
        [1, 1, -1],
        [1, -1, -1],
        [-1, -1, -1],
        [-1, 1, -1],
        [1, 1, 1],
        [1, -1, 1],
        [-1, -1, 1],
        [-1, 1, 1]
    ]
    # 绘制立方体的6个面,使用GL_QUADS表达
    faces = [
        [0, 1, 2, 3],
        [3, 2, 6, 7],
        [7, 6, 5, 4],
        [4, 5, 1, 0],
        [0, 3, 7, 4],
        [1, 5, 6, 2]
    ]
    # 设置颜色
    colors = [
        [1, 0, 0],
        [0, 1, 0],
        [0, 0, 1],
        [1, 1, 0],
        [1, 0, 1],
        [0, 1, 1]
    ]
    # 绘制立方体
    glBegin(GL_QUADS)
    for i in range(len(faces)):
        glColor3fv(colors[i])
        for j in range(len(faces[i])):
            glVertex3fv(vertices[faces[i][j]])
    glEnd()

def display():
    # 清空屏幕的颜色缓冲区和深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    # 设置观察点和视角
    glLoadIdentity()
    glTranslatef(0, 0, -5)
    gluPerspective(45, 1, 0.1, 50)
    # 绘制立方体
    draw_cube()
    glutSwapBuffers()

def main():
    # 初始化Glut窗口
    glutInit()
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(500, 500)
    glutCreateWindow("OpenGL Window")
    # 初始化OpenGL
    glClearColor(0, 0, 0, 0)
    glEnable(GL_DEPTH_TEST)
    # 注册回调函数
    glutDisplayFunc(display)
    glutMainLoop()

if __name__ == '__main__':
    main()

示例2 – 加载纹理

from PIL import Image
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def load_texture(filename):
    img = Image.open(filename)
    texture_data = img.tobytes("raw", "RGBX", 0, -1)
    width, height = img.size
    texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    return texture

def draw_cube_with_texture(texture):
    # 绘制立方体的8个点
    vertices = [
        [1, 1, -1],
        [1, -1, -1],
        [-1, -1, -1],
        [-1, 1, -1],
        [1, 1, 1],
        [1, -1, 1],
        [-1, -1, 1],
        [-1, 1, 1]
    ]
    # 绘制立方体的6个面,使用GL_QUADS表达
    faces = [
        [0, 1, 2, 3],
        [3, 2, 6, 7],
        [7, 6, 5, 4],
        [4, 5, 1, 0],
        [0, 3, 7, 4],
        [1, 5, 6, 2]
    ]
    # 绘制立方体
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D, texture)
    glBegin(GL_QUADS)
    for i in range(len(faces)):
        for j in range(len(faces[i])):
            glTexCoord2f(0, 0)
            glVertex3fv(vertices[faces[i][j]])
    glEnd()
    glDisable(GL_TEXTURE_2D)

def display():
    # 清空屏幕的颜色缓冲区和深度缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    # 设置观察点和视角
    glLoadIdentity()
    glTranslatef(0, 0, -5)
    gluPerspective(45, 1, 0.1, 50)
    # 绘制带纹理的立方体
    texture = load_texture("texture.jpg")
    draw_cube_with_texture(texture)
    glutSwapBuffers()

def main():
    # 初始化Glut窗口
    glutInit()
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(500, 500)
    glutCreateWindow("OpenGL Window")
    # 初始化OpenGL
    glClearColor(0, 0, 0, 0)
    glEnable(GL_DEPTH_TEST)
    # 注册回调函数
    glutDisplayFunc(display)
    glutMainLoop()

if __name__ == '__main__':
    main()