zoukankan      html  css  js  c++  java
  • 吴裕雄--天生自然python学习笔记:python 用pygame模块动画一让图片动起来

    动画是游戏开发中不可或缺的要素,游戏中的角色只有动起来才会拥有“生命”,
    但动画处理也是最让游戏开发者头痛的部分。Pygame 包通过不断重新绘制绘图窗口,短短几行代码就可以让图片动起来!
    动画处理程序的基本架构

    import pygame
    
    pygame.init()
    screen = pygame.display.set_mode((640, 320))
    pygame.display.set_caption("动画基本架构")
    
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((255,255,255))
    
    clock = pygame.time.Clock()  #建立时间组件
    
    running = True
    while running:
        clock.tick(1)  #每秒执行30次
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.blit(background, (0,0))  #清除绘图窗口
        pygame.display.update()  #更新绘图窗口
        
    pygame.quit()  #关闭绘图窗口

    绘次数越多,动画越流畅,但 CPU 负担越重,如果超
    过负荷,程序可能引起死机。如无特殊需求,一般设为 30 。
    水平移动的蓝色球体
    下面我们通过一个水平移动的蓝色球体的例子来学习简单的动画处理程序 。
    开始时,蓝色球体位于水平的中央位置并向右移动,碰到右边界时会反弹向左侧,碰到左边界时再反弹回右侧 。

    import pygame
    
    pygame.init()
    screen = pygame.display.set_mode((640, 70))
    pygame.display.set_caption("水平移动")
    
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((255,255,255))
    
    ball = pygame.Surface((30,30))  #建立矩形绘图区
    ball.fill((255,255,255))  #矩形区背景为白色
    pygame.draw.circle(ball, (0,0,255), (15,15), 15, 0)  #画一个蓝色球
    rect1 = ball.get_rect()  #取得球矩形区域
    rect1.center = (320,45)  #球起始位置
    
    x, y = rect1.topleft  #球左上角坐标
    dx = 3  #球运动速度
    clock = pygame.time.Clock()
    
    running = True
    while running:
        clock.tick(30)  #每秒执行30次
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.blit(background, (0,0))  #清除绘图窗口
        x += dx  #改变水平位置
        rect1.center = (x,y)
        if(rect1.left <= 0 or rect1.right >= screen.get_width()):  #到达左右边界
            dx *= -1
        screen.blit(ball, rect1.topleft)
        pygame.display.update()
    pygame.quit()

    制作一个可自由移动的蓝色球体
    要想让一个球体可以向任何方向移动,需要把运动速度分解为水平速度及垂直
    速度,我们通过控制水平与垂直两个方向的速度就能实现自由移动了。水平及垂直
    速度可用三角函数取得,计算方式如下图:

    开始时蓝色球体以随机角度向右上方移动,撞到边缘后会反弹并继续移动。

    import pygame, random, math
    
    pygame.init()
    screen = pygame.display.set_mode((400, 300))
    pygame.display.set_caption("自由移动")
    
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((255,255,255))
    
    ball = pygame.Surface((30,30))  #建立矩形绘图区
    ball.fill((255,255,255))  #矩形区域背景设为白色
    pygame.draw.circle(ball, (0,0,255), (15,15), 15, 0)  #画一个蓝色球体
    
    rect1 = ball.get_rect()  #取得球矩形区域
    rect1.center = (random.randint(100,250),random.randint(150,250))  #球起始位置
    x, y = rect1.topleft  #球左上角坐标
    
    direction = random.randint(20,70)  #起始角度
    radian = math.radians(direction)  #转为弪度
    dx = 5 * math.cos(radian)  #球水平运动速度
    dy = -5 * math.sin(radian)  #球垂直运动速度
    
    clock = pygame.time.Clock()
    
    running = True
    while running:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.blit(background, (0,0))  #清除绘图窗口
        x += dx  #改变水平位置
        y += dy  #改变垂直位置
        rect1.center = (x,y)
        if(rect1.left <= 0 or rect1.right >= screen.get_width()):  #到达左右边界
            dx *= -1  #水平速度变号
        elif(rect1.top <= 5 or rect1.bottom >= screen.get_height()-5):  #到达上下边界
            dy *= -1  #垂直速度变号
        screen.blit(ball, rect1.topleft)
        pygame.display.update()
    pygame.quit()

  • 相关阅读:
    div中子div在firefox ie 水平居中对齐
    Access数据库自定义连接字符串(详细有图百度文档)
    ASP页面乱码
    国内开源asp.netCMS汇总
    sql 2005
    卡巴斯基授权key导入方式方法及其导入key基本原理
    关于SqlServer服务无法启动的症状分析和解决方法
    js下流媒体的在线播放
    用JS+vml作三维报表
    了解嵌入式数据库(sqlite,firebird)
  • 原文地址:https://www.cnblogs.com/tszr/p/12036595.html
Copyright © 2011-2022 走看看