0

私はPygameを使用してPythonで作業していますが、カーソルキーでオブジェクトを移動することに応じてピクセルを描画する方法を考えています。

ですから、私がやりたいのは「動きの痕跡」を描くことです。たとえば、プレーヤーがオブジェクトを右に動かしているとき、プログラムは動きの開始から終了までこのオブジェクトの後ろにピクセルを描画する必要があります。

4

2 に答える 2

0

オブジェクトの過去の位置を追跡できます。
以下のコードでは、pygame.Rectが矢印キーで移動されています。

あなたが興味を持っている部分は、Playerクラスにあります 。

  1. lasts(リスト)
    • このリストは、プレーヤーの以前の位置の記録を保持します。
  2. update_list()(働き)
    • この関数はリストを管理し、
      • 現在の位置をリストに追加します。
      • リストがと同じ長さになったら、最初の要素を削除しfadeます。
  3. draw()(働き)
    • 実際には、ここではforループのみであり、インデックスを使用してフェージングRectを描画します。

:これは最も効率的なコードではありません。

コード

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)のみ)

于 2013-02-24T06:27:01.493 に答える
0

最も簡単な方法は次のsurface.set_at()とおりです。

surface.set_at((x, y), color)

x と y は、移動オブジェクトの位置です。色は のような RGB 3 要素のタプルです(100,0,200)

于 2013-02-22T16:05:34.493 に答える