2017-05-14 9 views
1

私は3つの矩形を持つ2つのリストを持っています。私は変数selected1とselected2に各リストから3つのrectを割り当て、それらの間のギャップを保ちながら別々に上下に2つのrectの行を移動できますか?私は初心者であり、そのような構築されたコードがこの作業を処理できるかどうかはわかりません。複数の矩形を1つずつクリックして移動する

import pygame 

# === CONSTANS === 
white = (255, 255, 255) 
black = (0, 0, 0) 
red = (255, 0, 0) 
blue = (0, 0, 255) 
green = (0, 102, 0) 
yellow = (255, 204, 0) 
grid_color = (224, 224, 224) 

width = 1200 
height = 720 

k = 10 

screen = pygame.display.set_mode((width, height)) 
screen_rect = screen.get_rect() 

# --- objects --- 

G_x = 10 # stripe width 
x = 2 

stripes_x1 = [] 
stripes_x2 = [] 

G1_pos_x = 122 
G2_pos_x = 367 
G1_pos_y = 0 
G2_pos_y = 0 

G1_y = 60*x 
G2_y = 75*x 

G1_start = G1_pos_y + height - G1_y 
G2_start = G2_pos_y + height - G2_y 

a = 166 
b = 222 
for x in range(3): 
    gap = a*x 
    gap2 = b*x 
    stripes_x1.append(pygame.Rect(G1_pos_x, (G1_start - 6*k) - gap, G_x, G1_y)) 
    stripes_x2.append(pygame.Rect(G2_pos_x, (G2_start - 6*k) - gap2, G_x, G2_y)) 

selected1 = None 
selected2 = None 

# --- mainloop --- 

clock = pygame.time.Clock() 
is_running = True 

while is_running: 

    for event in pygame.event.get(): 

     # --- global events --- 

     if event.type == pygame.QUIT: 
      is_running = False 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       is_running = False 

     if event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1: 
       for i, r in enumerate(stripes_x1): 
        if r.collidepoint(event.pos): 
         selected1 = i 
         selected_offset_y = r.y - event.pos[1] 
     if event.type == pygame.MOUSEMOTION: 
      if selected1 is not None: # selected can be `0` so `is not None` is required 
       stripes_x1[selected1].y = event.pos[1] + selected_offset_y 

     if event.type == pygame.MOUSEBUTTONUP: 
      if event.button == 1: 
       selected1 = None 

     if event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1: 
       for j, r in enumerate(stripes_x2): 
        if r.collidepoint(event.pos): 
         selected2 = j 
         selected_offset_y = r.y - event.pos[1] 
     if event.type == pygame.MOUSEMOTION: 
      if selected2 is not None: # selected can be `0` so `is not None` is required 
       stripes_x2[selected2].y = event.pos[1] + selected_offset_y 

     if event.type == pygame.MOUSEBUTTONUP: 
      if event.button == 1: 
       selected2 = None 

     # --- objects events --- 

     ''' 
     button.handle_event(event) 
     ''' 
    # --- updates --- 
     # empty 
    # --- draws --- 

    screen.fill(white) 
    for i in range(width): 
     grid_x = k * i 
     grid_y = k * i 

     pygame.draw.line(screen, grid_color, (grid_x, 0), (grid_x, height), 1) 
     pygame.draw.line(screen, grid_color, (0, grid_y), (width, grid_y), 1) 
     pygame.draw.line(screen, black, (6 * k, height - 6 * k), (width - 6 * k, height - 6 * k), 3) 
     pygame.draw.line(screen, black, (6 * k, height - 6 * k), (6 * k, 0 * k), 3) 
    # draw rect 
    for r in stripes_x1: 
     pygame.draw.rect(screen, green, r) 
    for s in stripes_x2: 
     pygame.draw.rect(screen, green, s) 


    pygame.display.update() 

    clock.tick(60) 
pygame.quit() 
+1

詳細にあなたの目標を記述し、(それはあなたが達成しようとしているものはまだの場合)あなたが私の最後の時間を示した交通信号調整プログラムの画像を投稿してください。 – skrx

+1

私がここで達成しようとしているのは、交通信号の調整(緑色の波)の時間/距離グラフです。縦の緑色の矩形は、緑色の信号の量を表します。緑色の矩形の各行は、異なる交差点を表します。調整は、緑色の矩形の間の対角線(バンド)で表されます。最適な構成に調整するために緑色の矩形の行を正確に移動したり、緑色の光の長さを変更したり、赤色の光、サイクル、速度などの位置に合わせて、必要なパラメータを編集できる必要があります。012km3//138/zielona%20fala.jpg – Bartnick81

答えて

1

同時にrectsを移動するには、リストでそれらを置くことができるし、1つの矩形を選択した場合は、最後のマウスからMOUSEMOTIONイベント(相対位置のrel属性の助けを借りて、それらすべてを動かしますイベント)。ここでは、最小限の例です:

import sys 
import pygame as pg 


BLACK = pg.Color('black') 
RECT_COLOR = pg.Color(78, 140, 200) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    rect_list = [pg.Rect(100, 100+y, 20, 80) for y in range(0, 241, 120)] 
    selected = False 
    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEBUTTONDOWN: 
       for rect in rect_list: 
        if rect.collidepoint(event.pos): 
         selected = True 
      elif event.type == pg.MOUSEBUTTONUP: 
       selected = False 
      elif event.type == pg.MOUSEMOTION: 
       if selected: 
        for rect in rect_list: 
         rect.y += event.rel[1] 

     screen.fill(BLACK) 
     for rect in rect_list: 
      pg.draw.rect(screen, RECT_COLOR, rect) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit() 
+1

私は私の問題を解決しましたが、私はリストを取り除かなければなりませんでした。あなたのソリューションは、しかし、はるかにエレガントでいいようです。しかし、私は完全にコードを把握することができません - この部分はどのように機能しますか? yの範囲(0,241,120)] – Bartnick81

+1

'[pg.Rect(100,100 + y、20,80)for y in範囲(0,241,120)] 'それは[リストの理解](http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/)です。 'for y in range(0、241、120)'は0、120、240の数字を与えます(私はちょうどrect位置のy-オフセ​​ットとして使っています)。 – skrx

+0

MOUSEMOTIONイベントのrel属性は、(クリックされた場所を基準にして)矩形を移動するためのきれいなメソッドですが、2ピクセル以上ごとに移動する必要があります。 [1]しかし、期待されているものよりも、それは同期していないようです。因子による移動は、event.relを使って正しく行えますか? – Bartnick81

関連する問題