Pygame -Images无法正确绘制

时间:2014-07-30 14:54:39

标签: python pygame

我在pygame中制作了一个照明系统,所以我的代码是在屏幕上绘制小黑色矩形并在手电筒图像碰撞时改变它们的不透明度。这是代码:

import sys
import pygame

S_WIDTH= 800
S_HEIGHT= 600
FPS= 60

class cursor(pygame.Rect):
    def __init__(self):
        pygame.Rect.__init__(self,0,0,1,1)
    def update(self):
        self.left,self.top=pygame.mouse.get_pos()

class flashlight():
    def __init__(self):
        self.IMG= pygame.image.load("B:/Proyectos pygame/Luz/linterna.png").convert_alpha()
        self.RECT= self.IMG.get_rect()
        self.RECT.top= 200
        self.RECT.left= 200

    def move(self,cursor):
        (self.RECT.top,self.RECT.left)= (cursor.top - 75,cursor.left - 65)

    def render(self,surface):
        surface.blit(self.IMG,self.RECT)

class shadow():
    def __init__(self):
        self.number= 4
        self.size_x= 800/self.number
        self.size_y= 600/self.number
        self.ORIGINAL_IMG= pygame.image.load("B:/Proyectos pygame/Luz/shadow_lines.png").convert_alpha()
        self.IMG= pygame.transform.scale(self.ORIGINAL_IMG, (self.size_x,self.size_y))
        self.list= []
        self.RECT= self.IMG.get_rect()
        self.RECT.top= 0
        self.RECT.left= 0
        self.pixel_w= 0
        self.pixel_h= 0
        self.pos_x= -(self.size_x)
        self.pos_y= -(self.size_y)

        for x in range(self.number + 1):
            self.pos_x += self.size_x
            self.pos_y += self.size_y

            self.shadow= {"rect": self.RECT,
                          "img": self.IMG,
                          "pos_x": self.pos_x,
                          "pos_y": self.pos_y
                          }

            self.list.append(self.shadow)

    def render(self,surface):
        for shadow in self.list:
            surface.blit(shadow["img"], shadow["rect"])


def main():
    pygame.init()
    pygame.mouse.set_visible(False)
    S_SURFACE= pygame.display.set_mode([S_WIDTH,S_HEIGHT])
    MAIN_CLOCK= pygame.time.Clock()
    CURSOR= cursor()
    FLASHLIGHT= flashlight()
    SHADOW= shadow()
    BG_IMG= pygame.image.load("B:/Proyectos pygame/Luz/BG_IMAGE.jpg")

    while True:
        MAIN_CLOCK.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        S_SURFACE.blit(BG_IMG,[0,0])
        SHADOW.render(S_SURFACE)
        CURSOR.update()
        FLASHLIGHT.move(CURSOR)
        FLASHLIGHT.render(S_SURFACE)        
        pygame.display.update()

if __name__ == "__main__":
    main()

但问题是它只绘制一个矩形!在类阴影中,当它创建矩形时,它通过将矩形的大小添加到下一个矩形的位置来确定其位置,然后将矩形保存在列表中。

1 个答案:

答案 0 :(得分:1)

我认为问题是由于shadow.render()方法中发生的事情:

def render(self,surface,rect):
    for shadow in self.list:
        surface.blit(shadow["img"], shadow["rect"])

因为在shadow["rect"]调用中作为surface.blit()参数传递的dest参数与self.list中附加到的每个字典对象的值相同。

注意:我建议您开始遵循PEP 8 -- Style Guide for Python Code编码指南,该指南指定类名称(例如cursorflashlightshadow)会被大写,因为它会使读取如果每个人遵循相同的约定,则可以更轻松地调试您自己以及其他人的代码。

不同类型的程序工件的命名样式通常会向代码的读者隐式提供有用的附加信息。作为一个具体的例子,人们会知道Shadowself引用的类实例的名称,而shadow只是某个局部变量的名称(可能指的是某些同一类的其他实例)。