第一部分写的对打乒乓是用像素进行碰撞判定的,这样会导致有许多的问题,这次我们改用精灵(Sprite)来修改pygame学习手册(一) 中的内容。

继承pygame.sprite.Sprite

首先要创建一个自己的精灵类,把修改精灵坐标的方法封装一下,方便外界调用。

class MySprite(pygame.sprite.Sprite):def __init__(self, image):pygame.sprite.Sprite.__init__(self) #图片可以使用pygame.image.load("filename").convert_alpha()self.image = image#rect 最好使用 Rect(x,y,width,height)来创建self.rect = image.get_rect()#X 属性def _getx(self): return self.rect.xdef _setx(self,value): self.rect.x = valueX = property(_getx,_setx)#Y 属性def _gety(self): return self.rect.ydef _sety(self,value): self.rect.y = valueY = property(_gety,_sety)#position 属性def _getpos(self): return self.rect.topleftdef _setpos(self,pos): self.rect.topleft = posposition = property(_getpos,_setpos)    

碰撞检测有

两个精灵之间的矩形检测

pygame.sprite.collide_rect(first, second) #返回布尔值

精灵与组之间的矩形检测

#第一个参数是精灵,
#第二个参数是精灵组,
#第三个参数为True,则碰撞检测后,组中所有碰撞的精灵被删除
#返回 组中被碰撞的精灵
collide_list = pygame.sprite.spritecollide(sprite,group,False)

两个组之间的矩形检测

#前两个参数都是组
#后两个参数,代表发生碰撞时,是否删除精灵
#该函数返回一个字典
#第一个组中的每一个精灵都会添加到字典中
#第二组中与之碰撞的精灵会添加到字典相应的条目中
hit_list = pygame.sprite.groupcollide(group1,group2,True,False)

人机乒乓

