pygame3 图像

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

1、获取图片
 

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

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

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

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

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

完整代码如下:

import pygame, sys
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
my_ball = pygame.image.load("beach_ball.png")
screen.blit(my_ball, [50, 50])
pygame.display.flip()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

效果图:

2 让图片动起来 

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

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

效果图:

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

3、动画

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

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

2. 把原来的图形擦掉

关于擦掉的讨论:

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

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

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

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

完整代码:

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

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

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

4、让球一直动

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

关键代码:

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

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

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

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

5、让球反弹

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

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

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

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

关键代码:

x = 50
y = 50
x_speed = 10
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    pygame.time.delay(20)
    pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    x = x + x_speed
    if x + 90 > screen.get_width() or x < 0:
        x_speed = -x_speed
    screen.blit(my_ball, [x, y])
    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即可,完整代码如下:

import pygame, sys

pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
my_ball = pygame.image.load("beach_ball.png")
x = 50
y = 50
x_speed = 10
y_speed = 10
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    pygame.time.delay(20)
    pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    x = x + x_speed
    y = y + y_speed
    if x + 90 > screen.get_width() or x < 0:
        x_speed = -x_speed
    if y + 90 > screen.get_height() or y < 0:
        y_speed = -y_speed
    screen.blit(my_ball, [x, y])
    pygame.display.flip()

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

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

完整代码如下:

import pygame, sys
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
my_ball = pygame.image.load("beach_ball.png")
x = 50
y = 50
x_speed = 5
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    pygame.time.delay(20)
    pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
    x = x + x_speed
    if x > screen.get_width():
        x = 0 - 90
    screen.blit(my_ball, [x, y])
    pygame.display.flip()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要加快pygame图像绘制速度,可以考虑以下几个方法: 1. 使用双缓冲技术:双缓冲技术可以减少图像闪烁和卡顿的问题,提高图像绘制的流畅度。在pygame中,可以使用`pygame.display.set_mode()`函数创建一个双缓冲的窗口,然后在绘制完所有图像后,使用`pygame.display.flip()`函数将缓冲区的内容显示到屏幕上。 ```python import pygame # 初始化pygame pygame.init() # 创建双缓冲窗口 screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF) # 绘制图像 # ... # 刷新屏幕 pygame.display.flip() ``` 2. 使用硬件加速:pygame提供了硬件加速的功能,可以利用显卡的计算能力来加速图像的绘制。可以使用`pygame.Surface.convert()`函数将图像转换为硬件加速的格式。 ```python import pygame # 初始化pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((800, 600)) # 加载图像并转换为硬件加速格式 img = pygame.image.load("img.jpg").convert() # 绘制图像 screen.blit(img, (0, 0)) # 刷新屏幕 pygame.display.flip() ``` 3. 使用图像缓存:在绘制大量图像时,可以使用图像缓存来提高绘制速度。可以使用`pygame.Surface.subsurface()`函数创建一个图像缓存,然后将需要绘制的图像先绘制到缓存中,最后再将缓存绘制到屏幕上。 ```python import pygame # 初始化pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((800, 600)) # 创建图像缓存 buffer = pygame.Surface((800, 600)) # 绘制图像到缓存 buffer.blit(img, (0, 0)) # 将缓存绘制到屏幕 screen.blit(buffer, (0, 0)) # 刷新屏幕 pygame.display.flip() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值