动画精灵与碰撞检测

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()                                   # 将复制完后的信息展示在窗口当中
View Code

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()
Clock 和 get_fps()

 

以上是关于动画精灵与碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

如何检测精灵套件中的碰撞?

子精灵的精灵套件碰撞检测

如何检测pygame中的碰撞?

pygame之精灵碰撞检测

cocos2dx 3.x(精灵的碰撞检测,点击移动与拖动精灵)

Python进阶篇十一Pygame的精灵和碰撞检测