|
|

楼主 |
发表于 2019-2-12 16:42:20
|
显示全部楼层
- import pygame
- import sys
- import math
- from pygame.locals import *
- from random import *
- class Ball(pygame.sprite.Sprite):
- def __init__(self, image, position, speed, bg_size):
- # Call the parent class (Sprite) constructor
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.image.load(image).convert_alpha()
- self.rect = self.image.get_rect()
- # 小球的位置
- self.rect.left, self.rect.top = position
- self.speed = speed
- self.width, self.height = bg_size[0], bg_size[1]
- '''
- Pygame.Rect.move():
- moves the rectangle
- move(x, y) -> Rect
- Returns a new rectangle that is moved by the given offset. The
- x and y arguments can be any integer value, positive or
- negative.
- 可以在Rect对象的move方法中添加可正可负的两元素
- 如果要实现小球的移动,则要在类中添加一个move()方法,并且在绘图的时候调用小球
- 对象的move()方法
- '''
- def move(self):
- self.rect = self.rect.move(self.speed)
- # 类似实现贪吃蛇穿入墙壁从对面墙壁出来(左右方向)
- if self.rect.right < 0:
- self.rect.left = self.width
- elif self.rect.left > self.width:
- self.rect.right = 0
- # (上下方向) 从下往上 和 从上往下
- elif self.rect.bottom < 0:
- self.rect.top = self.height
- elif self.rect.top > self.height:
- self.rect.bottom = 0
- def collide_check(item, target):
- col_balls = []
- for each in target:
- # 判断正方形center之间的距离和小球直径的关系
- distance = math.sqrt( \
- math.pow((item.rect.center[0] - each.rect.center[0]), 2) + \
- math.pow((item.rect.center[1] - each.rect.center[1]), 2))
- if distance <= (item.rect.width + each.rect.width) / 2:
- col_balls.append(each)
- return col_balls
- def main():
- pygame.init()
- ball_image = "gray_ball.png"
- bg_image = "background_85.png"
- running = True
- bg_size = width, height = 1280, 768
- screen = pygame.display.set_mode(bg_size)
- pygame.display.set_caption("Play the Ball")
- # .png格式可以加入apha通道
- background = pygame.image.load(bg_image).convert_alpha()
- screen.fill((255, 255, 255))
- # 用来存放小球对象的列表
- balls = []
- # 创建5个小球
- BALL_NUM = 5
- for i in range(BALL_NUM):
- # 球的尺寸是100*100 随机产生小球的位置和速度
- position = randint(0, width - 100), randint(0, height - 100)
- # 两个元素的一个列表,表示x轴和y轴方向的速度
- speed = [randint(-10, 10), randint(-10, 10)]
- # 实例化小球对象 分别传入Surface对象 位置二元组 速度两元素列表
- ball = Ball(ball_image, position, speed, bg_size)
- '''
- 在这里碰撞检测的原因是,如果没有这里的检测
- 那么刚开始有可能随机生成的小球有部分重叠,而小球反向之后速度太小
- 无法离开与自己重叠的小球,就会又反向朝对方移动,这样会有抖动。
- 所以只需要在生成小球后检查是否有重叠的小球,有就重新分配位置,
- 让其不重叠
- '''
- while collide_check(ball, balls):
- ball.rect.left, ball.rect.top = randint(0, width - 100), \
- randint(0, height - 100)
- balls.append(ball) # 将小球加入到小球列表中
- # CLock()对象用来设置小球的帧率
- clock = pygame.time.Clock()
- while running:
- for event in pygame.event.get():
- if event.type == QUIT:
- sys.exit()
- screen.blit(background, (0, 0))
- for each in balls:
- each.move()
- screen.blit(each.image, each.rect)
- # i从0开始到4
- for i in range(BALL_NUM):
- item = balls.pop(i)
- if collide_check(item, balls):
- item.speed[0] = -item.speed[0]
- item.speed[1] = -item.speed[1]
- balls.insert(i, item) # 放入到原来的位置
- pygame.display.flip() # 将显示缓冲区中的数据刷入显示器中
- clock.tick(30)
- if __name__ == "__main__":
- main()
复制代码
这个代码和甲鱼老师的代码是一样的,添加了球的碰撞效果,视频里正常,但是我这里跑起来还是有拖尾 |
|