2011-12-09 3 views
1

파이 게임에서 오브젝트를 단순히 이동하려고합니다. 나는 자습서를 찾고 있었지만 찾을 수있는 방법은 눈이 내리는 것처럼 보이게 만드는 방법이다. 그 방법을 객체 이동으로 구현하려고했지만 행운이 없습니다. 제가하고 싶은 것은 화면 전체에 걸쳐 객체를 움직이는 것입니다. 그리고 화면의 끝에 도달하면 다시 설정하고 다시갑니다. 그래서 저는 코드 (두 개의 다각형, 선 및 원)에서 수평 또는 수직으로 화면을 가로 질러 놓은 객체를 옮기려고합니다. 그다지 중요하지 않습니다.파이 게임의 오브젝트 이동

import pygame, sys, time, random 
from pygame.locals import * 

pygame.init() 

windowSurface = pygame.display.set_mode((500, 400), 0, 32) 
pygame.display.set_caption("Paint") 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
RED = (255, 0, 0) 
GREEN = (0, 255, 0) 
BLUE = (0, 0, 255) 

windowSurface.fill(WHITE) 

pygame.draw.polygon(windowSurface,BLUE,((146, 0), (250, 100), (230, 265), (44, 250), (0,110))) 
pygame.draw.polygon(windowSurface,RED,((70, 0), (150, 200), (0, 50))) 
pygame.draw.line(windowSurface,BLACK,(60, 60), (120, 60), 8) 
pygame.draw.circle(windowSurface, GREEN , (150,150), 15, 0) 


pygame.display.update() 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
+0

아마도 도움이 될 수 있습니다. http://stackoverflow.com/questions/8252860/pygame-move-object-position-from-one-point-to-another-at-constant-speed/8253040#8253040 – sinan

답변

3

당신의 접근 방식으로는 할 수 없습니다. 파이 게임 사용의 배경은 각 프레임을 그리려는 모든 오브젝트를 그리는 것입니다. 먼저 그림을 while True 루프 안으로 옮겨야합니다. 각 프레임을 모든 그리기하고 있기 때문에 그런 다음, 당신은 할 수 : 객체가 화면의 경계에 도달하면

  • 하면 객체
  • 검사의 위치와 방향을 저장하는 객체/변수를 생성
  • 마지막에

그래서 다각형을 그리기위한 새로운 위치를 사용하여, 당신이 뭔가를 할 수

(그것은 개체에 변경하려면 작업의) 927,357,이 아주 좋은 튜토리얼입니다
1

의 시작을위한 당신과 매우 유사한 몇 가지 코드를 포함, 당신은해야합니다 "while True :"루프를 사용하여 뭔가를 변경하십시오.

import pygame, sys, pygame.locals#1 
pygame.init()#2 
window=pygame.display.set_mode((500, 400), 0, 32)#3 
pygame.display.set_caption("Paint")#4 
BLACK = (0, 0, 0)#5 
WHITE = (255, 255, 255)#6 
RED = (255, 0, 0)#7 
GREEN = (0, 255, 0)#8 
BLUE = (0, 0, 255)#9 
pentagon=pygame.Surface((250, 265))#10 
pentagon.fill((0, 0, 0))#11 
pygame.draw.polygon(pentagon, BLUE, ((146, 0), (250, 100), (230, 265), (44, 250), (0,110)))#12 
pentagon.set_colorkey((0, 0, 0))#13 
triangle=pygame.Surface((150, 200))#14 
triangle.fill((0, 0, 0))#15 
pygame.draw.polygon(triangle, RED, ((70, 0), (150, 200), (0, 50)))#16 
triangle.set_colorkey((0, 0, 0))#17 
line=pygame.Surface((60, 8))#18 
line.fill(BLACK)#19 
circle=pygame.Surface((30, 30))#20 
circle.fill((0, 0, 0))#21 
pygame.draw.circle(circle, GREEN , (15, 15), 15, 0)#22 
circle.set_colorkey((0, 0, 0))#23 
rects={'pentagon': pentagon.get_rect(), 'triangle': triangle.get_rect(), 'line': line.get_rect(), 'circle': circle.get_rect()}#24 
rects['line'].centery=60#25 
rects['line'].left=60#26 
rects['circle'].centerx=150#27 
rects['circle'].centery=150#28 
while True:#29 
    for event in pygame.event.get():#30 
     if event.type==pygame.locals.QUIT:#31 
      pygame.quit()#32 
      sys.exit()#33 
    for rect in rects:#34 
     rects[rect].right+=1#35 
     if rects[rect].right>500:#36 
      if rect=='line':#37 
       rects['line'].centery=60#38 
       rects['line'].left=60#39 
      elif rect=='circle':#40 
       rects['circle'].centerx=150#41 
       rects['circle'].centery=150#42 
      else:#43 
       rects[rect].topleft=(0, 0)#44 
    window.fill(WHITE)#45 
    window.blit(pentagon, rects['pentagon'])#46 
    window.blit(triangle, rects['triangle'])#47 
    window.blit(line, rects['line'])#48 
    window.blit(circle, rects['circle'])#49 
    pygame.time.Clock().tick(40)#50 
    pygame.display.update()#51 

