2012-10-14 2 views
0

좋아, 그래서 엔티티라는 클래스의 막대기 그림을 만들기 위해 pygame.draw을 사용하고 있습니다 :파이 게임 그리기하지 그리는 무엇을해야

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) 

그래서 나는 이것을 실행하고 나에게 이상한 엉망 이미지를 제공합니다 임의의 방향으로 줄을 묶어서. 그것은 나에게 솔기가있어 나는 그 기능을 잘 이해하지 못한다. 구성 가능한 관절이있는 렌더링 가능한 스틱 그림의 예가 있습니까? 그렇지 않다면 누군가 적어도 내 치명적인 오류를 알려주시겠습니까? 감사!

답변

1

코드를 기반으로 예제를 작성하기 시작했습니다.

주 : 대신 튜플의

  1. 사용하여 벡터 내가 그리는 상대 로컬 원점 오프셋을 사용 return self.pos+offset
  2. return (self.pos[0]+offset[0], self.pos[1]+offset[1]) 대 당신이해야 할 것입니다 지금은 그냥 두 다리와 척추를 그립니다.

코드 :

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() 
+0

신체의 나머지 부분에 대한 예를 들어 주시겠습니까? –

0

내가 보는 가장 큰 문제는 당신이 당신의 라인에 포인트 중 하나의 y 값에 대한 기업의 크기의 x 값을 사용하고 있다는 것입니다 :

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) 

제 인수 번째 값은 다음과 같아야

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

T 모자는 당신이 원하는 렌더링을 얻을 것이다,하지만 나는 또한 원숭이의 조언을 받아 조금 정리하고 반복 된 코드를 기능별로 분류한다.

+0

'self.size [0]/2'는 self.topleft를 고려하기를 원하는지에 따라'self.width/2'로 단순화 될 수 있습니다. ** 사용할 가상 속성 **이 많이 있습니다. : (단락 뒤에 페이지 상단 참조) http://www.pygame.org/docs/ref/rect.html – ninMonkey

+0

@monkey 그의 클래스는 Surface에서 파생되지 않으므로 width 또는 topleft 속성이 없습니다. 그의 클래스 정의에 따라 self.size [1]/2가 필요합니다. – kevintodisco