1

Zelle graphics.py를 사용하여 원을 내 사각형에서 반사 시키려고합니다. 원이 직사각형에서 튀어 오르면 무작위로 움직이기를 원했습니다. 지금까지 내 코드가 있으며, 작동 중입니다! 또한 각 원형 그래픽은 기술적으로 충돌을 수행하기 위해 원 주위에 맞을 수있는 가능한 가장 작은 사각형의 점을 사용할 수 있지만 그 작업을 수행하는 데 문제가 있음을 알고 있습니다.Zelle graphics.py의 충돌

from graphics import * 
import random 

def delay(d): 
    for i in range(d): 
     for i in range(50): 
      pass 
#------------------------------------------------- 
def main(): 


    win=GraphWin("Moving Circle",500,400) 
    win.setBackground('white') 
    pt= Point(100,200) 
    cir=Circle(pt,30) 
    #changes the color of the circle for each game 
    r = random.randrange(256) 
    b = random.randrange(256) 
    g = random.randrange(256) 
    color = color_rgb(r, g, b) 
    cir.setFill(color) 
    cir.draw(win) 
#rectangle 
    rec = Rectangle(Point(450,450), Point(275, 425)) 
    rec.draw(win) 
    rec.setFill('black') 
#------------------------------------------------- 
    pt5 = Point(250,30) 
    instruct1=Text(pt5, "click multiple times to start(rectangle can take multiple clicks to move)") 
    instruct1.setTextColor('black') 
    instruct1.draw(win) 


#------------------------------------------------- 
    p=cir.getCenter() 
    p2=win.getMouse() 

    dx=1 
    dy=1 

    keepGoing=True 

    while keepGoing: 
     d = 100 
     delay(d) 
     cir.move(dx,dy) 
     p=cir.getCenter() 
     p2=win.checkMouse() 
     instruct1.setText("") 


#rectanlge 
     isClicked= win.checkMouse() 
     if isClicked: 
      rp = isClicked 
      rc = rec.getCenter() 
      rdx = rp.getX() - rc.getX() 
      rdy = rp.getY() - rc.getY() 
      rec.move(rdx,rdy) 

#circle 
     if((p.getX()-30)<=0.0) or ((p.getX()+30)>=500): 
      dx= -dx 

     if((p.getY()-30)<=0.0) or ((p.getY()+30)>=400): 
      dy=-dy 
     p3=win.checkMouse() 



main() 

답변

0

나는 각 원의 그래픽은 기술적으로 내가 대체와 함께 연주하고있어 충돌을

을 수행 할 원 주위에 전나무 것 가능한 가장 작은 사각형의 포인트를 사용할 수 있다는 것을 알고 idea - 우리는 원 주위를 사각형 대신에 원으로 생각할 수 있습니다. 저를위한 문제점은 우리는 충돌을 검출 할 필요가 있고, 그러나 다른 목표에서 멀리 움직이는 감각으로 나온다이다. 단지 TrueFalse이 아니며 오히려 (dx, dy) 결과 유형입니다.

물론, 사각형 주위에 원도 원유이지만 사각형을 구성하는 작은 원을 많이했다 가정 그리고 우리는 히트 감지 거리의 중심을 원의 중심을 측정 :

enter image description here

을 중앙의 (녹색) 직사각형 원에 치면 큰 원의 수직 방향을 반대로 의미합니다. 끝 부분 (빨간색) 원이 맞으면 큰 원의 수평 방향이 바뀝니다. 그리고 두 가지 종류의 히트를 모두 탐지하고 큰 원을 완전히 뒤집을 수 있습니다.

여기 염두에두고 위의와 코드의 내 재 작업이다 - 나는 또한 여러 클릭의 문제를 해결하고 스타일 변화를 많이 만들어 :

from random import randrange 
from graphics import * 

WIDTH, HEIGHT = 500, 400 

RADIUS = 30 

def delay(d): 
    for _ in range(d): 
     for _ in range(50): 
      pass 

def distance(p1, p2): 
    return ((p2.getX() - p1.getX()) ** 2 + (p2.getY() - p1.getY()) ** 2) ** 0.5 

def intersects(circle, rectangle): 

    dx, dy = 1, 1 # no change 

    center = circle.getCenter() 

    rectangle_radius = (rectangle.p2.getY() - rectangle.p1.getY())/2 
    rectangle_width = rectangle.p2.getX() - rectangle.p1.getX() 

    y = rectangle.getCenter().getY() 

    for x in range(int(rectangle_radius * 2), int(rectangle_width - rectangle_radius * 2) + 1, int(rectangle_radius)): 
     if distance(center, Point(rectangle.p1.getX() + x, y)) <= rectangle_radius + RADIUS: 
      dy = -dy # reverse vertical 
      break 

    if distance(center, Point(rectangle.p1.getX() + rectangle_radius, y)) <= rectangle_radius + RADIUS: 
      dx = -dx # reverse horizontal 
    elif distance(center, Point(rectangle.p2.getX() - rectangle_radius, y)) <= rectangle_radius + RADIUS: 
      dx = -dx # reverse horizontal 

    return (dx, dy) 

def main(): 
    win = GraphWin("Moving Circle", WIDTH, HEIGHT) 

    circle = Circle(Point(WIDTH/5, HEIGHT/2), RADIUS) 

    # change the color of the circle for each game 
    color = color_rgb(randrange(256), randrange(256), randrange(256)) 
    circle.setFill(color) 

    circle.draw(win) 

    # rectangle 
    rectangle = Rectangle(Point(275, 425), Point(450, 450)) # off screen 
    rectangle.setFill('black') 
    rectangle.draw(win) 

    dx, dy = 1, 1 

    while True: 
     delay(100) 
     circle.move(dx, dy) 

     # rectangle 
     isClicked = win.checkMouse() 

     if isClicked: 
      point = isClicked 
      center = rectangle.getCenter() 
      rectangle.move(point.getX() - center.getX(), point.getY() - center.getY()) 

     # circle 
     center = circle.getCenter() 

     if (center.getX() - RADIUS) <= 0.0 or (center.getX() + RADIUS) >= WIDTH: 
      dx = -dx 

     if (center.getY() - RADIUS) <= 0.0 or (center.getY() + RADIUS) >= HEIGHT: 
      dy = -dy 

     # collision bounce 

     x, y = intersects(circle, rectangle) 
     dx *= x 
     dy *= y 

main() 

완벽하지,하지만 뭔가 가능성이 연결로 놀러을 더 나은 intersects() 구현.

+0

고마워요! 이것은 매우 도움이되었다! – jen