나는 가능한뿐만 아니라이 코드를 설명하기 위해 최선을 다하겠습니다 : 여기에 당신이 무엇을하려고 할 것입니다 코드의 예입니다.

줄 1-9, 당신은 이미 알고 있습니다.

줄 10은 아마도 당신이 모르는 것으로 시작합니다. 서페이스 개체는 다른 서페이스에 첨부하거나 pygame.draw로 그릴 수있는 사각형 그림 유형입니다. 믿거 나 말거나, 창은 실제로 표면입니다.

선 10은 서페이스를 만들고 선 11은 검정으로 채우고 선 12는 오각형을 그립니다.

기본적으로 13 행은 검은 색으로 표시된 모든 픽셀을 투명하게 만듭니다.

14-17 줄을 이제 이해해야합니다.

선 18은 선에 대한 새로운 곡면 개체를 작성하지만 선을 그립니다 대신 검정색으로 채워집니다. 왜냐하면 이전 프로그램의 줄을 보면 그 사각형이 실제로 사각형인지 아닌지 알 수 있기 때문입니다.

20-23 줄을 이해해야합니다.

줄 24는 직사각형 사전을 만듭니다. 직사각형은 서페이스 개체의 위치를 ​​표시하며 서페이스 개체를 무언가에 그릴 때 필요합니다.

라인 25-28은 라인과 원의 위치를 ​​변경합니다. 내가이 일을 한 이유는 프로그램의 왼쪽 상단 구석에 선과 원이 없다는 것을 고려하면 좋겠다고 생각했기 때문입니다.

29-33 행을 이해해야합니다.

라인 34는 모든 rect를 통과하는 for 루프를 시작합니다.

라인 35는 각 직사각형의 오른쪽을 한 픽셀 오른쪽으로 이동합니다.

라인 36은 rect의 오른쪽이 윈도우의 오른쪽 가장자리에 맞았는지 확인합니다.

Line 37은 측면을 맞춘 것이 라인인지 확인하고, 맞으면 라인 38-39는 그것을 가지고 있던 위치로 이동합니다.

라인 40은 측면을 맞춘 것이 원인지 확인하고, 맞으면 라인 41-42는 원했던 위치로 이동합니다.

43-44 행은 왼쪽 위 모서리에 사각형을 넣습니다. 다른 두 모양이 시작되었습니다.

라인 45 알아 두어야 할 사항.

46-49 행은 surface.blit() 함수를 사용합니다. 이 함수의 첫 번째 인수는 서페이스이고 두 번째 인수는 rect입니다.

라인 50은 초당 40 프레임 이상을 허용하지 않습니다.

51 번째 줄은 화면을 업데이트합니다.

정말 도움이 되었으면 좋겠다. 투표를하거나 투표를 통해 답변을 받아 주시면 감사하겠습니다. 질문이 있으시면, 물어보십시오. 고맙습니다!

0

전혀 어렵지 않습니다. 먼저 우리가 개체 (들) 이동 에 문제를 해결 할 수 있습니다 : 위의 코드 라인에서

import pygame, sys, time, random 
from pygame.locals import * 

pygame.init() 

windowSurface = pygame.display.set_mode((500, 400), 0, 32) 
pygame.display.set_caption("Paint") 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
RED = (255, 0, 0) 
GREEN = (0, 255, 0) 
BLUE = (0, 0, 255) 

windowSurface.fill(WHITE) 

x, y = 250, 200 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 

    pressed = pygame.key.get_pressed() 
    if pressed[K_UP]: y - 5 
    if pressed[K_DOWN]: y + 5 
    if pressed[K_LEFT]: x - 5 
    if pressed[K_RIGHT]: x + 5 

    pygame.display.update() 

pygame.draw.polygon(windowSurface,BLUE,((x - 104, y - 200), (x, y - 100), (x - 20, y + 65), (x - 206, y + 50), (x - 250, y - 90))) 
pygame.draw.polygon(windowSurface,RED,((x - 180, y - 200), (x - 100, y), (x - 250, y - 150))) 
pygame.draw.line(windowSurface,BLACK,(x - 190, y - 140), (x - 130, y - 140), 8) 
pygame.draw.circle(windowSurface, GREEN , (x - 100, y - 50), 15, 0) 

을, 모든 좌표는 X, Y 변수의 형태로 변환됩니다. 화살표 키를 누르면 변수가 변경되므로 도형의 좌표와 위치가 변경됩니다.