前言:

昨天我开始学习 pygame,从绘制图形、展示图片,到用按键控制角色移动,最后在老师的指导下完成了简易球碰撞游戏。第一次让画面动起来、让小球自己反弹,真的特别有成就感。

一、pygame 的图形绘制

昨天学习了四种常用图形的绘制:矩形用 pygame.draw.rect(),圆形用 pygame.draw.circle(),椭圆形用 pygame.draw.ellipse(),多边形用 pygame.draw.polygon()。老师还演示了图片的展示,用 pygame.image.load() 加载图片,再用 screen.blit() 放到窗口上。

演示代码(游戏里的挡板和小球):

pygame.draw.rect(screen, white, pad_rect)          # 白色挡板
pygame.draw.circle(screen, red, (ball_x, ball_y), ball_r)  # 红色小球

运行结果:黑色窗口中显示一个白色矩形挡板和一个红色圆形小球。

二、键盘控制:让挡板跟着按键移动

我学会了用 pygame.key.get_pressed() 读取按键状态,并用 K_LEFTK_RIGHT 控制左右方向,也练习了上下左右按键的用法。

演示代码:

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and pad_x > 0:
    pad_x -= 5
if keys[pygame.K_RIGHT] and pad_x + pad_w < W:
    pad_x += 5

运行结果:按住键盘左右方向键,挡板会左右移动。

这里有一个关键点:移动时还要判断边界,否则挡板会直接跑出窗口外面。

三、球碰撞:整个游戏的核心

小球每帧都按照 dxdy 改变坐标,碰到左右墙壁或顶部就反转方向;碰到挡板或砖块就反弹;掉出窗口底部则回到初始位置重新开始。

判断碰撞用的是 pygame.Rectcolliderect(),比手写坐标比较方便很多。

演示代码:

ball_rect = pygame.Rect(ball_x - ball_r, ball_y - ball_r, ball_r * 2, ball_r * 2)
pad_rect = pygame.Rect(pad_x, pad_y, pad_w, pad_h)

if ball_rect.colliderect(pad_rect):
    dy *= -1

if ball_rect.colliderect(brick_rect):
    dy *= -1
    is_brick_exist = False

运行结果:小球碰到挡板会向上反弹,碰到蓝色砖块后砖块消失,掉出底部后小球从初始位置重新开始。

四、让游戏“活”起来的主循环

游戏能一直运行,靠的是 while running 主循环:clock.tick(60) 控制帧率,每帧都重新填充背景、更新位置、绘制图形,最后用 pygame.display.flip() 刷新画面。

我今天踩过最深的坑就是忘记写 pygame.display.flip(),结果画面一直不刷新。老师提醒后我才明白:绘制和刷新是两回事。

运行结果:一个完整的简易打砖块小游戏,挡板接球、砖块被打掉、球掉落后重新开始。

结尾留言:

昨天的学习让我发现,pygame 比想象中好玩,也比想象中容易“踩坑”。接下来我想给游戏加上更多砖块、计分功能,还有游戏结束的画面,把它做成一个真正能玩的小游戏。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