一、前言

准备编写一个篮球游戏,运动员带球跑,跳起投篮。在每帧图片中包括运动员和篮球,使用多帧图片,实现运动员运球跑动的效果。

运动员运球跑动作每帧图形的宽和高可能不同,例如,跨一大步,和两腿并拢,其宽和高不可能相同。如果不考虑两个角色的碰撞,所有帧图形的宽和高取最大值,使所有帧宽和高相同,可采用将所有帧图形放到一个大图形中,实现动画。

Pygame中两个角色碰撞,实际上是图形外矩形框的碰撞,即两个矩形框重合,表示两个角色发生碰撞。为了逼真,每个矩形框要尽量靠近内部图形。因此无法保证每帧图形的宽和高都相同。在这种情况下,必须把每帧图形用列表保存。

这个小游戏运球只有4帧造型,用来完成带球跑动的动画,注意球也是造型的一部分。如下图。造型采用火柴人,这是因为火柴人造型容易找到,自己画一个也不难。4帧图形背景都设置为透明。 

二、运动员带球折返跑,遇到左右边界反向返回。

运行效果图:

仅拷贝源程序不能运行,要将上边4帧造型截图,并分割为4个png图形文件,然后使背景透明。根据图形大小,在第11条语句中,将//6修改为适当值,使图形大小合适,将文件保存到源程序所在文件夹下的子文件夹pic中。

