• Python100天打卡-Day10


    实现动画效果
    要实现动画效果,本身的原理也非常简单,就是将不连续的图片连续的播放,只要每秒钟达到了一定的帧数,那么就可以做出比较流畅的动画效果。
    import pygame


    def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    # 定义变量来表示小球在屏幕上的位置
    x, y = 50, 50
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
    # 从消息队列中获取事件并对事件进行处理
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    running = False
    screen.fill((255, 255, 255))
    pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)
    pygame.display.flip()
    # 每隔50毫秒就改变小球的位置再刷新窗口
    pygame.time.delay(50)
    x, y = x + 5, y + 5


    if __name__ == '__main__':
    main()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    碰撞检测
    pygame的sprite(动画精灵)模块就提供了对碰撞检测的支持,这里我们暂时不介绍sprite模块提供的功能,因为要检测两个小球有没有碰撞其实非常简单,只需要检查球心的距离有没有小于两个球的半径之和。
    from enum import Enum, unique
    from math import sqrt
    from random import randint

    import pygame


    @unique
    class Color(Enum):
    """颜色"""

    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    GRAY = (242, 242, 242)

    @staticmethod
    def random_color():
    """获得随机颜色"""
    r = randint(0, 255)
    g = randint(0, 255)
    b = randint(0, 255)
    return (r, g, b)


    class Ball(object):
    """球"""

    def __init__(self, x, y, radius, sx, sy, color=Color.RED):
    """初始化方法"""
    self.x = x
    self.y = y
    self.radius = radius
    self.sx = sx
    self.sy = sy
    self.color = color
    self.alive = True

    def move(self, screen):
    """移动"""
    self.x += self.sx
    self.y += self.sy
    if self.x - self.radius <= 0 or
    self.x + self.radius >= screen.get_width():
    self.sx = -self.sx
    if self.y - self.radius <= 0 or
    self.y + self.radius >= screen.get_height():
    self.sy = -self.sy

    def eat(self, other):
    """吃其他球"""
    if self.alive and other.alive and self != other:
    dx, dy = self.x - other.x, self.y - other.y
    distance = sqrt(dx ** 2 + dy ** 2)
    if distance < self.radius + other.radius
    and self.radius > other.radius:
    other.alive = False
    self.radius = self.radius + int(other.radius * 0.146)

    def draw(self, screen):
    """在窗口上绘制球"""
    pygame.draw.circle(screen, self.color,
    (self.x, self.y), self.radius, 0)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    事件处理
    可以在事件循环中对鼠标事件进行处理,通过事件对象的type属性可以判定事件类型,再通过pos属性就可以获得鼠标点击的位置。在点击鼠标的位置创建颜色、大小和移动速度都随机的小球.
    def main():
    # 定义用来装所有球的容器
    balls = []
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
    # 从消息队列中获取事件并对事件进行处理
    for event in pygame.event.get(http://www.my516.com):
    if event.type == pygame.QUIT:
    running = False
    # 处理鼠标事件的代码
    if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
    # 获得点击鼠标的位置
    x, y = event.pos
    radius = randint(10, 100)
    sx, sy = randint(-10, 10), randint(-10, 10)
    color = Color.random_color()
    # 在点击鼠标的位置创建一个球(大小、速度和颜色随机)
    ball = Ball(x, y, radius, sx, sy, color)
    # 将球添加到列表容器中
    balls.append(ball)
    screen.fill((255, 255, 255))
    # 取出容器中的球 如果没被吃掉就绘制 被吃掉了就移除
    for ball in balls:
    if ball.alive:
    ball.draw(screen)
    else:
    balls.remove(ball)
    pygame.display.flip()
    # 每隔50毫秒就改变球的位置再刷新窗口
    pygame.time.delay(50)
    for ball in balls:
    ball.move(screen)
    # 检查球有没有吃到其他的球
    for other in balls:
    ball.eat(other)


    if __name__ == '__main__':
    main()
    --------------------- 

  • 相关阅读:
    爱奇艺RN低代码引擎:千变万化、快速搭建的万花筒
    前端性能优化实战 https://mp.weixin.qq.com/s/amaR6GJFqhW3B9TspBLWJA
    递归 回文链表
    字节跳动自研高性能微服务框架 Kitex 的演进之旅 https://mp.weixin.qq.com/s/DhraH24FuojgW26M8KdODQ
    Cigarette smokers problem
    万字长文 | 十个模型,总结产品经理沟通方法论 https://mp.weixin.qq.com/s/cfAVn1dIk8eg1ushxd0sA
    贪心 Partition Labels
    rune
    层层剖析一次 HTTP POST 请求事故
    runtime: shrink map as elements are deleted 缩容 垃圾回收 GC 内存
  • 原文地址:https://www.cnblogs.com/ly570/p/11154067.html
Copyright © 2020-2023  润新知