Pygame Sprite精灵实现多个小球碰撞(50行代码)

一、Sprite的基本概念

在Pygame中,Sprite通常指的是游戏中的一个可移动对象,如玩家角色、敌人、子弹等。Sprite是一种对象,具有位置、速度、大小、颜色等属性,可以用于进行碰撞检测、物理模拟和动画处理等操作。通过使用Sprite,开发者可以轻松地跟踪和移动屏幕上的对象,并简化对象间的交互和碰撞检测。

二、小球碰撞算法思路

1、当小球到达左、右边界时,小球在x轴反向移动,y轴方向不变。

2、当小球到达上、下边界时,小球在y轴反向移动,x轴方向不变。

3、当小球发生碰撞时,小球在x轴和y轴方向上均为反向移动。

4、使用Sprite精灵的库函数pygame.sprite.spritecollide检测碰撞。

三、完整代码(50行)

import pygame,sys
from random import randint

class ball(pygame.sprite.Sprite):#继承精灵类
    def __init__(self, file_name, location,speed):
        pygame.sprite.Sprite.__init__(self)
        self.img = pygame.image.load(file_name)
        self.rect = self.img.get_rect() #left,top,right,bottom
        self.speed = speed #小球移动速度
        self.rect.left,self.rect.top = location  #小球矩形框的左顶点坐标
        
    def move(self):       
        self.rect = self.rect.move(self.speed)
        if self.rect.left<0 or self.rect.right>screen.get_width():#碰到窗口左、右边界
            self.speed = (-self.speed[0],self.speed[1]) # x反向
        if self.rect.top<0 or self.rect.bottom>screen.get_height():#碰到窗口上、下边界
            self.speed = (self.speed[0],-self.speed[1]) # y反向

def collide():  #碰撞检测
    screen.fill((145,120,60)) #窗体背景,抹掉上一次绘制的图形
    for ball in sprites:               
        ball.move()        
                
    for ball in sprites:
        sprites.remove(ball)
        if pygame.sprite.spritecollide(ball,sprites,False): #发生碰撞
            ball.speed = (-ball.speed[0],-ball.speed[1])  #碰撞后反方向移动          
        sprites.add(ball)        
        screen.blit(ball.img,ball.rect)
        pygame.time.delay(2)
        
pygame.init()
screen = pygame.display.set_mode((600,400)) #窗体
screen.fill((145,120,60)) #窗体背景

sprites = pygame.sprite.Group() ##初始化9个小球
for i in range(3):
    for k in range(3):
        position = (80+i*100,80+k*100)
        speed = (randint(-2,4),randint(-5,6))
        newball = ball("pictures/ball.png",position,speed)
        sprites.add(newball)
                
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: #窗体关闭事件
            pygame.quit()
            sys.exit()    
    collide()  #碰撞检测
    pygame.display.flip()   #更新整个待显示的Surface对象到屏幕上

四、效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值