pygame教程实例(四)小球弹跳(事件)

上一篇: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

你可能感兴趣的:(pygame,python,python3,pygame,事件,游戏)