pygame学习手册(三):精灵与碰撞检测
第一部分写的对打乒乓是用像素进行碰撞判定的,这样会导致有许多的问题,这次我们改用精灵(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学习手册(三):精灵与碰撞检测相关推荐
- SpringMVC学习手册(三)------EL和JSTL(上)
1.含义 EL: Expression Language , 表达式语言 JSTL: Java Server Pages Standard Tag Library, JSP标准标签库 ...
- JavaScript学习手册三
文章目录 前言 一.JS对象 1. 定义 2. 创建对象 3. 属性的增删改查 二.字符串 1. 查找字符串位置 2. 求指定位置的字符 3. 字符串的截取 4. 大小写转换 5. 字符串的分割 对象 ...
- [导入][转]sap学习手册三
.1. IMG Implementation Guide(IMG)是SAP系统的配置工具,它可按你公司的要求配置SAP系统以适合你公司的要求.有三种类型的IMG,分别是: SAP Reference ...
- Pygame精灵和碰撞检测
在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义. 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具.人物.场景装饰等,它们都 ...
- pygame学习笔记(5)——精灵
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽.魂斗罗,却对精灵一点也不知.pygame ...
- python学习手册中文版免费下载-Python学习手册 第三版
<Python学习手册(第3版)>讲述了:Python可移植.功能强大.易于使用,是编写独立应用程序和脚本应用程序的理想选择.无论你是刚接触编程或者刚接触Python,通过学习<Py ...
- python三大圣经-读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」...
0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.我是谁 我是一个使用python超10 ...
- pygame 学习笔记(8)精灵动画的实现:子弹的爆炸效果
本文内容 subsurface() 子 surface的学习 实现一个精灵动画 Note:本文代码基于上一小节,可以直接在上文文末下载工程文件. 在上一节中,我们只是让坦克移动起来,但不是真正的动画, ...
- 【Pygame 学习笔记】8.精灵
术语"精灵"是旧计算机和游戏机的保留.这些较旧的盒子无法以足够快的速度绘制和擦除普通图形,使其无法用作游戏.这些机器有特殊的硬件来处理需要快速动画的游戏对象.这些对象被称为&quo ...
最新文章
- 化身“监工”的AI,我们该如何相处?
- 自己动手丰衣足食之 jQuery 数量加减插件
- 1.2.2 Logistic回归和梯度下降计算的数学流程
- 高并发之API接口,分布式,防刷限流,如何做?
- 【.Net】C# 将Access中时间段条件查询的数据添加到ListView中
- ES6语法---箭头函数/关于this指向
- t-sql 调用作业
- 在SQL Server 2000中使用Transact-SQL建立数据库
- 机房收费系统合作版(五)——初识托付
- Helm 3 完整教程(十七):Helm 流控制结构(1)if / else 语句
- MAC下安装NDKR10e
- 利用utl_smtp从oracle数据库发送带blob附件的电子邮件
- 最详细的制作正式版10.11 OS X El Capitan 安装U盘的方法
- 【现已失效】【转载】QQ空间一键点赞方法
- 最近流行的暴寒经典语句
- go发送smtp邮件时的踩坑记录——auth login、x509: cannot validate certificate for错误
- 挖矿木马应急响应指南
- Excel TEXT函数怎么把数值转换成文本
- 同样协调个事情,为什么有人一说就通,有人一说就炸?(转,知乎)
- 十二个“一”与耍猴(互动媒体技术作业)