第一步:创建游戏窗口
第二步:绘制一个弹球
第三步:让球动起来
球动起来的原理实际上就是球的位置发生了改变,位置是由球的x,y坐标决定的,所以只要不断改变球的坐标就可以实现动起来的效果了。
第四步:边界检测
怎样知道球出了边界呢?通过比较球的x,y坐标值与边界的坐标值,从而判断是否出了边界。
1.创建游戏窗口
代码:
import pygame
import sys
# 背景白色
bg = (255,255,255)
# 屏幕宽度和高度
size =width,height=400,300
def main():
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(bg)
pygame.display.flip()
main()
效果图:
解释:
创建一个main()主函数,将我们之前的初始化,创建窗口,事件检测,渲染游戏界面,更新等全部放到这个函数里面;固定不变的常量放在最前面,最后调用main()函数即可。
2.绘制一个弹球
代码:
import pygame
import sys
import random
# 背景白色
bg = (255,255,255)
# 屏幕宽度和高度
size =width,height=400,300
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
class Ball:
def __init__(self,ball_color,pos,ball_size):
self.color=ball_color
self.pos=pos
self.size=ball_size
class Game:
def __init__(self):
self.ball=Ball(ball_color,[pos_x,pos_y],ball_size)
def process_event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def display_frame(self,screen):
screen.fill(bg)
pygame.draw.circle(screen,self.ball.color,self.ball.pos,self.ball.size)
pygame.display.flip()
def main():
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")
game=Game()
while True:
game.process_event()
game.display_frame(screen)
main()
效果:
解释:
新创建一个Ball和一个Game对象,ball初始化需要传入球的颜色,大小,位置;在Game类中初始化,并且将之前的main中的事件判断和渲染更新分别移动到Game类中的process_event和display_frame方法中;在main()初始化创建一个game类,并在循环中调用game的process_event和display_frame方法。
3.让球动起来
代码:
import pygame
import sys
import random
# 背景白色
bg = (255,255,255)
# 屏幕宽度和高度
size =width,height=400,300
# 球的颜色 红色
ball_color = (255,0,0)
# 球的大小 半径
ball_size = 20
# 球的初始位置 设置在窗口中心位置
pos_x,pos_y = width//2-ball_size,height//2-ball_size
# 设置球的 初始速度
speed_x=random.randint(1,5)
speed_y=random.randint(1,5)
class Ball:
def __init__(self,ball_color,pos,ball_size,ball_speed):
self.color=ball_color
self.pos=pos
self.size=ball_size
self.speed=ball_speed
class Game:
def __init__(self):
self.ball=Ball(ball_color,[pos_x,pos_y],ball_size,[speed_x,speed_y])
def process_event(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def run_logic(self):
# 更改位置
self.ball.pos[0] += self.ball.speed[0]
self.ball.pos[1] += self.ball.speed[1]
def display_frame(self,screen):
screen.fill(bg) pygame.draw.circle(screen,self.ball.color,self.ball.pos,self.ball.size)
pygame.display.flip()
def main():
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("弹球游戏")
game=Game()
while True:
game.process_event()
game.run_logic()
game.display_frame(screen)
pygame.time.wait(100)
main()
效果:
解释:
给Ball类新添加一个属性speed,在Game类中初始化ball类对象时也需要增加一个speed参数,接着在Game类中新添加一个run_logic方法,专门用来处理游戏的逻辑,这里将球的位置参数pos增加速度,但是由于程序运行过快,在main()主函数中添加一个pygame.time.wait(100)让小球运动慢一些。
4.边界检测
代码:
def run_logic(self):
if self.ball.pos[0] <self.ball.size or self.ball.pos[0] > width-self.ball.size:
self.ball.speed[0] = -self.ball.speed[0]
if self.ball.pos[1] <self.ball.size or self.ball.pos[1] > height-self.ball.size:
self.ball.speed[1] = -self.ball.speed[1]
# 更改位置
self.ball.pos[0] += self.ball.speed[0]
self.ball.pos[1] += self.ball.speed[1]
解释:
将Game类中的run_logic处理是否碰到边界,方法没变,主要时变量名改成对应的类名了。