上一篇:pygame教程实例(三)游戏事件
下一篇:pygame教程实例(五)物理引擎pymunk
本教程使用python3
在pygame教程实例(一)小球弹跳中我们写了一个小球在重力的作用下反复弹跳。现在我们来重写它,使我们可以控制小球运动。
我们写两个版本,一个是控制小球左右运动。一个是取消重力,控制小球上下左右移动
import pygame
from pygame.locals import *
WINDOW_W, WINDOW_H = 640, 480
pygame.init()
screen = pygame.display.set_mode((WINDOW_W, WINDOW_H), pygame.DOUBLEBUF, 32)
pygame.display.set_caption("小球弹跳")
FPS = 60
g = 9.8 * 100
is_run = True # 是否运行
clock = pygame.time.Clock()
x, y = WINDOW_W / 2, 10
vx, vy = 0, 0
def my_event():
global vx,vy,is_run
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if is_run:
vy += g * 1/FPS
if __name__ == '__main__':
while True:
# 侦听事件
my_event()
# 是否暂停
if not is_run:
continue
# 计算小球
x += vx * 1 / FPS
y += vy * 1 / FPS
if y >= WINDOW_H - 10:
vy = -vy
if x >= WINDOW_W:
x-=WINDOW_W
if x < 0:
x+=WINDOW_W
# 将背景图画上去
screen.fill((0, 0, 0))
pygame.draw.circle(screen, (255, 0, 0), (int(x), int(y)), 10)
# 刷新画面
pygame.display.update()
time_passed = clock.tick(FPS)
在第28行,我们调用my_event()来侦听事件,现在我们开始写my_event()函数
按下左键(或A键),小球速度向左增加(矢量计算)。右边也一样。
def my_event():
global vx,vy,is_run
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 接收到退出时间后退出程序
exit()
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
exit()
if event.key in [K_LEFT, K_a] and vx > -200 and is_run:
vx -= 5
if event.key in [K_RIGHT, K_d] and vx < 200 and is_run:
vx += 5
elif event.type == MOUSEBUTTONDOWN:
print('点击的位置是:',event.pos)
is_run = not is_run
if is_run:
vy += g * 1/FPS
这样就可以通过左右键或AD键控制左右运动,每按一次左键,向左速度加5。每按一次右键,向右速度加5。点击屏幕则暂停。
这次我们取消重力,控制小球上下左右移动,并且长按某方向键时一直向该方向移动,松开时则停止。
def my_event():
global vx,vy,is_run
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
exit()
if event.key in [K_LEFT, K_a] and is_run:
vx = -90
if event.key in [K_RIGHT, K_d] and is_run:
vx = 90
if event.key in [K_UP, K_w] and is_run:
vy = -90
if event.key in [K_DOWN, K_s] and is_run:
vy = 90
elif event.type == KEYUP:
if event.key in [K_LEFT, K_a, K_RIGHT, K_d] and is_run:
vx = 0
if event.key in [K_UP, K_w, K_DOWN, K_s] and is_run:
vy = 0
elif event.type == MOUSEBUTTONDOWN:
print('点击的位置是:',event.pos)
is_run = not is_run
上一篇:pygame教程实例(三)游戏事件
下一篇:pygame教程实例(五)物理引擎pymunk