Pygame官方示例跑不通问题解决

Pygame简介

Pygame是一个第三方的Python模块,用于游戏开发,支持跨平台(PC、平板、手机)、跨系统(Windows、Linux、Mac),底层基于DSL

Pygame入门示例

# Example file showing a basic pygame "game loop"
import pygame

# pygame setup
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True

while running:
    # poll for events
    # pygame.QUIT event means the user clicked X to close your window
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # fill the screen with a color to wipe away anything from last frame
    screen.fill("purple")

    # RENDER YOUR GAME HERE

    # flip() the display to put your work on screen
    pygame.display.flip()

    clock.tick(60)  # limits FPS to 60

pygame.quit()

这段代码使用了Pygame库来创建一个窗口,并在窗口中显示一个基本的游戏循环。代码的主要部分是一个while循环,该循环会一直运行直到running变量为False。

在循环中,首先使用pygame.event.get()来获取所有的事件,然后遍历这些事件。在这里,只关注pygame.QUIT事件,即用户点击窗口的关闭按钮。如果检测到这个事件,将running变量设置为False,从而退出循环,关闭程序。

接下来,使用screen.fill()函数将窗口填充为紫色,以清除上一帧绘制的内容。然后,在注释"RENDER YOUR GAME HERE"的位置,可以添加你自己的游戏逻辑和绘制代码。

最后,使用pygame.display.flip()函数将屏幕上的内容刷新到窗口中。还使用clock.tick(60)函数来限制帧率为60帧每秒。

最后一行代码pygame.quit()用于终止Pygame库的运行,关闭窗口。

Pygame第二个入口示例

# Example file showing a circle moving on screen
import pygame

# pygame setup
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True
dt = 0

player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)

while running:
    # poll for events
    # pygame.QUIT event means the user clicked X to close your window
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # fill the screen with a color to wipe away anything from last frame
    screen.fill("purple")

    pygame.draw.circle(screen, "red", player_pos, 40)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        player_pos.y -= 300 * dt
    if keys[pygame.K_s]:
        player_pos.y += 300 * dt
    if keys[pygame.K_a]:
        player_pos.x -= 300 * dt
    if keys[pygame.K_d]:
        player_pos.x += 300 * dt

    # flip() the display to put your work on screen
    pygame.display.flip()

    # limits FPS to 60
    # dt is delta time in seconds since last frame, used for framerate-
    # independent physics.
    dt = clock.tick(60) / 1000

pygame.quit()

这段代码使用Pygame库来创建一个窗口,并在窗口中显示一个移动的圆圈。代码的主要部分是一个while循环,该循环会一直运行直到running变量为False。

在循环中,首先使用pygame.event.get()来获取所有的事件,然后遍历这些事件。在这里,只关注pygame.QUIT事件,即用户点击窗口的关闭按钮。如果检测到这个事件,将running变量设置为False,从而退出循环,关闭程序。

接下来,使用screen.fill()函数将窗口填充为紫色,以清除上一帧绘制的内容。然后,使用pygame.draw.circle()函数在屏幕上绘制一个红色的圆圈,位置由player_pos变量控制,半径为40。

然后,使用pygame.key.get_pressed()函数获取当前按下的键,并根据按键来更新player_pos的位置。例如,如果按下了键盘上的W键,将player_pos的y坐标减去300 * dt,即在竖直方向上向上移动。

最后,使用pygame.display.flip()函数将屏幕上的内容刷新到窗口中。还使用clock.tick(60)函数来限制帧率为60帧每秒,并计算dt(delta time)值,用于处理与帧率无关的物理计算。

最后一行代码pygame.quit()用于终止Pygame库的运行,关闭窗口。

问题出现

在跑第二个示例代码时,发现执行后,按键盘上的a s d w 键没有啥反应,重新改动也没有效果,重启也没有效果,百思不得其解。

问题解决

后来发现是输入法的问题,执行代码后,默认输入法状态是中文,切换到英文,运行就正常了。真的是一个小问题,折腾半小时,最后发现真相,原来如此。

修改官方示例,使其更加优雅

# Example file showing a circle moving on screen
import pygame

# pygame setup
pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True
dt = 1

player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)

while running:
    # poll for events
    # pygame.QUIT event means the user clicked X to close your window
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # fill the screen with a color to wipe away anything from last frame
    screen.fill("purple")

    pygame.draw.circle(screen, "red", player_pos, 40)

    keys = pygame.key.get_pressed()

    if keys[pygame.K_w] and player_pos.y > 40 + 5:
        player_pos.y -= 300 * dt
    if keys[pygame.K_s] and player_pos.y < screen.get_height() - 40 - 5:
        player_pos.y += 300 * dt
    if keys[pygame.K_a] and player_pos.x > 40 + 5:
        player_pos.x -= 300 * dt
    if keys[pygame.K_d] and player_pos.x < screen.get_width() - 40 - 5:
        player_pos.x += 300 * dt
    if keys[pygame.K_q]:
        running = False

    # flip() the display to put your work on screen
    pygame.display.flip()

    # limits FPS to 60
    # dt is delta time in seconds since last frame, used for framerate-
    # independent physics.
    dt = clock.tick(60) / 1000

pygame.quit()

这段代码,可以保证圆圈始终在屏幕范围内移动,不会超出边界。而且退出程序也不需要点击右上角的“关闭”按钮,只要按下键盘上的 q 键即可退出程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值