我在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()
但问题是它只绘制一个矩形!在类阴影中,当它创建矩形时,它通过将矩形的大小添加到下一个矩形的位置来确定其位置,然后将矩形保存在列表中。
答案 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编码指南,该指南指定类名称(例如cursor
,flashlight
和shadow
)会被大写,因为它会使读取如果每个人遵循相同的约定,则可以更轻松地调试您自己以及其他人的代码。
不同类型的程序工件的命名样式通常会向代码的读者隐式提供有用的附加信息。作为一个具体的例子,人们会知道Shadow
是self
引用的类实例的名称,而shadow
只是某个局部变量的名称(可能指的是某些同一类的其他实例)。