私はPygameを使用してPythonで作業していますが、カーソルキーでオブジェクトを移動することに応じてピクセルを描画する方法を考えています。
ですから、私がやりたいのは「動きの痕跡」を描くことです。たとえば、プレーヤーがオブジェクトを右に動かしているとき、プログラムは動きの開始から終了までこのオブジェクトの後ろにピクセルを描画する必要があります。
オブジェクトの過去の位置を追跡できます。
以下のコードでは、pygame.Rectが矢印キーで移動されています。
あなたが興味を持っている部分は、Player
クラスにあります 。
lasts
(リスト)update_list()
(働き)
fade
ます。draw()
(働き)
注:これは最も効率的なコードではありません。
コード
import pygame
bg = (255, 255, 255)
def add_colors(color1, color2):
retval = []
for i in range(3):
c1 = color1[i]
c2 = color2[i]
c = c1+c2
if c > 255: # just basic handling
c -= 255
retval.append(round(int(c)))
return tuple(retval)
def calc_colors(color, fade):
retval = []
# calculating the color change rate
diff_color = []
for i in range(3):
diff = bg[i] - color[i]
c_diff = diff/float(fade)
diff_color.append(c_diff)
diff_color = tuple(diff_color)
# get the fading colors
lastcolor = bg
for i in range(fade):
new_color = add_colors(lastcolor, diff_color)
retval.append(new_color)
lastcolor = new_color
return retval[::-1]
class Player:
def __init__(self, color, fade, pygame_Rect_args):
"""Give arguments as given to pygame.Rect"""
self.rect = pygame.Rect(*pygame_Rect_args)
self.size = self.rect.size
self.vx = 0.0
self.vy = 0.0
self.lasts = []
self.maincolor = color
self.colors = calc_colors(color,fade)
self.fade = fade
def draw(self):
for i in range(len(self.lasts)):
pos = self.lasts[i]
c_color = self.colors[i]
pygame.draw.rect(screen, c_color, pygame.Rect(pos, self.size))
pygame.draw.rect(screen, self.maincolor, self.rect)
def update_list(self):
self.lasts.append(self.rect.topleft)
if len(self.lasts) > self.fade:
self.lasts.remove(self.lasts[0])
def update(self):
self.rect.x += int(round(self.vx))
self.rect.y += int(round(self.vy))
def handle_keys(self):
key = pygame.key.get_pressed()
if key[pygame.K_UP]: self.vy -= 0.1
if key[pygame.K_DOWN]: self.vy += 0.1
if key[pygame.K_LEFT]: self.vx -= 0.1
if key[pygame.K_RIGHT]: self.vx += 0.1
player = Player((255,255,0), 10, (10,10,10,10))
pygame.init()
screen = pygame.display.set_mode((640,480))
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
break
if not running:
break
player.handle_keys()
player.update_list()
player.update()
screen.fill(bg)
player.draw()
pygame.display.flip()
clock.tick(40)
このチュートリアルも実行することをお勧めします(全体ではなく、最後の部分(#9)のみ)
最も簡単な方法は次のsurface.set_at()
とおりです。
surface.set_at((x, y), color)
x と y は、移動オブジェクトの位置です。色は のような RGB 3 要素のタプルです(100,0,200)
。