问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Pygame入门教程:从基础语法到游戏开发

创作时间:
作者:
@小白创作中心

Pygame入门教程:从基础语法到游戏开发

引用
CSDN
1.
https://m.blog.csdn.net/2401_88885149/article/details/145435568

Pygame是一个开源的Python模块,用于开发游戏和多媒体应用程序。它提供了图形、声音、事件处理等基本功能,使得开发者能够轻松创建2D游戏。本文将详细介绍Pygame的基础使用方法,包括窗口创建、图形绘制、动画制作、声音处理以及按钮交互等核心功能。

基础语法和实现逻辑

与命令行界面(CLI)不同,Pygame提供了图形用户界面(GUI),可以创建带有图像和颜色的窗口。要使用Pygame的众多功能,首先需要调用pygame.init()进行初始化。

然后,创建一个Surface对象来表示窗口:

DISPLAYSURF = pygame.display.set_mode((400, 300))

使用pygame.display.set_caption()设置窗口标题:

pygame.display.set_caption('Hello World!')

游戏循环是Pygame程序的核心,它不断执行以下三个步骤:

  1. 处理事件
  2. 更新游戏状态
  3. 在屏幕上绘制游戏状态

最常见的游戏循环结构如下:

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

坐标系和图形建立

在游戏开发中,坐标系是基础。Pygame使用笛卡尔坐标系,其中Y轴从窗口顶部的0开始向下增加。颜色使用RGB表示,透明度通过RGBA表示。

创建一个Surface对象并设置其透明度:

anotherSurface = DISPLAYSURF.convert_alpha()

使用pygame.Rect表示矩形区域,它提供了丰富的属性来描述矩形的位置和尺寸:

基本位置和尺寸属性:

  • x:矩形左上角的 x 坐标。
  • y:矩形左上角的 y 坐标。
  • width:矩形的宽度。
  • height:矩形的高度。
  • size:矩形的尺寸,返回一个元组 (width, height)。

边界属性:

  • left:矩形左边缘的 x 坐标。
  • right:矩形右边缘的 x 坐标。
  • top:矩形上边缘的 y 坐标。
  • bottom:矩形下边缘的 y 坐标。

中心和角点属性:

  • center:矩形的中心点坐标,返回一个元组 (centerx, centery)。
  • centerx:矩形水平中心的 x 坐标。
  • centery:矩形垂直中心的 y 坐标。
  • topleft:矩形左上角的坐标。
  • bottomleft:矩形左下角的坐标。
  • topright:矩形右上角的坐标。
  • bottomright:矩形右下角的坐标。
  • midtop:矩形上边中点的坐标。
  • midleft:矩形左边中点的坐标。
  • midbottom:矩形下边中点的坐标。
  • midright:矩形右边中点的坐标。

简化属性:

  • w:与 width 相同,表示矩形的宽度。
  • h:与 height 相同,表示矩形的高度。

这些属性不仅可以用于获取矩形的相关信息,还可以通过赋值来修改矩形的位置或尺寸。

基本绘制函数

Pygame提供了丰富的绘制函数,可以绘制各种形状。以下是一些常用的绘制函数:

填充整个Surface对象:

DISPLAYSURF.fill(WHITE)

绘制多边形:

pygame.draw.polygon(DISPLAYSURF, GREEN, ((146, 0), (291, 106), (236, 277), (56, 277), (0, 106)))

绘制直线:

pygame.draw.line(DISPLAYSURF, BLUE, (60, 60), (120, 60), 4)

绘制圆形:

pygame.draw.circle(DISPLAYSURF, BLUE, (300, 50), 20, 0)

绘制椭圆:

pygame.draw.ellipse(DISPLAYSURF, RED, (300, 250, 40, 80), 1)

绘制矩形:

pygame.draw.rect(DISPLAYSURF, RED, (200, 150, 100, 50))

使用PixelArray可以单个或批量设置像素的颜色:

pixObj = pygame.PixelArray(DISPLAYSURF)
pixObj[480][380] = BLACK
del pixObj

动画和帧率控制

动画效果是通过快速连续显示多个图像实现的。使用pygame.time.Clock对象可以控制帧率:

FPS = 30
fpsClock = pygame.time.Clock()

在游戏循环中使用fpsClock.tick(FPS)来控制帧率。

图像加载和位图复制

要加载图像,可以使用pygame.image.load()函数:

catImg = pygame.image.load('cat.png')

使用blit()函数将一个Surface的内容复制到另一个Surface上:

DISPLAYSURF.blit(catImg, (catx, caty))

文本绘制

绘制文本需要以下步骤:

  1. 创建一个pygame.font.Font对象
  2. 创建一个Surface对象,通过调用Font对象的render()方法,将文本绘制其上
  3. 通过调用Surface对象的get_rect()方法,从Surface对象创建一个Rect对象
  4. 通过修改Rect对象的属性之一,来设置其位置。
  5. 将带有文本的Surface对象复制到pygame.display.set_mode()所返回的Surface对象上
  6. 调用pygame.display.update(),使显示Surface出现在屏幕上

示例代码:

fontObj = pygame.font.Font('freesansbold.ttf', 32)
textSurfaceObj = fontObj.render('Hello world!', True, GREEN, BLUE)
textRectObj = textSurfaceObj.get_rect()
textRectObj.center = (200, 150)
DISPLAYSURF.blit(textSurfaceObj, textRectObj)

声音处理

播放声音可以使用pygame.mixer.Sound()构造函数:

soundObj = pygame.mixer.Sound('sound.wav')
soundObj.play()

加载背景音乐:

pygame.mixer.music.load('background_music.mp3')
pygame.mixer.music.play(-1, 0.0)

按钮交互

Pygame本身没有内置的按钮类,但可以通过自定义实现按钮交互。以下是一个简单的按钮实现示例:

定义按钮类:

class Button:
    def __init__(self, rect, color, text, font):
        self.rect = rect
        self.color = color
        self.text = text
        self.font = font

    def draw(self, surface):
        pygame.draw.rect(surface, self.color, self.rect)
        text_surface = self.font.render(self.text, True, (0, 0, 0))
        text_rect = text_surface.get_rect(center=self.rect.center)
        surface.blit(text_surface, text_rect)

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN and self.rect.collidepoint(event.pos):
            print("Button clicked!")

使用按钮:

button = Button(pygame.Rect(150, 125, 100, 50), (255, 0, 0), "Click Me", pygame.font.Font(None, 36))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        button.handle_event(event)

    screen.fill((255, 255, 255))
    button.draw(screen)
    pygame.display.flip()

通过以上内容,读者可以掌握Pygame的基本使用方法,为开发更复杂的游戏打下坚实的基础。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号