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动画精灵和碰撞检测内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用pygame完成动画精灵和碰撞检测

    动画精灵和碰撞检测 一.动画精灵 动画精灵:四处移动的单个图像或图像部分称为动画精灵(sprite),pygame有一个特殊的模块帮助跟踪屏幕上移动的大量图像.利用这个模块,可以更容易地移动图形对象. 具备特征: 图像(image):为动画精灵显示的图片. 矩形区(rect):包含动画精灵的矩形区域. ①.一堆沙滩球都反弹 Pygame 的 sprite 模块提供了一个动画精灵基类Sprite,基于pygame.sprite.Sprite 来创建自己的子类. 这里用了常规的python列表 im

  • 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.ev

  • Pygame如何使用精灵和碰撞检测

    在开始学习相关知识点之前,我们有必要先学习精灵和碰撞检测的含义. 精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具.人物.场景装饰等,它们都可以看做成一张张小的"精灵"图.除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),如下图所示: 图1:动作逐帧分解图 如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了动画精灵,您将会看到雄鹰展翅高飞.人在策马奔腾.运动员奋力跳远. 精灵有个特点就是允许精灵

  • python飞机大战pygame碰撞检测实现方法分析

    本文实例讲述了python飞机大战pygame碰撞检测实现方法.分享给大家供大家参考,具体如下: 目标 了解碰撞检测方法 碰撞实现 01. 了解碰撞检测方法 pygame 提供了 两个非常方便 的方法可以实现碰撞检测: pygame.sprite.groupcollide() 两个精灵组 中 所有的精灵 的碰撞检测 groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict 如果将 dokill 设

  • Python Pygame中精灵和碰撞检测详解

    Pygame精灵和碰撞检测 今天来看看python最出名的游戏库pygame.学习两个名词:精灵和碰撞检测. 精灵英文字母是Sprite.Sprite是二维的图形,在游戏中可以用做各种物品,例如人物,道具,反正所有一切展现在游戏图像中的都可以用Sprite. 而碰撞检测就是检测两个Sprite之间是否有碰撞.例如游戏中的吃金币,吃豆豆,打敌人都可以用到碰撞检测. class Sprite(pygame.sprite.Sprite): def __init__(self, pos): pygame

  • 一文详解pygame.sprite的精灵碰撞

    目录 前言 pygame.sprite.Sprite - 可见游戏对象的简单基类. pygame.sprite.Group - 用于保存和管理多个 Sprite 对象的容器类. pygame.sprite.spritecollide() - 在与另一个精灵相交的组中查找精灵 总结 前言 pygame中的精灵碰撞是可见游戏中用的最基础的东西,这里结合官方文档和小甲鱼的网站上的内容做个小总结,方便日后使用. pygame.sprite.Sprite - 可见游戏对象的简单基类. Sprite(*gr

  • JS实现碰撞检测的方法分析

    本文实例讲述了JS实现碰撞检测的方法.分享给大家供大家参考,具体如下: 一个简单的碰撞检测例子,检测div1是否和div2发生碰撞,当div1碰到div2时,改变div2的颜色,看测试图 看一下分析图: 当div1在div2的上边线(t2)以上的区域活动时,始终碰不上 当div1在div2的右边线(r2)以右的区域活动时,始终碰不上 当div1在div2的下边线(b2)以下的区域活动时,始终碰不上 当div1在div2的左边线(r2)以左的区域活动时,始终碰不上 除了以上四种情况,其他情况表示d

  • 基于jQuery实现图片推拉门动画效果的两种方法

    ''推拉门''动效也可以称作"手风琴"效果,大多数效果实现的思路基本是一样的,下面介绍两种方法,一种是通过改变图片的偏移位置实现移动,另一种是通过遍历背景图片后改变图片的宽度实现变换. 实现方法一:改变图片宽度 html+css代码 <body> <div class="box"> <ul> <!-- <li>![](images/slidepic2.jpg)</li> --> <li&g

  • 打字效果动画的4种实现方法(超简单)

    方法一(纯css实现): html代码: <h1 class="typing typing-item">打字动画打字动画打字动画</h1> css样式: .typing{ font-size: 1rem; padding-top: 6%; margin-bottom: 5%; font-weight: normal; letter-spacing: .3rem; -webkit-animation: type 2s steps(50, end) forwards

  • python使用PyGame播放Midi和Mp3文件的方法

    本文实例讲述了python使用PyGame播放Midi和Mp3文件的方法.分享给大家供大家参考.具体实现方法如下: ''' pg_midi_sound101.py play midi music files (also mp3 files) using pygame tested with Python273/331 and pygame192 by vegaseat ''' import pygame as pg def play_music(music_file): ''' stream m

随机推荐