1.创建一个pygame窗口
设置好窗口之后渲染到频幕上
import pygame #导入pygame
import sys #用sys.exit()退出得更彻底
pygame.init() #初始化pygame
width = 600
height = 500
size = width, height #设置尺寸
screen = pygame.display.set_mode((size)) #设置窗口大小
pygame.display.set_caption('Hello World') #设置标题
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
screen.fill('white') #将窗口设为白色
pygame.display.flip() #刷新窗口
运行以上代码,我们就能得到一个白色的pygame窗口
如下:
2.添加角色
1.画出角色
使用Class添加一个Player类,再把玩家渲染到画布上
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Hello World')
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
player = Player() #实例化玩家类
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
pygame.display.flip() #刷新窗口
效果如下:
这时候,就可以看到我们创建的Player在默认出生点(0, 0)
如果想修改玩家的出生点,可以这样做
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect(x=100, y=100) #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
这样玩家就会在(100, 100)的位置出生了
2.让角色动起来
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Hello World')
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
player = Player() #实例化玩家类
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
player.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
pygame.display.flip() #刷新窗口
像这样, 增加一个move函数,但是角色似乎移动的太快了,降低self.speed也无法解决,要么太快,要么太慢,这时候就是帧率的问题了,使用pygame.clock()来调节帧数,修改后的代码如下:
import pygame
import sys
pygame.init()
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Hello World')
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
clock = pygame.time.Clock()
player = Player() #实例化玩家类
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
player.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
现在再运行程序,就可以发现移速变正常了
限制移动范围
现在虽然速度正常了,但是角色容易跑到框框外面去,这时候就需要我们限制移动范围了
大概的逻辑就是,当玩家的坐标大于或小于边界坐标时,则向反方向以相同的速度移动
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed