Pygame最小开发框架以及壁球小游戏(帧率、操控)

Pygame

理解Pygame

  • • Python最经典的2D游戏开发第三方库,也支持3D游戏开发
  • • Pygame适合用于游戏逻辑验证、游戏入门及系统演示验证
  • • Pygame是一种游戏开发引擎,基本逻辑具有参考价值
  • • Pygame有些”过时”,但永远”不过时”
  • • 使用Pygame可以开发出优秀的游戏!

Pygame最小开发框架

Pygame的Hello World程序

1
2
3
4
5
6
7
8
9
10
11
12
# Unit PYGO2: Pygame Hello World Game
import pygame, sys

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame游戏之旅")

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

1

1

1

1

1

1

1

1

1

1

1

壁球游戏与图像的基本使用

从需求到实现的三个关键要素:

  • • (1) 壁球:游戏需要一个壁球,通过图片引入
  • • (2) 壁球运动:壁球要能够上下左右运动
  • • (3) 壁球反弹:壁球要能够在上下左右边缘反弹

(1) 壁球

下载壁球图片

(2) 壁球运动

使图片每次向右及向下移动1个像素

与默认窗口处理方法一致,Pygame采用上图所示坐标体系:

窗口左上角坐标(0,0),横轴正向向右,纵轴正向向下

(3) 壁球反弹

图片每次碰撞到边缘,速度取反

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Unit PYG02: Pygame Wall Ball Game version 1  展示型
import pygame,sys

pygame.init()
size = width, height = 600, 400
speed = [1,1]
BLACK = 0, 0, 0

screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")

ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
ballrect = ballrect.move(speed[0], speed[1])
if ballrect.left < 0 or ballrect.right > width:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]

screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()

1

1

1

1

1

1

1

壁球小游戏与频率的帧率设置

壁球小游戏(节奏型)的关键要素

  • 需求:

壁球可以按照一定速度运动

从需求到实现的关键要素:

  • • 壁球速度:如何控制壁球的运动速度呢?

1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Unit PYG02: Pygame Wall Ball Game version 2  节奏型
import pygame,sys

pygame.init()
size = width, height = 600, 400
speed = [1,1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
ballrect = ballrect.move(speed[0], speed[1])
if ballrect.left < 0 or ballrect.right > width:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]

screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)

1

1

壁球小游戏与键盘的基本使用

1

壁球小游戏(操控型)的关键要素

从需求到实现的关键要素:

  • • 键盘使用:如何获取键盘的操作事件
  • • 速度调节:根据对应按键调节壁球运动速度

1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Unit PYG02: Pygame Wall Ball Game version 3  操控型
import pygame,sys

pygame.init()
size = width, height = 600, 400
speed = [1,1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)*int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)*int(speed[1]/abs(speed[1]))
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = - speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = - speed[1]

screen.fill(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)

1

Donate? comment?