效果如下
与以往一行一行解释不同,那样不容易形成对代码整体架构的认识,接下来我将由简单到复杂使用三个迭代的版本,方便理解,如果你有一定基础,可直接看最后的代码
初始
绘制窗体,绘制小球,并且能点击退出
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/2/8 23:43
# @Author : 陈松
# @decription: 绘制一个小球
import pygame,sys
pygame.init()
#设置窗体大小
size=width,height=600,400
#小球初始速度
speed=[3,3]
#背景***LACK=0,0,0
#设置屏幕大小
screen=pygame.display.set_mode(size)
#设置屏幕标题
pygame.display.set_caption("pygame壁球")
#加载小球
ball=pygame.image.load("../image/littleball.png")
#获得正好框住球的矩形
ballrect=ball.get_rect()
#无限循环,不断刷新屏幕,只有点击退出在退出
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
screen.fill(BLACK)
#将图片填充到矩形上,本质上是矩形在动
screen.blit(ball,ballrect)
pygame.display.update()
#结束并退出
sys.exit()
效果
进阶
上面的框架本质上就是
导入包->设置窗体->设置小球->循环事件->结束事件
我们在任何一个流程动点手脚,都可以改进游戏
下面我们将用一系列if语句控制小球的移动
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/2/9 0:10
# @Author : 陈松
# @decription: 增加键盘操作
import pygame,sys
pygame.init()
#设置窗体大小
size=width,height=600,400
speed=[1,1]
BLACK=0,0,0
screen=pygame.display.set_mode(size)
pygame.display.set_caption("pygame壁球")
ball=pygame.image.load("../image/littleball.png")
#获得正好框住球的矩形
ballrect=ball.get_rect()
#每秒钟刷新帧的次数,1秒钟小球运动300个像素
fps=300
fclock=pygame.time.Clock()
#无限循环,不断刷新屏幕,只有点击退出才退出
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_LEFT:
speed[0]=speed[0] if speed[0]==0 else(abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
elif event.key==pygame.K_RIGHT:
speed[0]=speed[0]+1 if speed[0]>=0 else speed[0]-1
elif event.key==pygame.K_UP:
speed[1] = speed[1]+1 if speed[1]>0 else speed[1] - 1
elif event.key==pygame.K_DOWN:
speed[1]=speed[1] if speed[1]==0 else(abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
ballrect = ballrect.move(speed[0], speed[1])
#临界速度取反,让小球弹回来
if ballrect.left<0 or ballrect.right>width:
speed[0]=-speed[0]
if ballrect.top<0 or ballrect.bottom>height:
speed[1]=-speed[1]
screen.fill(BLACK)
#将图片填充到矩形上,本质上是矩形在动
screen.blit(ball,ballrect)
pygame.display.update()
#控制窗口刷新,计算每一次刷新之间应有的时间间隔
fclock.tick()
#结束并退出
sys.exit()
此时的小球已经可以按照我们的键盘来动了
高阶
其实我们的游戏很简单,一点都不高大上,但是我还是将第三版起名为此
因为在产品中,所谓高阶,就是指不仅仅依赖技术,更多的在意实用性,用户体验
这里我们增加了窗体修改大小,最小化自动暂停
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/2/9 10:43
# @Author : 陈松
# @decription:自动暂停,修改窗体大小
import pygame,sys
pygame.init()
#赋值屏幕尺寸
size=width,height=600,400
speed=[1,1]
BLACK=0,0,0
"""
这里也可以设置游戏边框情况
"""
screen=pygame.display.set_mode(size,pygame.RESIZABLE)
# screen=pygame.display.set_mode(size,pygame.FULLSCREEN)
pygame.display.set_caption("pygame壁球")
ball=pygame.image.load("../image/littleball.png")
#获得正好框住球的矩形
ballrect=ball.get_rect()
#每秒钟刷新帧的次数,1秒钟小球运动300个像素
fps=300
fclock=pygame.time.Clock()
#无限循环,不断刷新屏幕,只有点击退出在退出
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_LEFT:
speed[0]=speed[0] if speed[0]==0 else(abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
elif event.key==pygame.K_RIGHT:
speed[0]=speed[0]+1 if speed[0]>=0 else speed[0]-1 #等于0时是不是没有效果了?
elif event.key==pygame.K_UP:
speed[1] = speed[1]+1 if speed[1]>0 else speed[1] - 1
elif event.key==pygame.K_DOWN:
speed[1]=speed[1] if speed[1]==0 else(abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.key==pygame.K_ESCAPE:
sys.exit()
elif event.type==pygame.VIDEORESIZE:
size=width,height=event.size[0],event.size[1]
screen=pygame.display.set_mode(size,pygame.RESIZABLE)
#只有当屏幕可见是游戏才进行,如果最小化,则游戏自动暂停
if pygame.display.get_active():
ballrect = ballrect.move(speed[0], speed[1])
#临界速度取反
if ballrect.left<0 or ballrect.right>width:
speed[0]=-speed[0]
if ballrect.top<0 or ballrect.bottom>height:
speed[1]=-speed[1]
screen.fill(BLACK)
#将图片填充到矩形上,本质上是矩形在动
screen.blit(ball,ballrect)
pygame.display.update()
#控制窗口刷新,计算每一次刷新之间应有的时间间隔
fclock.tick()
#结束并退出
sys.exit()
以上代码都可以独立运行,这里主要是修改了while循环内部的事件机制,效果就在文章开头