import pygame, sys
bgcolor = pygame.Color('blue') #创建颜色
pygame.init()
size = width, height = 300,200
screen = pygame.display.set_mode(size) #创建指定大小游戏窗口
pygame.display.set_caption("投手带球往返跑") #设置窗口标题
images=[] #列表保存运球所有帧图形
for n in range(4):
p = pygame.image.load('pic/'+str(n+1)+'.png')
r=p.get_rect()
p = pygame.transform.scale(p, (r.width//6, r.height//6))#调整图像的大小
images.append(p)
fclock = pygame.time.Clock() #创建控制频率的clock
fps = 4 #定义刷新频率
x=0 #blit方法第2个参数的x坐标,y坐标不变
frameNum=0 #帧号从0-3,初始为0,完成1帧,其值加1,到4,变0
direction=0 #=0,从左到右跑,=1,从右到左跑
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT: #处理退出事件
running = False
screen.fill(bgcolor) #设置背景的颜色
p=images[frameNum] #从列表得到当前帧的图形
if direction==1: #=0,从左向右跑,=1,从右向左跑,图形反向
p=pygame.transform.flip(p,True,False) #反向
screen.blit(p, (x, 70)) #在屏幕指定位置绘制图形
frameNum+=1 #帧号从0-3,初始为0,完成1帧,其值加1,到4,变0
if frameNum==4:
frameNum=0
if direction==0: #=0,从左到右跑,x增加
x+=20
if x+80>width: #如到右边界,从右向左跑
direction=1
else:
x-=20
if x<0:
direction=0
pygame.display.flip() #刷新游戏场景
fclock.tick(fps)#本帧中程序已运行了若干秒,为保证fps,该语句保证延迟余下时间
pygame.quit()

三、增加了一个篮球场背景,并使运动员只能在球场内运

为了使程序逻辑清楚,代码易读,将运球所有代码用类封装。运行效果如下,可以看到,即使鼠标移出篮球场,运动员不会移出篮球场。

运行效果图: 

除了生成4帧造型文件保存到指定位置外,还要截图下边篮球场背景,保存为文件到源程序所在文件夹下的子文件夹pic中。篮球场背景图片尺寸为800*600。

import pygame
class Player():
def __init__(self,screen):
self.screen=screen
self.images=[]
for n in range(4): #将4帧图像保存到列表中
p = pygame.image.load('pic/'+str(n+1)+'.png') #文件名为1.png,2.png...
r=p.get_rect()
p = pygame.transform.scale(p, (r.width//6, r.height//6)) #调整图像的大小
self.images.append(p)
self.frameNum=0 #帧编号
self.x,self.y=0,0 #图像在窗体的坐标
self.mouseX,self.mouseY=0,0 #鼠标坐标
def draw(self): #在游戏窗口显示指定帧图形
p=self.images[self.frameNum] #得到指定帧图形
if self.mouseX-self.x<0:
p=pygame.transform.flip(p,True,False)
self.x,self.y=self.mouseX,self.mouseY
if self.x<1: #4个if语句保证运动员在篮球场中
self.x=1
if self.x+90>width:
self.x=width-90
if self.y<230:
self.y=230
if self.y+120>height:
self.y=height-120
self.screen.blit(p, (self.x, self.y)) #在屏幕指定位置绘制图形
self.frameNum+=1
if self.frameNum==4:
self.frameNum=0
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 800,600 # 创建指定大小游戏窗口
screen = pygame.display.set_mode(size) # 设置窗口标题
pygame.display.set_caption("投手跟随鼠标运球跑")
bg_img = pygame.image.load("pic/篮球场1.png").convert()
fclock = pygame.time.Clock() # 创建控制频率的clock
fps = 4 # 定义刷新频率
player=Player(screen)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 处理退出事件
running = False
if event.type == pygame.MOUSEMOTION:
player.mouseX,player.mouseY=event.pos
#screen.fill(bgcolor) # 设置背景的颜色
screen.blit(bg_img, (0, 0)) # 绘制背景
player.draw()
pygame.display.flip()# 刷新游戏场景
fclock.tick(fps)#本帧中程序已运行了若干秒,为保证fps,该语句保证延迟余下时间
pygame.quit()

篮球场背景如下图,其尺寸为800*600。

直接点击领取干货满满

②Python开发环境安装教程

③Python400集自学视频

④软件开发常用词汇

⑤Python学习路线图

⑥3000多本Python电子书

用Python做了个奇奇怪怪的打篮球游戏的更多相关文章

  1. 使用python做科学计算

    这里总结一个guide,主要针对刚开始做数据挖掘和数据分析的同学 说道统计分析工具你一定想到像excel,spss,sas,matlab以及R语言.R语言是这里面比较火的,它的强项是强大的绘图功能以及 ...

  2. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  3. [原创博文] 用Python做统计分析 (Scipy.stats的文档)

    [转自] 用Python做统计分析 (Scipy.stats的文档) 对scipy.stats的详细介绍: 这个文档说了以下内容,对python如何做统计分析感兴趣的人可以看看,毕竟Python的库也 ...

  4. 这几天有django和python做了一个多用户博客系统(可选择模板)

    这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...

  5. 用python做中文自然语言预处理

    这篇博客根据中文自然语言预处理的步骤分成几个板块.以做LDA实验为例,在处理数据之前,会写一个类似于实验报告的东西,用来指导做实验,OK,举例: 一,实验数据预处理(python,结巴分词)1.对于爬 ...

  6. 《用Python做HTTP接口测试》学习感悟

    机缘巧合之下,报名参加了阿奎老师发布在"好班长"的课程<用Python做HTTP接口测试>,报名费:15rmb,不到一杯咖啡钱,目前为止的状态:坚定不移的跟下去,自学+ ...

  7. 使用Python做简单的字符串匹配

    由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数据的计算,Python具有与matl ...

  8. python做量化交易干货分享

    http://www.newsmth.NET/nForum/#!article/Python/128763 最近程序化交易很热,量化也是我很感兴趣的一块. 国内量化交易的平台有几家,我个人比较喜欢用的 ...

  9. 一步一步教你如何用Python做词云

    前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 如果你的答案是正确的,那就不要拖延了,现在我们就开始,做一个词云分析图,Python是一个当下很流 ...

随机推荐

  1. 第8篇-dispatch_next()函数分派字节码

    在generate_normal_entry()函数中会调用generate_fixed_frame()函数为Java方法的执行生成对应的栈帧,接下来还会调用dispatch_next()函数执行Ja ...

  2. 【Vulhub】Rsync未授权访问漏洞复现

    Rsync未授权访问 Rsync简介 rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息 ...

  3. 浅谈 SQL 注入(注入篇)

    一.SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web ...

  4. S3C2440—6.串口的printf实现

    文章目录 一.框架 二.printf函数原理 2.1 printf的声明 2.2 参数解读 2.3 如何得到可变参数的值 2.4 解决变参的宏定义 2.5 完成printf函数的封装 三.结合UART ...

  5. MATLAB—数组运算及数组化编程

    文章目录 前言 一.数组的结构和创建 1.数组及其结构 2.行数组的创建 3.对数组构造的操作 二.数组元素编址及寻访 1.数组元素的编址 2.二维数组元素的寻访 三.数组运算 非数的问题 前言 编程 ...

  6. JVM 基础面试题总结

    hey guys, 各位小伙伴们大家好,这里是程序员cxuan,欢迎你收看我新一期的文章,这篇文章我花了几天时间给你汇总了一波 JVM 的基础知识和面试题,内容还不是很全,我还在连载中,这篇文章相当于 ...

  7. 浅谈 asp.net core web api

    希望通过本文能够了解如下内容: ControllerBase Attributes Action的返回值类型 ControllerBase 当我们开始实际上项目, 真正实操 anc 时, 肯定会用到 ...

  8. wpf 富文本编辑器richtextbox的简单用法

    最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单. richtextbox 类似于Word,是一个可编辑的控件.结构 ...

  9. Nacos集群部署:

    Nacos集群部署: 官网:    https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 1: 下载 Nacos1.2.0 链接:http ...

  10. java多线程的一些面试题

    8.callable与fature Callable与Runnable类似,但是Callable有返回值,并且有一个参数化的类型. Fature保存异步计算的结果.9.执行器 Executor.10. ...