首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python游戏加载图像以非常慢的速度初始化屏幕

python游戏加载图像以非常慢的速度初始化屏幕
EN

Stack Overflow用户
提问于 2019-12-23 13:54:13
回答 1查看 52关注 0票数 1

我写了一个脚本来实现连续降雨,这个功能是完全正确的。

只有一个问题是,当我运行脚本时,初始化屏幕的速度真的很慢,几乎需要6-8秒才能在屏幕上看到图像。

我查找了导致此问题的一些原因,例如使用convert_alpha()加载映像,但是没有什么变化,它仍然非常缓慢。

那么是什么导致了这个问题?

下面是代码:

代码语言:javascript
复制
#!/usr/bin/python
import sys
import pygame as p
from random import randint

#13-4

class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.screen=p.display.set_mode((self.w,self.h),p.RESIZABLE,0)
        self.speed = 1  #rain speed
        p.display.set_caption("EXE 13-4")

class Rain(p.sprite.Sprite):
    def __init__(self):
        super().__init__()
        pic=p.image.load("../image/rain.jpg").convert_alpha()
        self.image=p.transform.smoothscale(pic,(100,100))  
        self.rect=self.image.get_rect()
        self.rect.x=(self.rect.width)/2         
        self.y=float(self.rect.y)              # store the rain rect in temp y

    def create(self,setting,rains):
        spacex=setting.w-2*self.rect.x         #calculate the space to put the rain
        numbers=int(spacex/(2*self.rect.x))    #calculate the numbera of every column
        rows=int(setting.h/(self.rect.height)) #calculate the rows
        for row in range(rows):
            for number in range(numbers):      #store the whole rain into Group rains
                rain=Rain()
                rain.number=number
                rain.row=row
                rain.rect.x =rain.rect.x+rain.rect.width*number
                rain.y = rain.rect.y+2*rain.rect.height*row
                rain.rect.y =rain.y
                rains.add(rain)
    def check_edge(setting,rains):
        for rain in rains.sprites():           #if any rain reach the bottom of screen restart them to the top
            if rain.rect.y == setting.h:
                rain.y=0
                rain.rect.y=rain.y
   def update(self,setting):
        self.y += setting.speed
        self.rect.y= self.y
    def blit(setting,rains):
        rains.update(setting)
        rains.draw(setting.screen)


def game():
    p.init()
    setting=Setting(1200,800)
    rain=Rain()
    rains=p.sprite.Group()
    rain.create(setting,rains)
    while True:
        for event in p.event.get():
            if event.type == p.QUIT:
                sys.exit()
            elif event.type == p.KEYDOWN:
                if event.key == p.K_ESCAPE:
                    sys.exit()
        setting.screen.fill((0,0,255))
        Rain.check_edge(setting,rains)
        Rain.blit(setting,rains)
        p.display.flip()
game()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-23 14:00:25

实际上,您要做的是为每个Rain实例一次又一次地加载相同的映像。

加载图像一次,并对所有雨滴使用相同的图像。例如,使用类属性表示雨滴图像(Rain.raindrop_pic)。此外,避免多次执行convert_alpha()transform.smoothscale

代码语言:javascript
复制
class Rain(p.sprite.Sprite):

    raindrop_pic = p.transform.smoothscale(
        p.image.load("../image/rain.jpg").convert_alpha(), (100,100)) 

    def __init__(self):
        super().__init__()

        self.image = Rain.raindrop_pic 

        # [...]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59456537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档