如何:pygame 中的灰点颜色重叠
How to: Overlapping of gray dots colors in pygame
我正在研究带有随机移动点的 pygame。这些点在黑色表面上移动。目的是添加点的 RGB 颜色以防它们重叠。下图中有 3 个重叠的点。我怎样才能把点的RGB加起来?图像中的示例是三个重叠的点。点的重叠部分应具有颜色 [3*250/N, 3*250/N., 3*250/N],其中 N = 4 该部分应具有颜色 [187.5,187.5,187.5]。不重叠的部分保持基本网点颜色[250/N, 250/N, 250/N].
我不知道如何添加 RGB 颜色。有什么想法吗?
而当前代码:
import math
import random
import pygame
import random
N = 4
class focalspot(object):
def __init__(self,dirnx=0,dirny=0,color=(250/N,250/N,250/N)):
self.pos = 100,100
self.dirnx = 0
self.dirny = 0
self.color = color
def move(self, dirnx, dirny):
self.dirnx = dirnx
self.dirny = dirny
self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
if self.pos[0] >= width:
self.dirnx = -self.dirnx
if self.pos[1] >= width:
self.dirny = -self.dirny
if self.pos[0] <= 0:
self.dirnx = -self.dirnx
if self.pos[1] <= 0:
self.dirny = -self.dirny
def draw(self, surface):
pygame.draw.circle(surface, self.color, self.pos, 80, 0)
dots = [focalspot() for i in range(N)]
def redrawWindow(surface,dots):
global rows, width
surface.fill((0,0,0))
for dot in dots:
focalspot.draw(dot,surface)
pygame.display.update()
def main(flag,dots):
global width, rows
width = 400
win = pygame.display.set_mode((width, width))
counter = 0
clock = pygame.time.Clock()
while flag:
pygame.time.delay(50)
clock.tick(10)
for dot in dots:
dot.dirnx = int(random.uniform(-10, 10))
dot.dirny = int(random.uniform(-10, 10))
focalspot.move(dot,dot.dirnx,dot.dirny)
redrawWindow(win,dots)
pygame.image.save(win,'temp'+str(counter)+'.png')
counter =+ 1
print(counter)
main(True,dots)
您应该使用 Surface
class to draw your circles. This allows you to use the special blitting flags,例如BLEND_ADD
,这会做你想做的事:
import pygame
class Dot:
def __init__(self, pos=None):
self.image = pygame.Surface((50, 50))
self.image.set_colorkey((2, 4, 6))
self.image.fill((2, 4, 6))
pygame.draw.circle(self.image, (50, 50, 50), (25, 25), 25, 0)
self.rect = self.image.get_rect(center=pos or (0, 0))
def main():
screen = pygame.display.set_mode((400, 400))
dot = Dot()
dots = [dot, *[Dot(pos) for pos in ((50, 50), (100, 200), (120, 230), (200, 300), (300, 150))]]
clock = pygame.time.Clock()
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
return
dot.rect.center = pygame.mouse.get_pos()
screen.fill(pygame.Color('black'))
for d in dots:
screen.blit(d.image, d.rect, special_flags=pygame.BLEND_ADD)
pygame.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()
我正在研究带有随机移动点的 pygame。这些点在黑色表面上移动。目的是添加点的 RGB 颜色以防它们重叠。下图中有 3 个重叠的点。我怎样才能把点的RGB加起来?图像中的示例是三个重叠的点。点的重叠部分应具有颜色 [3*250/N, 3*250/N., 3*250/N],其中 N = 4 该部分应具有颜色 [187.5,187.5,187.5]。不重叠的部分保持基本网点颜色[250/N, 250/N, 250/N].
我不知道如何添加 RGB 颜色。有什么想法吗?
而当前代码:
import math
import random
import pygame
import random
N = 4
class focalspot(object):
def __init__(self,dirnx=0,dirny=0,color=(250/N,250/N,250/N)):
self.pos = 100,100
self.dirnx = 0
self.dirny = 0
self.color = color
def move(self, dirnx, dirny):
self.dirnx = dirnx
self.dirny = dirny
self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
if self.pos[0] >= width:
self.dirnx = -self.dirnx
if self.pos[1] >= width:
self.dirny = -self.dirny
if self.pos[0] <= 0:
self.dirnx = -self.dirnx
if self.pos[1] <= 0:
self.dirny = -self.dirny
def draw(self, surface):
pygame.draw.circle(surface, self.color, self.pos, 80, 0)
dots = [focalspot() for i in range(N)]
def redrawWindow(surface,dots):
global rows, width
surface.fill((0,0,0))
for dot in dots:
focalspot.draw(dot,surface)
pygame.display.update()
def main(flag,dots):
global width, rows
width = 400
win = pygame.display.set_mode((width, width))
counter = 0
clock = pygame.time.Clock()
while flag:
pygame.time.delay(50)
clock.tick(10)
for dot in dots:
dot.dirnx = int(random.uniform(-10, 10))
dot.dirny = int(random.uniform(-10, 10))
focalspot.move(dot,dot.dirnx,dot.dirny)
redrawWindow(win,dots)
pygame.image.save(win,'temp'+str(counter)+'.png')
counter =+ 1
print(counter)
main(True,dots)
您应该使用 Surface
class to draw your circles. This allows you to use the special blitting flags,例如BLEND_ADD
,这会做你想做的事:
import pygame
class Dot:
def __init__(self, pos=None):
self.image = pygame.Surface((50, 50))
self.image.set_colorkey((2, 4, 6))
self.image.fill((2, 4, 6))
pygame.draw.circle(self.image, (50, 50, 50), (25, 25), 25, 0)
self.rect = self.image.get_rect(center=pos or (0, 0))
def main():
screen = pygame.display.set_mode((400, 400))
dot = Dot()
dots = [dot, *[Dot(pos) for pos in ((50, 50), (100, 200), (120, 230), (200, 300), (300, 150))]]
clock = pygame.time.Clock()
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
return
dot.rect.center = pygame.mouse.get_pos()
screen.fill(pygame.Color('black'))
for d in dots:
screen.blit(d.image, d.rect, special_flags=pygame.BLEND_ADD)
pygame.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()