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
键即可退出程序。