2011-12-09 14 views
1

だから、私は単にPygameでオブジェクトを動かそうとしている。私はチュートリアルを探していますが、雪が降っているように見えるようにする方法があります。私はオブジェクトを移動するためにそのメソッドを実装しようとしていますが、私は運がないです。私がしたいのは、オブジェクトを画面全体に移動することだけです。スクリーンの終わりに達すると、オブジェクトはリセットされ、再び動きます。だから私は私のコード(2つのポリゴン、ライン、サークル)を水平または垂直に画面全体に移動させようとしていますが、本当に問題はありません。Pygameがオブジェクトを動かす

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ループ内で図面を移動する必要があります。その後 、あなたが各フレームのすべてを描いているので、あなたはできます

  • は、オブジェクトが画面
  • の1つの境界に達している場合は、あなたのオブジェクト
  • チェックの位置と方向を格納するためのオブジェクト/変数を作成
  • が終わり

だからあなたのポリゴンを描画するための新しい位置を使用して、あなたがそのようなものを持っている可能性が

(そのオブジェクトに変更するにはあなたの仕事です)
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 

私はこのコードだけでなく、可能性を説明するために最善を尽くします。

あなたはすでに知っています。

10行目はおそらくあなたが知らないものから始まります。サーフェスオブジェクトは、他のサーフェスにアタッチできる、またはpygame.drawを使用して描画できる、矩形のピクチャの一種です。それを信じるかどうか、窓は実際には表面です。

行10はサーフェスを作成し、行11は黒で塗りつぶし、行12はその上に五角形を描画します。

ライン13は、基本的に黒色のすべてのピクセルを透明にします。

14-17行目を理解すると分かります。

18行目は、その行に新しいサーフェスオブジェクトを作成しますが、その上に線を描画するのではなく、黒で塗りつぶして残ります。これは、古いプログラムの行を見ると、それはほんの矩形であることがわかります。

行20-23を理解する必要があります。

行24は、長方形の辞書を作成します。長方形はサーフェスオブジェクトの位置を示し、何かに描画するために必要です。

行25-28は、行と円の位置を変更します。私がこれをしたのは、あなたのプログラムの左上隅にラインとサークルがないことを考慮することが望ましいと思ったからです。

行29-33を理解する必要があります。

行34はすべての矩形を通過するforループを開始します。

行35は、各矩形の右側を1ピクセル右に移動します。

Line 36は、rectの右端がウィンドウの右端に当たっているかどうかを確認します。

ライン37は、そのラインに当たったラインがラインであるかどうかをチェックし、ライン38-39がそれを持っていた場所に移動します。

行40は、側面に当たっているものが円かどうかを確認し、そうであれば41-42行目でその位置に移動します。

行43-44は、左上隅に四角形を置きます。ここで他の2つの図形が始まります。

45行目を知っておく必要があります。

46-49行目は、surface.blit()関数を使用しています。この関数の最初の引数はサーフェスで、2番目の引数はrectです。

ライン50では、1秒間に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の変数の形式に変換されます。矢印キーを押すと、変数が変更され、形状の座標と位置が変更されます。