Как реализовать обнаружение столкновений? - PullRequest
0 голосов
/ 22 ноября 2018
from graphics import*
import time
import random 

def main():

    numx=random.randint(10,700)

    wn=GraphWin("AK",700,700)
    wn.setBackground("white")

    msg=Text(Point(25,30),"Score")
    msg.setSize(12)
    msg.setTextColor('blue')
    msg.draw(wn)

    inch=Entry(Point(60,30),2)
    inch.setFill('white')
    inch.draw(wn) 

    sqrg=Rectangle(Point(330,650),Point(430,665))
    sqrg.setFill("red")
    sqrg.draw(wn)

    blx=Circle(Point(numx,80),20)
    blx.setFill("blue")
    blx.draw(wn)


    xval=10
    yval=0
    wn.getMouse()
    for i in range(150):
        sqrg.move(xval,yval)
        symbl=wn.checkKey()
        if symbl=="Right":
                xval=10
                yval=0
        if symbl=="Left":
                xval=-10
                yval=0
        time.sleep(0.08)
        blx.move(0,20)

main()

Я очень смущен, мой профессор очень сбивает с толку, и мне нужно сделать это для проекта, в котором при обнаружении столкновения оценка возрастает.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Ниже приведен упрощенный пример на основе вашего кода.Он измеряет расстояние между центрами двух движущихся объектов, чтобы определить, произошло ли столкновение.Если вам удастся заставить мяч попасть в клетку, он должен отскочить прямо вверх:

from random import randint
from time import sleep
from graphics import *

def distance(p1, p2):
    return ((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2) ** 0.5

wn = GraphWin("AK", 700, 700)

sqrg = Rectangle(Point(325, 625), Point(375, 675))
sqrg.setFill("red")
sqrg.draw(wn)

numx = randint(10, 700)

blx = Circle(Point(numx, 80), 20)
blx.setFill("blue")
blx.draw(wn)

xval, yval = 10, 0

bheading = 1

wn.getMouse()

for i in range(150):
    sqrg.move(xval, yval)

    if distance(blx.getCenter(), sqrg.getCenter()) < 25:
        bheading *= -1

    symbl = wn.checkKey()

    if symbl == "Right":
        xval = 10
    elif symbl == "Left":
        xval = -10

    sleep(0.1)

    blx.move(0, bheading * 20)

Очистить не жизнеспособную игру как есть, а демонстрацию обнаружения столкновений.

0 голосов
/ 22 ноября 2018

Ваш радиус двадцать.Внутри цикла просто проверьте, находится ли евклидово расстояние между sqrg и blx в пределах 20.

...