2017-10-30 2 views
1

녹색과 빨강 (쌍) 중 하나를 클릭하고 드래그하여 서로의 위치를 ​​유지하면서 둘 다 이동할 수 있어야합니다. 나는 이미 가지고있는 코드로 어떻게 할 지 모르겠다. 빨간색 직사각형을위한 다른 클래스를 만들거나 부모 자식 클래스를 사용해야합니까? 도움말 크게 감사드립니다.파이 게임 - 두 객체 중 하나를 클릭하고 드래그하면서 움직입니다.

import pygame as pg 

WHITE = (255, 255, 255) 
GREEN = (33, 133, 33) 
RED = (255, 0, 0) 
SCREEN = pg.display.set_mode((700, 500)) 
clock = pg.time.Clock() 
cT = 140 # cycle time 
cNum = 3 # cyle number 

class Rectangle(pg.sprite.Sprite): 

    def __init__(self, color, width, height, x, y): 
     super().__init__() 
     self.height = height 
     self.color = color 
     self.image = pg.Surface((width, height)) 
     self.image.fill(color) 
     self.rect = self.image.get_rect(topleft=(x, y)) 

    def move(self, rel_x, rel_y): 
     self.rect.move_ip(rel_x, rel_y) 

    def collidepoint(self, pos): 
     return self.rect.collidepoint(pos) 

class Rect1(): 

    def __init__(self, color, width, height, x, y, all_sprites): 

     self.height = height 
     self.selected1 = False 
     self.rect = pg.Rect((x, y, width, height)) 
     self.rectangles = [] 

     for z in range(0, cNum * cT, cT): 
      rect = Rectangle(color, width, height, x, self.rect.y - z + cT) 
      self.rectangles.append(rect) 
      all_sprites.add(rect) 

    def move(self, rel_x, rel_y): 
     self.rect.move_ip(rel_x, rel_y) 
     for r in self.rectangles: 
      r.move(rel_x, rel_y) 

    def collidepoint(self, pos): 
     for r in self.rectangles: 
      if r.rect.collidepoint(pos): 
       return True 

    def handle_event(self, event): 
     if event.type == pg.MOUSEBUTTONDOWN: 
      if self.collidepoint(event.pos): 
       self.selected1 = True 
     elif event.type == pg.MOUSEBUTTONUP: 
      self.selected1 = False 
     elif event.type == pg.MOUSEMOTION: 
      if self.selected1 : 
       self.move(0, event.rel[1]) 


class Connection(): 

    def __init__(self, rect_1, rect_2, vel): 
     self.rect_1 = rect_1 
     self.rect_2 = rect_2 
     self.vel = vel 

    def draw(self, screen): 

     for r_1 in self.rect_1.rectangles: 
      for r_2 in self.rect_2.rectangles: 

       dist1 = r_2.rect.x - r_1.rect.x 
       velocity = int(dist1 * self.vel) # green wave angle 

       A_start_x, A_start_y = r_1.rect.topright 
       A_end_x, A_end_y = r_1.rect.bottomright 

       B_start_x, B_start_y = r_2.rect.topleft 
       B_end_x, B_end_y = r_2.rect.bottomleft 


       if B_start_y < A_start_y - velocity and B_end_y > A_start_y - velocity: 
        start_pos = (A_start_x, A_start_y) 
        end_pos = (B_start_x, A_start_y - velocity) # minus 50 
        pg.draw.aaline(screen, GREEN, start_pos, end_pos, 1) 

       if B_end_y > A_end_y - velocity and B_start_y < A_end_y - velocity: 
        start_pos = (A_end_x, A_end_y-1) 
        end_pos = (B_end_x, A_end_y - 1 - velocity) # minus 50 
        pg.draw.aaline(screen, RED, start_pos, end_pos, 1) 

def main(): 
    pg.init() 
    all_sprites = pg.sprite.Group() 

    objects = [ 
     Rect1(GREEN, 10, 58, 55, 244, all_sprites), 
     Rect1(GREEN, 10, 111, 188, 226, all_sprites), 
     Rect1(RED, 10, 68, 69, 222, all_sprites), 
     Rect1(RED, 10, 121, 211, 202, all_sprites),] 
    conns = [ 
     Connection(objects[0], objects[1], 0.1), 
     Connection(objects[2], objects[3], -0.1),] 

    done = False 
    clock = pg.time.Clock() 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 

      for o in objects: 
       o.handle_event(event) 

     SCREEN.fill(WHITE) 

     all_sprites.draw(SCREEN) 

     for c in conns: 
      c.draw(SCREEN) 

     pg.display.update() 
     clock.tick(60) 
    pg.quit() 
if __name__ == '__main__': 
    main() 
+1

원하는 동작 조금 불분명하다. 짧은 빨간색 사각형을 끌면 짧은 녹색 사각형도 이동해야합니까? 그리고 길고 붉은 색과 녹색의 사각형 쌍에 대해서도 마찬가지입니까? 짧은 짝과 짧은 짝을 이루고 있습니까? – skrx

+1

@skrx 예, 짧은 녹색 직사각형과 짧은 빨간색 직사각형은 함께 움직여야하며 긴 빨간색과 긴 녹색도 동일하게 움직여야합니다. 그리고이 두 쌍 (짧고 긴 직사각형)은 독립적으로 움직여야합니다. 여기에 애매한 점에 대해 사과드립니다. – Bartnick81

답변

1

사용자는 속성으로서, 다른 직사각형의 참조를 저장하여 사각형을 연결할 수있다 (예 self.associated)를 다음 handle_event 방법뿐만 아니라 관련된의 구형를 업데이트 self.associated.move(0, event.rel[1])

class Rect1(): 

    def __init__(self, color, width, height, x, y, all_sprites, associated=None): 
     self.associated = associated 
     # Snip ... 

    def handle_event(self, event): 
     # Snip ... 
     elif event.type == pg.MOUSEMOTION: 
      if self.selected1 : 
       self.move(0, event.rel[1]) 
       self.associated.move(0, event.rel[1]) 

def main(): 
    # Snip ... 
    green_short = Rect1(GREEN, 10, 58, 55, 244, all_sprites) 
    red_short = Rect1(RED, 10, 68, 69, 222, all_sprites, green_short) 
    green_short.associated = red_short 

    green_long = Rect1(GREEN, 10, 111, 188, 226, all_sprites) 
    red_long = Rect1(RED, 10, 121, 211, 202, all_sprites, green_long) 
    green_long.associated = red_long 

    objects = [green_short, green_long, red_short, red_long] 
+0

오류가 발생했습니다 : 'NoneType'개체를 호출 할 수 없거나 'Rect1'개체를 호출 할 수 없습니다. – Bartnick81

+1

[채팅방]을 만들었습니다 (https://chat.stackoverflow.com/rooms/info/157813/bartnick81s-project ? tab = general) 여기서 오류를 표시 할 수 있습니다. – skrx