#作者:znw
#日期:2018年8月17日import sys, time, random, math, pygame
from pygame.locals import *class MySprite(pygame.sprite.Sprite):def __init__(self, image):pygame.sprite.Sprite.__init__(self) #extend the base Sprite classself.image = imageself.rect = image.get_rect()#X 属性def _getx(self): return self.rect.xdef _setx(self,value): self.rect.x = valueX = property(_getx,_setx)#Y 属性def _gety(self): return self.rect.ydef _sety(self,value): self.rect.y = valueY = property(_gety,_sety)#position 属性def _getpos(self): return self.rect.topleftdef _setpos(self,pos): self.rect.topleft = posposition = property(_getpos,_setpos)    #打印文字
def print_text(font, x, y, text, color=(255,255,255)):imgText = font.render(text, True, color)screen.blit(imgText, (x,y))pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("人机乒乓"")#设置游戏帧数
framerate = pygame.time.Clock()
font = pygame.font.Font(None, 18)#创建两个精灵组
group_player = pygame.sprite.Group()
group_ball = pygame.sprite.Group()#创建玩家精灵
#player.png是一个10X50像素的白色方块
playerimg = pygame.image.load("player.png").convert_alpha()
player1 = MySprite(playerimg)
#设置玩家一初始位置
player1.position = (100,100)
group_player.add(player1)player2 = MySprite(playerimg)
player2.position = (500,300)
group_player.add(player2)#ball.png是一个10x10的白色方块
ballimg = pygame.image.load("ball.png").convert_alpha()
ball = MySprite(ballimg)
ball.position = 400,300
group_ball.add(ball)#球的速度
ball_vel_x = 2
ball_vel_y = 1
#玩家的速度
player_vel_x = 3
player_vel_y = 2#看看是不是找到了对的终点,AI用
right_target = False
#Ai计算小球到达墙壁需要多少时间
move_time = 0
while True:framerate.tick(60)for event in pygame.event.get():if event.type == QUIT:sys.exit()elif event.type == MOUSEMOTION:player1.position = event.posscreen.fill((0,0,0))#默认电脑在右边if ball_vel_x > 0 and not right_target:move_time = (790-ball.X)//ball_vel_x#从小球运动的路线上随机选取一个时间target_time = random.randint(1,move_time)#计算落点end_pos_x = ball.X + ball_vel_x * target_timeend_pos_y = ball.Y + ball_vel_y * target_timeif end_pos_y > 600:end_pos_y = 1200 - end_pos_yelif end_pos_y < 0:end_pos_y = -end_pos_y    right_target = True#让电脑玩家前往它选定的落点if ball_vel_x < 0 \or player2.Y < end_pos_y < player2.Y \and player2.X < end_pos_x < player2.X:passelse:if player2.Y < 0 :player2.position = (player2.X,0)elif player2.Y > 550:player2.position = (player2.X,550)if player2.X < 400:player2.position = (400,player2.Y)elif player2.X > 790:player2.position = (790,player2.Y)else:if player2.Y - end_pos_y > 0:player2.Y -= player_vel_yelse:player2.Y += player_vel_yif player2.X - end_pos_x > 0:player2.X -= player_vel_xelse:player2.X += player_vel_x#保证小球落在屏幕内if ball.X > 790 or ball.X < 0 :ball_vel_x = -ball_vel_xif ball.Y > 590 or ball.Y < 0 :ball_vel_y = -ball_vel_y#检测小球是否和玩家碰撞,碰撞则反向if pygame.sprite.spritecollide(ball, group_player, False):right_target = Falseball_vel_x = -ball_vel_x#移动小球ball.X += ball_vel_xball.Y += ball_vel_y#打印电脑玩家选择的落点print_text(font,5,5,str(end_pos_x)+","+str(end_pos_y))#画group_player.draw(screen)group_ball.draw(screen)pygame.display.update()       

当时这个游戏仍然有很多问题,就希望读者自己去完善了。

pygame学习手册(三):精灵与碰撞检测相关推荐

  1. SpringMVC学习手册(三)------EL和JSTL(上)

    1.含义 EL:       Expression Language , 表达式语言 JSTL:   Java Server Pages Standard Tag Library, JSP标准标签库  ...

  2. JavaScript学习手册三

    文章目录 前言 一.JS对象 1. 定义 2. 创建对象 3. 属性的增删改查 二.字符串 1. 查找字符串位置 2. 求指定位置的字符 3. 字符串的截取 4. 大小写转换 5. 字符串的分割 对象 ...

  3. [导入][转]sap学习手册三

    .1. IMG Implementation Guide(IMG)是SAP系统的配置工具,它可按你公司的要求配置SAP系统以适合你公司的要求.有三种类型的IMG,分别是: SAP Reference ...

  4. Pygame精灵和碰撞检测

    在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义. 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具.人物.场景装饰等,它们都 ...

  5. pygame学习笔记(5)——精灵

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽.魂斗罗,却对精灵一点也不知.pygame ...

  6. python学习手册中文版免费下载-Python学习手册 第三版

    <Python学习手册(第3版)>讲述了:Python可移植.功能强大.易于使用,是编写独立应用程序和脚本应用程序的理想选择.无论你是刚接触编程或者刚接触Python,通过学习<Py ...

  7. python三大圣经-读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」...

    0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.我是谁 我是一个使用python超10 ...

  8. pygame 学习笔记(8)精灵动画的实现:子弹的爆炸效果

    本文内容 subsurface() 子 surface的学习 实现一个精灵动画 Note:本文代码基于上一小节,可以直接在上文文末下载工程文件. 在上一节中,我们只是让坦克移动起来,但不是真正的动画, ...

  9. 【Pygame 学习笔记】8.精灵

    术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...

最新文章

  1. 化身“监工”的AI,我们该如何相处?
  2. 自己动手丰衣足食之 jQuery 数量加减插件
  3. 1.2.2 Logistic回归和梯度下降计算的数学流程
  4. 高并发之API接口,分布式,防刷限流,如何做?
  5. 【.Net】C# 将Access中时间段条件查询的数据添加到ListView中
  6. ES6语法---箭头函数/关于this指向
  7. t-sql 调用作业
  8. 在SQL Server 2000中使用Transact-SQL建立数据库
  9. 机房收费系统合作版(五)——初识托付
  10. Helm 3 完整教程(十七):Helm 流控制结构(1)if / else 语句
  11. MAC下安装NDKR10e
  12. 利用utl_smtp从oracle数据库发送带blob附件的电子邮件
  13. 最详细的制作正式版10.11 OS X El Capitan 安装U盘的方法
  14. 【现已失效】【转载】QQ空间一键点赞方法
  15. 最近流行的暴寒经典语句
  16. go发送smtp邮件时的踩坑记录——auth login、x509: cannot validate certificate for错误
  17. 挖矿木马应急响应指南
  18. Excel TEXT函数怎么把数值转换成文本
  19. 同样协调个事情,为什么有人一说就通,有人一说就炸?(转,知乎)
  20. 十二个“一”与耍猴(互动媒体技术作业)

热门文章

  1. Rockchip开发系列 - 4.2.Uart问题汇总
  2. 2020【计算机/软件考研】哪些学校值得选择?
  3. 动态内存申请(Linux)
  4. HTTP的WEB服务器做了些什么?
  5. 《Unity Magica Cloth从入门到详解》之(5)MeshSpring
  6. 学习韩顺平-Linux:
  7. Java项目:springboot基于bs的企业考勤管理系统
  8. Josephus环问题
  9. 【ANSYS命令流】加载与求解技术(六):载荷步的设置选项命令
  10. Monterey安装教程