一、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对象到屏幕上