2012-04-14 13 views
3

私はstackoverflowを初めて使いましたが、より高度なプログラマーからの少しの洞察を期待していました。私は次の学期にコンピュータサイエンスの専攻に専攻し、初心者のPythonプログラミングを学ぶイントロクラスを受講しています。私はすでに以下のプログラムを終了しています(教授のコードの一部を記入してウィンドウの表面に楕円を描くプログラムを作ることでしたが、少しでも悪いことではありません)。私はランダムに設定された楕円の色を持っていますが、プログラムが完全に再起動されるまでは同じ状態を保ちます。すなわち、すべての楕円はプログラムの長さの特定の色です。コードはそのまま書かれているので、各楕円の色を変える方法を理解することはできません。心に留めておいてください、これはすべてキックですが、誰かが特に有益で創造的な気持ちを持っているなら、私はあなたが何を言わなければならないのか興味があります。私が何かを説明できるかどうか私に教えてください。ありがとう!Python/Pygameの反復による図形の異なる色?


import pygame, random, sys 

WINDOWWIDTH = 700 
WINDOWHEIGHT = 700 
BACKGROUNDCOLOR = (150,160,100) 
#A different color every run 
OVAL_COLOR = (random.randint (0,255),random.randint (0,255), 
        random.randint (0,255)) 

pygame.init() 
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) 
pygame.display.set_caption("Mobile Ovals") 

#The draw variable is used later to indicate the mouse is still pressed 
ovals = [] 
completedOvals = [] 
finished = False 
draw = False 
startXY = (-1, -1) 

while not finished: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT or (event.type == pygame.KEYUP and 
        event.key == pygame.K_ESCAPE): 
      finished = True 

     elif event.type == pygame.KEYDOWN: 
      pressed = pygame.key.get_pressed() 
      if pressed[pygame.K_F4] and (pressed[pygame.K_LALT] or 
         pressed[pygame.K_RALT]): 
       finished = True 

     elif event.type == pygame.MOUSEBUTTONDOWN: 
      startXY = event.pos 
      draw = True 

     elif event.type == pygame.MOUSEBUTTONUP: 
      draw = False 
      for oval in ovals: 
       completedOvals.append (oval) 

     if draw == True: 
      del ovals [:] 

      #The above function ensures only one oval is onscreen at any given time 
      endXY = event.pos 
      width = (abs(endXY[0]-startXY[0])) 
      height = (abs(endXY[1]-startXY[1])) 

      #The code below allows the user to drag any direction 
      if endXY[0] < startXY[0]: 
       left = endXY[0] 
      else: 
       left = startXY[0] 
      if endXY[1] < startXY[1]: 
       top = endXY[1] 
      else: 
       top = startXY[1] 

      ovals.append (pygame.Rect (left, top, width, height)) 

      windowSurface.fill(BACKGROUNDCOLOR) 

      for oval in ovals: 
       pygame.draw.ellipse(windowSurface, OVAL_COLOR, oval) 

      for completedOval in completedOvals: 
       pygame.draw.ellipse(windowSurface, OVAL_COLOR, completedOval) 

      pygame.display.update() 

pygame.quit() 

答えて

2

あなたの問題は非常に簡単です。 OVAL_COLORを1回設定します。しかし、変数OVAL_COLORを参照するたびに、新しいランダムな色は作成されず、変数を作成したときにランダムに生成されたRGBカラーが再利用されます。

今度は、プログラムが構造化されているので、draw変数がtrueに設定されるたびに再描画しているすべての完全な楕円のリストを維持します。 OVAL_COLOR変数をforループ内に配置すると、マウスの移動ごとに色を更新し、描画される楕円の色や、再描画されるすべての古い楕円の色を変更します。

新しいランダムな楕円形の色を使用する解決策は、マウスボタンが押されたときに変数OVAL_COLORを設定することです。そうすることで、楕円を調整するためにマウスをドラッグすると、楕円の色は変化しません。しかし、プログラムの現在の構造を考えると、完成した楕円に割り当てられた楕円形の色を保存する必要があります。または、毎回楕円形の色を変更する必要があります。


