0

わかりましたので、pygame.draw を使用して、Entity というクラスでスティック フィギュアを作成しています。

class Entity: #Used with default arguments blited on a 600 by 600 pixel screen
    def __init__(self, pos=[300, 300]):
        self.pos = pos
        self.legR = [10, 25]
        self.legL = [-10, -25]
        self.armR = [0, 0]
        self.armL = [0, 0]
        self.body = [30, 5]
        self.head = [0, 0, 5]
        self.size = [60, 110]
        self.color = [0, 0, 0]
        self.image = pygame.surface.Surface(self.size)
        self.image.fill([255, 255, 255])
    def render(self, screen, frame):
        self.image = pygame.surface.Surface(self.size)
        self.image.fill([255, 255, 255])
        pygame.draw.line(self.image, self.color, [self.size[0]/2, self.size[1]/2],
                         [self.size[0]/2+self.legR[0], self.size[0]/2+self.legR[1]], 5)
        pygame.draw.line(self.image, self.color, [self.size[0]/2, self.size[1]/2],
                         [self.size[0]/2+self.legL[0], self.size[0]/2+self.legL[1]], 5)
        pygame.draw.line(self.image, self.color, [self.size[0]/2, self.size[1]/2],
                         [self.size[0]/2+self.body[0], self.size[0]/2+self.body[1]], self.body[1])
        pygame.draw.circle(self.image, self.color,
                           [self.size[0]/2+self.body[0]+self.head[0], self.size[1]/2+self.body[1]+self.head[1]],
                           self.head[2])
        #pygame.draw.line(self.image, self.color, [self.size/2
        screen.blit(self.image, self.pos)

だから私はこれを実行すると、ランダムな方向にたくさんの線があるこの奇妙でめちゃくちゃな画像が表示されます. 機能をよく理解していないようです。構成可能なジョイントを備えたレンダリング可能なスティック フィギュアの例を教えてください。そうでない場合、誰かが少なくとも私の致命的なエラーを教えてもらえますか? ありがとう!

4

2 に答える 2

1

あなたのコードに基づいて例を書き始めました。今のところ、2 本の足と彼の背骨を描くだけです。

ノート:

  1. タプルの代わりにベクトルを使用すると、return self.pos+offsetvsが可能になりますreturn (self.pos[0]+offset[0], self.pos[1]+offset[1])
  2. ローカルの原点を基準としたオフセットを使用して描画します。

コード:

import pygame
from pygame.locals import *

pygame.init()
# not normally all global, but simplified demo
color_bg = Color("gray20")    
color_fg = Color("gray80")
clock = pygame.time.Clock()   

screen = pygame.display.set_mode((600,400))

class Entity(): 
    def __init__(self, pos=(300, 300)):
        self.pos = pos
        self.armR = (10, 10)
        self.armL = (-10, 10)
        self.body = (0, -20)
        self.head_offset = self.offset(self.body)

    def offset(self, offset):
        # get offset to draw, relative stickman's hips
        return (self.pos[0]+offset[0], self.pos[1]+offset[1])

    def render(self):        
        b = self.pos
        #pygame.draw.line( screen, color_fg, (10,10), (20,30) )

        o = self.offset( self.armL )
        pygame.draw.line( screen, color_fg, b, o )

        o = self.offset( self.armR )
        pygame.draw.line( screen, color_fg, b, o )

        o = self.offset( self.body )
        pygame.draw.line( screen, Color("red"), b, o )

class Game():
    def __init__(self):
        self.e = Entity()

    def draw(self):                
            screen.fill( color_bg )

            self.e.render()            

            pygame.display.flip()            
            clock.tick(80)

    def loop(self):
        done=False

        while not done:
            events = pygame.event.get()

            for event in events:
                if event.type == pygame.QUIT: done = True
                # event: keydown
                elif event.type == KEYDOWN:
                    if event.key == K_ESCAPE or event.key == K_SPACE: done = True
                elif event.type == MOUSEMOTION:
                    self.mouse_loc = event.pos

            self.draw()

g = Game()
g.loop()
于 2012-10-14T06:17:07.710 に答える
0

私が見る主な問題は、エンティティのサイズの x 値を、線上の点の 1 つの y 値に使用していることです。

pygame.draw.line(self.image, self.color, [self.size[0]/2, self.size[1]/2],
                     [self.size[0]/2+self.legR[0], self.size[0]/2+self.legR[1]], 5)

3 番目の引数の 2 番目の値は次のようになります。

self.size[1]/2+self.legR[1]

それはあなたがレンダリングしたいことを望みますが、私はまたサルのアドバイスを受けて少し整理し、繰り返されるコードを関数に区分します.

于 2012-10-14T06:36:13.040 に答える