动画精灵与碰撞检测
Posted wangchenghua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动画精灵与碰撞检测相关的知识,希望对你有一定的参考价值。
1 动画精灵 :作为一个单位来移动和显示的一组像素,这是一种图形对象。
1.1 动画精灵想成一个小图片——一种可以在屏幕上移动的图形对象,并且可以与其他对象进行交互。
1.2 动画精灵一般具有两个基本属性:图像(为动画精灵显示的图片)矩形区(包含动画精灵的矩形区域)
2、Sprite类
# author : wang cheng hua # sprite #使用动画精灵移动球的程序 import pygame ,sys from random import * class MYBallClass(pygame.sprite.Sprite): def __init__(self,image_file,location,speed): pygame.sprite.Sprite.__init__(self) # 初始化动画精灵 self.image = pygame.image.load(image_file) # 向其中加载图像文件 self.rect = self.image.get_rect() # 得到定义图像边界的矩形 self.rect.left,self.rect.top = location # 设置球的初始位置 self.speed = speed def move(self): self.rect = self.rect.move(self.speed) # 动画精灵(实际上是其中的rect)有一个内置的move 函数。这个方法需要一个speed参数告诉它对象要移走多远(移动多块) if self.rect.left <0 or self.rect.right > width: self.speed[0] = -self.speed[0] if self.rect.top < 0 or self.rect.bottom > height: self.speed[1] = -self.speed[1] size = width,height = 640,480 # 设置窗口大小,并且定义2个变量 screen = pygame.display.set_mode(size) screen.fill([255,255,255]) # 背景填充颜色 image_file = "beach_ball.png" # 赋予image_file 实参的内容 balls =[] # 创建一个放置球的列表 speed = [2,2] # 创建一个speed列表 for row in range(0,3): # 进行3层的第一个次外循环 for column in range(0,3): # 进行内循环的3次运行 location = [row*180 +10,column*180+10] # 每次运行球的初始位置进行变动 speed = [choice([-2,2]),choice([-2,2])] # random 里的choice 函数 随机选取speed ball = MYBallClass(image_file,location,speed) # 创建一个ball的实例 balls.append(ball) # 将球增加至列表中 for ball in balls: # 将每个球从表中提取出来进行复制 screen.blit(ball.image,ball.rect) pygame.display.flip() # 将复制完后的信息展示在窗口当中
3、碰撞检测
# 碰撞检测 import pygame ,sys from random import * class MYBallClass(pygame.sprite.Sprite): def __init__(self,image_file,location,speed): pygame.sprite.Sprite.__init__(self) # 初始化动画精灵 self.image = pygame.image.load(image_file) # 向其中加载图像文件 self.rect = self.image.get_rect() # 得到定义图像边界的矩形 self.rect.left,self.rect.top = location # 设置球的初始位置 self.speed = speed def move(self): self.rect = self.rect.move(self.speed) # 动画精灵(实际上是其中的rect)有一个内置的move 函数。这个方法需要一个speed参数告诉它对象要移走多远(移动多块) if self.rect.left <0 or self.rect.right > width: self.speed[0] = -self.speed[0] if self.rect.top < 0 or self.rect.bottom > height: self.speed[1] = -self.speed[1] def animate(group): screen.fill([255,255,255]) for ball in group: ball.move() # 先移动所有球 for ball in group: group.remove(ball) # 从组删除精灵 if pygame.sprite.spritecollide(ball,group,False): # 检查精灵与组之间的碰撞 ball.speed[0] = -ball.speed[0] ball.speed[1] = -ball.speed[1] group.add(ball) # 将球在加回原来的组中 screen.blit(ball.image,ball.rect) pygame.display.flip() pygame.time.delay(20) size = width,height = 640,480 # 主程序的开始: 设置窗口大小,并且定义2个变量 screen = pygame.display.set_mode(size) screen.fill([255,255,255]) # 背景填充颜色 image_file = "b_ball_rect.png" # 赋予image_file 实参的内容 group = pygame.sprite.Group() # 创建精灵组 for row in range(0,2): # 进行2层的第一个次外循环 for column in range(0,2): # 进行内循环的2次运行 location = [row*180 +10,column*180+10] # 每次运行球的初始位置进行变动;将球进行3排 排序,且间隔为90) speed = [choice([-2,2]),choice([-2,2])] # random 里的choice 函数 随机选取speed ball = MYBallClass(image_file,location,speed) # 创建一个ball的实例 group.add(ball) # 将球增加至列表中 for ball in balls: # 将每个球从表中提取出来进行复制 screen.blit(ball.image,ball.rect) pygame.display.flip() # 将复制完后的信息展示在窗口当中 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running=False animate(group) pygame.quit()
4、沙滩球程序中使用Clock 和 get_fps()
# 沙滩球程序中使用clock()和get_fps() import pygame,sys from random import * class MyBallClass(pygame.sprite.Sprite): def __init__(self,image_file,location,speed): pygame.sprite.Sprite__init__(self) self.image_file = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left,self.rect.top = location self.speed = speed def move(self): self.rect = self.rect.move(self.speed) if self.rect.left<0 or self.rect.right>width: self.speed[0]=-self.speed[0] if self.rect.top <0 or self.rect.bottom>height: self.speed[1]=-self.speed[1] def animate(group): screen.fill([255,255,255]) for ball in group: ball.move() # 先移动所有球 for ball in group: group.remove(ball) # 从组删除精灵 if pygame.sprite.spritecollide(ball,group,False): # 检查精灵与组之间的碰撞 ball.speed[0] = -ball.speed[0] ball.speed[1] = -ball.speed[1] group.add(ball) # 将球在加回原来的组中 screen.blit(ball.image,ball.rect) pygame.display.flip() # 已经删除time.delay() size = width,height=640,480 screen = pygame.display.set_mode(size) screen.fill([255,255,255]) image_file = "b_ball_rect.png" clock = pygame.time.Clock() # 创建clock实例 group = pygame.sprite.Group() for row in range (2): for column in range (2): location = [column*180+10,row*180+10] speed=[choice([-5,5]),choice([-5,5])] ball = MYBallClass(image_file,location,speed) group.add(ball) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False frame_rate = clock.get_fps() print("frame_rate = ",frame_rate) animate(group) clock.tick(30) pygame.quit()
以上是关于动画精灵与碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章