マウスボタンを押すと、私たちのサークルの新しいランダムな色が欲しい。円を再描画するたびに使用されるランダムな値を生成します。

マウスボタンが離された
elif event.type == pygame.MOUSEBUTTONDOWN: 
     startXY = event.pos 
     OVAL_COLOR = (random.randint (0,255),random.randint (0,255), 
          random.randint (0,255)) 
     draw = True 

、楕円形の座標を保存し、それはで描かれた色と一緒に

elif event.type == pygame.MOUSEBUTTONUP: 
     draw = False 
     # print len(ovals) # (always ==1) 
     completedOvals.append ((ovals[-1], OVAL_COLOR)) 

これらの完成した楕円を反復するときは、毎回同じ色で描画します。

 for (completedOval, color) in completedOvals: 
      pygame.draw.ellipse(windowSurface, color, completedOval) 
+1

正確に。問題は、その問題を解決する方法を理解できないことです。私はループ内にOVAL_COLOR定数を含めようとしましたが、ただちに発色に十分なほど楕円の色が変わります。私は色コードをどこに配置するのかわからないので、 "for all completedOvals"の代わりに、描画されるたびに各楕円の色が変わるだけです。 – jdark135

+0

ええ、繰り返しごとに異なる色を割り当てる必要があります。 – rafuru

+0

私は、そのコードでは、すべての楕円、描画または描画されている色が変化するため、「すべての楕円」の修正または削除を伴わなければならないと思います。 – jdark135

1

単純なOval()クラスを作成します。そのクラスには色とサイズが含まれています。

import pygame 
from pygame.locals import * 

class Oval(object): 
    """handle, and draw basic ovals. stores Rect() and Color()""" 
    def __init__(self, startXY, endXY): 
     self.color = Color(random.randint(0,255), random.randint(0,255), random.randint(0,255)) 
     self.rect = Rect(0,0,1,1) 
     self.coord_to_oval(startXY, endXY) 

    def draw(self): 
     pygame.draw.ellipse(windowSurface, self.color, self.rect) 

    def coord_to_oval(self, startXY, endXY): 
     width = (abs(endXY[0]-startXY[0])) 
     height = (abs(endXY[1]-startXY[1])) 

     #The code below allows the user to drag any direction 
     if endXY[0] < startXY[0]: 
      left = endXY[0] 
     else: 
      left = startXY[0] 
     if endXY[1] < startXY[1]: 
      top = endXY[1] 
     else: 
      top = startXY[1] 

     self.rect = Rect(left, top, width, height) 

# main loop 
while not finished: 
    for event in pygame.event.get(): 
     # events, and creation: 
     # ... your other events here ... 

     elif event.type == MOUSEBUTTONDOWN: 
      startXY = event.pos 
      draw = True 

     elif event.type ==MOUSEBUTTONUP: 
      # on mouseup, create instance. 
      endXY = event.pos 
      oval_new = Oval(startXY, endXY) 
      completedOvals.append(oval_new) 

     # draw them: 
     for oval in ovals: 
       oval.draw() 
     for oval in completedOvals: 
       oval.draw() 

ほとんど完了していない楕円を除外しました。クリックする前にサイズを表示していましたか?

+0

コードにはいくつかの構文エラーがあります(たとえば、Ovalクラスは 'self'クラスを拡張しません)。また、このアプローチでは、マウスボタンを放すと楕円だけが描画されます。元の目的は、キャンバスに楕円を追加する前にその楕円を拡大縮小することでした。 –

+0

追加オプションありがとう、猿!私もDavidのコードのシンプルさは好きですが、面白いこともあります。私がコードを書き直さなければならなかったら、あなたのものを使うかもしれません。 – jdark135

+0

@David:修正されたOval(オブジェクト)に編集されました。あなたは、MOUSEDOWNで 'topleft'を、MOUSEMOTIONイベントで幅、高さを設定することにより、プレビューを追加することができます。 MOUSEUPで削除/設定しません。 – ninMonkey

関連する問題