• pygame3 图像


    屏幕上画矩形,圆,或是画点,画曲线只是制作图形的一种方式。有时候我们还想用从别处得来的图片显示在我们的程序中。

    1、获取图片
     

    1. my_ball = pygame.image.load("beach_ball.png")
    2. screen.blit(my_ball, [50, 50])

    第一行代码表示将图片文件加载到内存中,以变量my_ball的形式以备调用

    第二行代码表示将图片放在窗口[50, 50]的位置

    当然,如果想看到效果,和前面的一样,窗口中的图像需要通过

    pygame.display.flip()函数将之从缓存打印到实际的显示器上,我们才能看到。

    完整代码如下:

    1. import pygame, sys
    2. pygame.init()
    3. screen = pygame.display.set_mode([640, 480])
    4. screen.fill([255, 255, 255])
    5. my_ball = pygame.image.load("beach_ball.png")
    6. screen.blit(my_ball, [50, 50])
    7. pygame.display.flip()
    8. while True:
    9. for event in pygame.event.get():
    10. if event.type == pygame.QUIT:
    11. sys.exit()

    效果图:

    2 让图片动起来 

    想移动球,就要改变图片的位置,即改变screen.blit的坐标值,代码如下:

    1. import pygame, sys
    2. pygame.init()
    3. screen = pygame.display.set_mode([640, 480])
    4. screen.fill([255, 255, 255])
    5. my_ball = pygame.image.load("beach_ball.png")
    6. screen.blit(my_ball, [50, 50])
    7. pygame.display.flip()
    8. pygame.time.delay(2000) # 等待2秒
    9. screen.blit(my_ball, [150, 50]) # 向右移动100像素
    10. pygame.display.flip()
    11. while True:
    12. for event in pygame.event.get():
    13. if event.type == pygame.QUIT:
    14. sys.exit()

    效果图:

    我们发现,球确实移动了,但左边的球还在,说明移动球需要把原来的球擦除掉。

    3、动画

    利用计算机做动画时,需要做到两步:

    1. 在新的位置上画出图形

    2. 把原来的图形擦掉

    关于擦掉的讨论:

    黑板上的擦掉是用黑板擦,如果是画的水彩画呢,比如蓝天上画的小鸟不想要了,想将之擦掉,只能重新画上蓝天将小鸟覆盖。计算机中的擦掉类似于水彩画的擦掉,是不能像黑板上那样擦的,只能画上物体之前的背景将想擦除的物体覆盖

    我们要擦除的对象是一个球,像素为90*90的大小,可以考虑用一个rect画出白色的方框,将球覆盖,关键代码:

    pygame.draw(screen, [255, 255, 255], [50, 50, 90, 90], 0)

    此代码在原先小球的位置画上一个白色方框,将原先的小球完全覆盖

    完整代码:

    1. import pygame, sys
    2. pygame.init()
    3. screen = pygame.display.set_mode([640, 480])
    4. screen.fill([255, 255, 255])
    5. my_ball = pygame.image.load("beach_ball.png")
    6. screen.blit(my_ball, [50, 50])
    7. pygame.display.flip()
    8. pygame.time.delay(2000)
    9. screen.blit(my_ball, [150, 50])
    10. pygame.draw.rect(screen, [255, 255, 255], [50, 50, 90, 90], 0) # 将原先的小球用白色的方框覆盖
    11. pygame.display.flip()
    12. while True:
    13. for event in pygame.event.get():
    14. if event.type == pygame.QUIT:
    15. sys.exit()

     讨论,如果背景是红色的呢,我们怎么擦除?

    如果是混合着其它颜色呢?

    4、让球一直动

    前面球动的时候我们调用blit(my_ball, [150, 50]), 球的坐标是写死的,想让球一直动,一般我们将坐标写成变量[x, y], 然后通过修改变量的值,使得球不断动起来

    关键代码:

    1. x = 50
    2. y = 50
    3. for looper in range(1, 100):
    4. pygame.time.delay(20)
    5. pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    6. x = x + 5
    7. screen.blit(my_ball, [x, y])
    8. pygame.display.flip()

    通过for循环,不断增加x坐标值,使得球不断向右移动

    思考一个问题,怎样改变球的速度?

    如果把循环100次增大到200次,会发生什么?

    5、让球反弹

    考虑一下,什么样的情况,球是碰到了右边框呢?screen.get_width()表示右边框

    x + 90 > screen.get_width()即表示达到了右边框

    在让球反弹时,我们想关闭程序可以吗?

    如果想要随时关闭程序,应该把动画放在While循环中

    关键代码:

    1. x = 50
    2. y = 50
    3. x_speed = 10
    4. while True:
    5. for event in pygame.event.get():
    6. if event.type == pygame.QUIT:
    7. sys.exit()
    8. pygame.time.delay(20)
    9. pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    10. x = x + x_speed
    11. if x + 90 > screen.get_width() or x < 0:
    12. x_speed = -x_speed
    13. screen.blit(my_ball, [x, y])
    14. pygame.display.flip()

    程序中 x + 90 > screen.get_width()是右边框的判断, x < 0是左边框的判断

    当 x_speed = 10时,球是从右向上移动,移动到右边框,即判断x+90 > screen.get_width()时, 

    x_speed = -x_speed即表示x_speed=-10了,每次x = x + x_speed即表示x = x - 10,即表示每次x坐标减少10,球向左移动,直到x<0时,判断球该反弹了, x_speed又为正10,如此循环往复。

    在此过程中,由于都是在while循环中,每移动一下都会检查有没有执行exit,有的话程序退出

    6、让球在整个画面中反弹

    这个简单,加上对y坐标的变化y_speed即可,完整代码如下:

    1. import pygame, sys
    2. pygame.init()
    3. screen = pygame.display.set_mode([640, 480])
    4. screen.fill([255, 255, 255])
    5. my_ball = pygame.image.load("beach_ball.png")
    6. x = 50
    7. y = 50
    8. x_speed = 10
    9. y_speed = 10
    10. while True:
    11. for event in pygame.event.get():
    12. if event.type == pygame.QUIT:
    13. sys.exit()
    14. pygame.time.delay(20)
    15. pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    16. x = x + x_speed
    17. y = y + y_speed
    18. if x + 90 > screen.get_width() or x < 0:
    19. x_speed = -x_speed
    20. if y + 90 > screen.get_height() or y < 0:
    21. y_speed = -y_speed
    22. screen.blit(my_ball, [x, y])
    23. pygame.display.flip()

    7、让球翻转,进到屏幕中,从另一边出来

    以横向运动为例,当完全进入屏幕右边,相当于x>screen.get_width(),此时只需将x坐标重置为0即可,更精确重置为0-90

    完整代码如下:

    1. import pygame, sys
    2. pygame.init()
    3. screen = pygame.display.set_mode([640, 480])
    4. screen.fill([255, 255, 255])
    5. my_ball = pygame.image.load("beach_ball.png")
    6. x = 50
    7. y = 50
    8. x_speed = 5
    9. while True:
    10. for event in pygame.event.get():
    11. if event.type == pygame.QUIT:
    12. sys.exit()
    13. pygame.time.delay(20)
    14. pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    15. x = x + x_speed
    16. if x > screen.get_width():
    17. x = 0 - 90
    18. screen.blit(my_ball, [x, y])
    19. pygame.display.flip()

  • 相关阅读:
    RFID电子标签实现仓储物流托盘智能化管理
    3、网关和BFF
    nodejs+vue+elementui毕业设计选题系统express vscode
    ApacheDBUtils的使用
    Explainable-ZSL
    vue - 组件通信:关于v-model语法糖
    ‘vue‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件 出现这个问题如何解决
    深度学习基于循环神经网络的文本分类
    基于QT的学生考勤系统
    【Rust日报】2022-05-28 Neon:AWS Aurora Postgres 的无服务器开源替代方案。
  • 原文地址:https://blog.csdn.net/luhouxiang/article/details/127828473