一、前言

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

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

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. Longhorn 企业级云原生容器存储解决方案-部署篇

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 安装 Longhorn 可以通过多种方式安装 ...

  2. noip19

    sb\(O(n^{2})\)传参 T1 暴力一会儿就码好,结果.. 祭奠一下死去的代码 died #include<cstdio> #define MAX 1010 #define re ...

  3. Docker搭建网页数据库管理-Adminer

    为什么Adminer比phpMyAdmin更好? 官网介绍: 用Adminer替换phpMyAdmin,您将获得一个简洁的用户界面,对MySQL功能的更好支持,更高的性能和更高的安全性.请参阅详细比较 ...

  4. mongodb+docker数据卷实现数据持久化

    # 拉取镜像docker pull mongo:4.0.22# 启动容器,挂载本地目录 docker run -itd --name mongo -p 27017:27017 -v $PWD/mong ...

  5. 深入浅出Mybatis系列(九)---缓存

    MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存. 1.默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启. 2.二级缓存需要手动开启和配置,他是基于namesp ...

  6. hive -- 外部表、内部表、临时表

    1.外部表 关键字:EXTERNAL 外部表创建时需要指定LOCATION 删除外部表时,数据不被删除 CREATE EXTERNAL TABLE page_view(viewTime INT, us ...

  7. SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 通过单元测试,我们 ...

  8. 使用Hugo和GitHub搭建博客

    折腾了几天博客的框架终于搭建起来了.研究了一番之后,最终还是选择使用Hugo和GitHub来搭建博客.本文介绍了如何使用Hugo来搭建静态博客网站,并将其部署在GitHub上.使用https://&l ...

  9. Spring Data JPA:解析CriteriaQuery

    CriteriaQuery 源码定义 CriteriaQuery定义在包路径javax.persistence.criteria下,其定义如下: /** * The <code>Crite ...

  10. Blazor+Dapr+K8s微服务之事件发布订阅

    我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1         在blazo ...