Pygame浅析动画精灵和碰撞检测实现方法

 更新时间:2023年01月17日 09:09:30   作者:永远的麦田  
这篇文章主要介绍了利用pygame完成动画精灵和碰撞检测,代码详细,内容丰富,对于想要学习pygame的朋友来讲是一个不错的练习,需要的朋友可以参考下

1、复习上节课做的一个简单的动画:

import sys
import pygame
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
ball = pygame.image.load("beach_ball.png")
x = 0
y = 100
speed = 50
yspeed = 50
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit(0)
    pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90])
    x += speed
    y += yspeed
    if x + 90 > 640:
        speed = -speed
    if x < 0:
        speed = -speed
    if y + 90 > 480:
        yspeed = -yspeed
    if y < 0:
        yspeed = -yspeed
    screen.blit(ball, [x, y])
    pygame.display.flip()
    pygame.time.delay(100)

这个程序可以在整个窗口中进行小球动画的演示

2、将之整理成用类来抽象出球及相应运动

现在我们将这里面的小球提取出来,将之包装成一个类,将小球的移动用一个函数move来表达,

那么这个小球首先会有变量image,就是从物理图片中加载入内存的变量,然后应该有一个大小size,还有一个位置point,这两个可以合并为rect(x, y, width, height),还有一个表示左右移动的速度和上下移动的速度speed[x,y]

代码如下:

import pygame
class MyBall:
    def __init__(self, image_file, point, speed):
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = point
        self.speed = speed

移动的逻辑是:每次移动speed的距离(speed指的是向横移动x,向纵移动y)并更新rect,若到最左边或是最右边,则speed的x方向取反,若到最上边或最下边,speed的y方向取反

代码如下:

size = width, height = 640, 480
    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]

这样,我们就完成了球的定义和移动的逻辑

下面我们再来进行小球动画跑起来:

1)恢复背景

2)移动球并更新位置

3)在新位置上画出球

4)将球打印到屏幕上

5)延时恰当的时间

代码如下:

def run(ball):
    screen.fill([255, 255, 255])
    ball.move()
    screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)

然后我们将这个类运行起来

size = width, height = 640, 480
screen = pygame.display.set_mode(size)
image_file = "beach_ball.png"
ball = MyBall(image_file, width/2, height/2, [2, 2])
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
    run(ball)

3、利用前面抽象出来对象同时动画9个小球:

需改动的代码:

def run(balls):
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)
balls = []
for row in range(3):
    for column in range(3):
        ball = MyBall(image_file, [180*row+10, 180*column+10], [2, 2])
        balls.append(ball)

4利用动画精灵类进行碰撞检测:

动画精灵的基本属性:

1)图像

2)矩形区

让球类继承于动画精灵类,就可以使用spritecollide进行碰撞检测

class MyBall(pygame.sprite.Sprite):
    def __init__(self, image_file, point, speed):
        pygame.sprite.Sprite.__init__(self)
def run(balls):
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
        screen.blit(ball.image, ball.rect)
    for ball in balls:
        balls.remove(ball)
        if pygame.sprite.spritecollide(ball, balls, False):
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        balls.append(ball)
    pygame.display.flip()
    pygame.time.delay(20)

说明:由于这儿的碰撞检测是检的矩形,所以看到有些没有实际碰到也发生了检测

最后附上课堂上改进后的全部代码:

import pygame, sys
class MyBall(pygame.sprite.Sprite):
    def __init__(self, point, speed):
        pygame.sprite.Sprite.__init__(self) #####
        self.image = pygame.image.load("beach_ball.png")
        self.rect = self.image.get_rect()
        self.rect.left = point[0]
        self.rect.top = point[1]
        self.speed = speed
    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.right > width or self.rect.left < 0:
            self.speed[0] = -self.speed[0]
        if self.rect.bottom > height or self.rect.top < 0:
            self.speed[1] = -self.speed[1]
        screen.blit(self.image, self.rect)  # 显示
    def peng(self, balls):
        balls.remove(self)
        if pygame.sprite.spritecollide(self, balls, False):
            self.speed[0] = -self.speed[0]
            self.speed[1] = -self.speed[1]
        balls.append(self)
pygame.init()
size = width,height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
balls = []
for row in range(3):
    for col in range(3):
        speed = [2, 2]
        point = [row * 180 + 10, col * 180 + 10]
        ball = MyBall(point, speed)
        balls.append(ball)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
    for ball in balls:
        ball.peng(balls)
    pygame.display.flip()
    pygame.time.delay(50)

到此这篇关于Pygame浅析动画精灵和碰撞检测实现方法的文章就介绍到这了,更多相关Pygame动画精灵和碰撞检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 将Python代码嵌入C++程序进行编写的实例

    将Python代码嵌入C++程序进行编写的实例

    这篇文章主要介绍了将Python代码嵌入C++程序进行编写的实例,尽管通常还是Python代码中调用C++程序的情况较多...需要的朋友可以参考下
    2015-07-07
  • Python制作爬虫采集小说

    Python制作爬虫采集小说

    本文给大家分享的是使用Python制作爬虫采集小说的代码,非常的简单实用,虽然还是有点瑕疵,大家一起改改,共同进步
    2015-10-10
  • Python中cv2.Canny() 函数使用方法

    Python中cv2.Canny() 函数使用方法

    cv2.Canny() 函数是 OpenCV 中的边缘检测函数之一,用于检测图像的边缘,它的基本原理是通过计算图像中每个像素点的梯度值来检测边缘,本文通过示例代码介绍Python中cv2.Canny() 函数用法,需要的朋友参考下吧
    2023-07-07
  • Python中高级语法糖的使用示例详解

    Python中高级语法糖的使用示例详解

    Python 是一门简洁而强大的编程语言,具备许多高级语法糖(syntactic sugar)功能,本文将介绍一些常见的Python高级语法糖,以及如何使用它们来提高代码质量和开发效率,需要的小伙伴可以参考下
    2024-01-01
  • virtualenv 指定 python 解释器的版本方法

    virtualenv 指定 python 解释器的版本方法

    今天小编就为大家分享一篇virtualenv 指定 python 解释器的版本方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python神经网络使用tensorflow构建长短时记忆LSTM

    python神经网络使用tensorflow构建长短时记忆LSTM

    这篇文章主要为大家介绍了python机器学习tensorflow构建长短时记忆网络LSTM,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python实现微信机器人: 登录微信、消息接收、自动回复功能

    python实现微信机器人: 登录微信、消息接收、自动回复功能

    这篇文章主要介绍了python实现微信机器人: 登录微信、消息接收、自动回复功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    今天小编就为大家分享一篇python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python使用pptx实现复制页面到其他PPT中

    Python使用pptx实现复制页面到其他PPT中

    这篇文章主要为大家详细介绍了python如何使用pptx库实现从一个ppt复制页面到另一个ppt里面,文中的示例代码讲解详细,感兴趣的可以尝试一下
    2023-02-02
  • Django的性能优化实现解析

    Django的性能优化实现解析

    这篇文章主要介绍了Django的性能优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论