zoukankan      html  css  js  c++  java
  • 动画精灵与碰撞检测

    1 动画精灵 :作为一个单位来移动和显示的一组像素,这是一种图形对象。

       1.1  动画精灵想成一个小图片——一种可以在屏幕上移动的图形对象,并且可以与其他对象进行交互。

       1.2  动画精灵一般具有两个基本属性:图像(为动画精灵显示的图片)矩形区(包含动画精灵的矩形区域)

    2、Sprite类 

    # author : wang cheng hua
    # sprite
    #使用动画精灵移动球的程序
    import  pygame ,sys
    from random import *
    
    class MYBallClass(pygame.sprite.Sprite):
        def __init__(self,image_file,location,speed):
            pygame.sprite.Sprite.__init__(self)             # 初始化动画精灵
            self.image = pygame.image.load(image_file)      #  向其中加载图像文件
            self.rect = self.image.get_rect()               # 得到定义图像边界的矩形
            self.rect.left,self.rect.top = location         # 设置球的初始位置
            self.speed = speed
    
        def move(self):
            self.rect = self.rect.move(self.speed)          # 动画精灵(实际上是其中的rect)有一个内置的move 函数。这个方法需要一个speed参数告诉它对象要移走多远(移动多块)
            if self.rect.left <0 or self.rect.right > 
                self.speed[0] = -self.speed[0]
            if self.rect.top < 0 or self.rect.bottom > height:
                self.speed[1] = -self.speed[1]
    
    
    size = width,height = 640,480                           # 设置窗口大小,并且定义2个变量
    screen = pygame.display.set_mode(size)
    screen.fill([255,255,255])                              # 背景填充颜色
    image_file = "beach_ball.png"                           # 赋予image_file 实参的内容
    balls =[]                                               #  创建一个放置球的列表
    speed = [2,2]                                           # 创建一个speed列表
    for row in range(0,3):                                  # 进行3层的第一个次外循环
        for column in range(0,3):                           # 进行内循环的3次运行
            location = [row*180 +10,column*180+10]          # 每次运行球的初始位置进行变动
            speed = [choice([-2,2]),choice([-2,2])]                 # random 里的choice 函数 随机选取speed
            ball = MYBallClass(image_file,location,speed)         # 创建一个ball的实例
            balls.append(ball)                              # 将球增加至列表中
    for ball in balls:                                      # 将每个球从表中提取出来进行复制
        screen.blit(ball.image,ball.rect)
    pygame.display.flip()                                   # 将复制完后的信息展示在窗口当中
    View Code

    3、碰撞检测

    # 碰撞检测
    
    import  pygame ,sys
    from random import *
    
    class MYBallClass(pygame.sprite.Sprite):
        def __init__(self,image_file,location,speed):
            pygame.sprite.Sprite.__init__(self)             # 初始化动画精灵
            self.image = pygame.image.load(image_file)      #  向其中加载图像文件
            self.rect = self.image.get_rect()               # 得到定义图像边界的矩形
            self.rect.left,self.rect.top = location         # 设置球的初始位置
            self.speed = speed
    
        def move(self):
            self.rect = self.rect.move(self.speed)          # 动画精灵(实际上是其中的rect)有一个内置的move 函数。这个方法需要一个speed参数告诉它对象要移走多远(移动多块)
            if self.rect.left <0 or self.rect.right > 
                self.speed[0] = -self.speed[0]
            if self.rect.top < 0 or self.rect.bottom > height:
                self.speed[1] = -self.speed[1]
    def animate(group):
        screen.fill([255,255,255])
        for ball in group:
            ball.move()             # 先移动所有球
        for ball in group:
            group.remove(ball)      # 从组删除精灵
            if pygame.sprite.spritecollide(ball,group,False):    # 检查精灵与组之间的碰撞
                ball.speed[0] = -ball.speed[0]
                ball.speed[1] = -ball.speed[1]
            group.add(ball)        # 将球在加回原来的组中
            screen.blit(ball.image,ball.rect)
        pygame.display.flip()
        pygame.time.delay(20)
    
    size = width,height = 640,480                           # 主程序的开始: 设置窗口大小,并且定义2个变量
    screen = pygame.display.set_mode(size)
    screen.fill([255,255,255])                              # 背景填充颜色
    image_file = "b_ball_rect.png"                           # 赋予image_file 实参的内容
    group = pygame.sprite.Group()                          # 创建精灵组
    
    for row in range(0,2):                                  # 进行2层的第一个次外循环
        for column in range(0,2):                           # 进行内循环的2次运行
            location = [row*180 +10,column*180+10]          # 每次运行球的初始位置进行变动;将球进行3排 排序,且间隔为90)
            speed = [choice([-2,2]),choice([-2,2])]                 # random 里的choice 函数 随机选取speed
            ball = MYBallClass(image_file,location,speed)         # 创建一个ball的实例
            group.add(ball)                             # 将球增加至列表中
    for ball in balls:                                      # 将每个球从表中提取出来进行复制
        screen.blit(ball.image,ball.rect)
    pygame.display.flip()                                   # 将复制完后的信息展示在窗口当中
    
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running=False
    
        animate(group)
    pygame.quit()
    碰撞检测

    4、沙滩球程序中使用Clock 和 get_fps()

    # 沙滩球程序中使用clock()和get_fps()
    
    import pygame,sys
    from random import  *
    
    class MyBallClass(pygame.sprite.Sprite):
        def __init__(self,image_file,location,speed):
            pygame.sprite.Sprite__init__(self)
            self.image_file = pygame.image.load(image_file)
            self.rect = self.image.get_rect()
            self.rect.left,self.rect.top = location
            self.speed = speed
        def move(self):
            self.rect = self.rect.move(self.speed)
            if self.rect.left<0 or self.rect.right>
                self.speed[0]=-self.speed[0]
            if self.rect.top <0 or self.rect.bottom>height:
                self.speed[1]=-self.speed[1]
    def animate(group):
        screen.fill([255,255,255])
        for ball in group:
            ball.move()             # 先移动所有球
        for ball in group:
            group.remove(ball)      # 从组删除精灵
            if pygame.sprite.spritecollide(ball,group,False):    # 检查精灵与组之间的碰撞
                ball.speed[0] = -ball.speed[0]
                ball.speed[1] = -ball.speed[1]
            group.add(ball)        # 将球在加回原来的组中
            screen.blit(ball.image,ball.rect)
        pygame.display.flip()                # 已经删除time.delay()
    
    size = width,height=640,480
    screen = pygame.display.set_mode(size)
    screen.fill([255,255,255])
    image_file =  "b_ball_rect.png"
    clock = pygame.time.Clock()            # 创建clock实例
    group = pygame.sprite.Group()
    for row in range (2):
        for column in range (2):
            location = [column*180+10,row*180+10]
            speed=[choice([-5,5]),choice([-5,5])]
            ball = MYBallClass(image_file,location,speed)
            group.add(ball)
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                frame_rate = clock.get_fps()
                print("frame_rate = ",frame_rate)
            animate(group)
            clock.tick(30)
    pygame.quit()
    Clock 和 get_fps()
  • 相关阅读:
    Python正课101 —— 前端 入门
    Python正课100 —— 数据库 进阶5
    Python正课99 —— 数据库 进阶4
    Navicat15安装教程
    Python正课98 —— 数据库 进阶3
    Python正课97 —— 数据库 进阶2
    Python正课96 —— 数据库 进阶1
    解决:MySQL报错
    Python正课95 —— 数据库 入门
    作业3
  • 原文地址:https://www.cnblogs.com/wangchenghua/p/11277860.html
Copyright © 2011-2022 走看看