如何进行碰撞检查?

时间:2016-05-09 21:56:03

标签: python turtle-graphics

我不知道该怎么做,我想这样做,以便Python中的一只乌龟射出子弹,如果它与另一只乌龟发生碰撞,分数就会上升。除非我运行此代码,否则当我射击子弹时游戏会崩溃。到目前为止,我只尝试过八个移动命令中的一个。

        DesiredCapabilities dc = DesiredCapabilities.firefox();
        dc.merge(capabillities);
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setPreference("browser.download.folderList", 4);
        profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath());
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        profile.setPreference("browser.download.manager.focusWhenStarting", false);
        profile.setPreference("browser.download.useDownloadDir", true);
        profile.setPreference("browser.helperApps.alwaysAsk.force", false);
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.download.manager.closeWhenDone", true);
        profile.setPreference("browser.download.manager.showAlertOnComplete", false);
        profile.setPreference("browser.download.manager.useWindow", false);
        profile.setPreference("browser.download.panel.shown",false);
        dc.setCapability(FirefoxDriver.PROFILE, profile);
        this.driver = new FirefoxDriver(dc);

这是我遇到问题的部分

#imports turtles 
import turtle
import random
#Sets screen, turtle program, and colour group
turtle.setup(1000, 800)
screen = turtle.Screen()
wn = turtle.Screen()
wn.bgcolor("springgreen")

amir = turtle.Turtle() 
amir.shape("arrow")
amir.shapesize(1)
amir.speed(10)
amir.pensize (2)
amir.color("blue")
amir.setheading(90)
amir.penup()
#bullet 1
jonafat = turtle.Turtle()
jonafat.shape("circle")
jonafat.shapesize(0.5)
jonafat.speed(2)
jonafat.pensize (1)
jonafat.color("black")
jonafat.penup()
jonafat.ht()

hossein = turtle.Turtle()
hossein.shape("arrow")
hossein.shapesize(1)
hossein.speed(10)
hossein.pensize (2)
hossein.color("gold")
hossein.setheading(90)
hossein.penup()
#bullet 
jonafat2 = turtle.Turtle()
jonafat2.shape("circle")
jonafat2.shapesize(0.5)
jonafat2.speed(2)
jonafat2.pensize (1)
jonafat2.color("black")
jonafat2.penup()
jonafat2.ht()
#scoreboard
TT = turtle.Turtle() 
TT.ht()
TT.penup()
TT.goto(-500,200)
TT.color("black")
TT.write("0", move = False, align = "center", font = ("Arial", 20, "normal"))
#second scoreboard
TT = turtle.Turtle() 
TT.ht()
TT.penup()
TT.goto(-500,200)
TT.color("black")
TT.write("0", move = False, align = "center", font = ("Arial", 20, "normal"))

x = 0
y = 0
amirs = 2
hosseins = 2
auto = 15 
vanguard = 15
trump = 0
time = 1
score = 0
panda = 295

def up():
    global amir
    global x
    global amirs
    global hosseins
    amir.seth(90)
    n = 1
    for i in range(0, n):
        amir.sety(amir.ycor()+10)
        n + 1

def down():
    global amir
    global x
    global amirs
    global hosseins
    amir.seth(270)
    n = 1
    for i in range(0, n):
        amir.sety(amir.ycor()-10)
        n + 1

def left():
    global amir
    global x
    global amirs
    global hosseins
    amir.seth(180)
    n = 1
    for i in range(0, n):
        amir.setx(amir.xcor()-10)
        n + 1

def right():
    global amir
    global x
    global amirs
    global hosseins
    amir.seth(0)
    n = 1
    for i in range(0, n):
        amir.setx(amir.xcor()+10)
        n + 1

def up2():
    global hossein
    global y
    global hosseins
    hossein.seth(90)
    n = 1
    for i in range(0, n):
        hossein.sety(hossein.ycor()+10)
        n + 1

def down2():
    global hossein
    global y
    global hosseins
    hossein.seth(270)
    n = 1
    for i in range(0, n):
        hossein.sety(hossein.ycor()-10)
        n + 1

def left2():
    global hossein
    global y
    global hosseins
    hossein.seth(180)
    n = 1
    for i in range(0, n):
        hossein.setx(hossein.xcor()-10)
        n + 1

def right2():
    global hossein
    global y
    global hosseins
    hossein.seth(0)
    n = 1
    for i in range(0, n):
        hossein.setx(hossein.xcor()+10)
        n + 1

def collisionCheck(jonafat, hossein):
    crash = True
    jonafat1X = jonafat.xcor()
    jonafat1Y = jonafat.ycor()
    hossein2X = hossein.xcor()
    hossein2Y = hossein.ycor()
    jonafatPos = (int(jonafat1X), int(jonafat1Y))
    hosseinPos = (int(hossein2X), int(hossein2Y))
    if jonafatPos != hosseinPos:
        crash = False
    if jonafatPos == hosseinPos:
        crash = True
    return crash

def clock():
    global time
    time = time-1

def move():
    global auto
    global vanguard
    global score
    global time
    wn.ontimer(clock,1000)
    angle = amir.heading()
    jonafat.ht()
    jonafat.speed(10)
    jonafat.setpos(amir.xcor(), amir.ycor())
    if angle == 0:
        trump = 1. 
        time = time-1
        jonafat.showturtle()
        jonafat.speed(2)
        n = 1
        for i in range(0, n):
            jonafat.goto(amir.xcor()+300, amir.ycor())
            n + 1
        infLoop = 1
        while infLoop == 1:
                if collisionCheck(jonafat, hossein) == True:
                    infLoop = 0
                    break
                    score = score + 1
                    TT.clear()
                    TT.write(score, move = False, align = "center", font = ("Arial", 20, "normal"))

                if time == 0:
                    break
                    infLoop = 0


    if angle == 90:
        jonafat.showturtle()
        jonafat.speed(2)
        n = 1
        for i in range(0, n):
            jonafat.goto(amir.xcor(),amir.ycor()+300)
            n + 1
    if angle == 180:
        jonafat.showturtle()
        jonafat.speed(2)
        n = 1
        for i in range(0, n):
            jonafat.goto(amir.xcor()-300, amir.ycor())
            n + 1
    if angle == 270:
        jonafat.showturtle()
        jonafat.speed(2)
        n = 1
        for i in range(0, n):
            jonafat.goto(amir.xcor(), amir.ycor()-300)
            n + 1


def move2():
    angle2 = hossein.heading()
    jonafat2.ht()
    jonafat2.speed(10)
    jonafat2.setpos(hossein.xcor(), hossein.ycor())
    if angle2 == 0:
        jonafat2.showturtle()
        jonafat2.speed(2)
        n = 1
        for i in range(0, n):
            jonafat2.goto(hossein.xcor()+300, hossein.ycor())
            n + 1
    if angle2 == 90:
        jonafat2.showturtle()
        jonafat2.speed(2)
        n = 1
        for i in range(0, n):
            jonafat2.goto(hossein.xcor(), hossein.ycor()+300)
            n + 1
    if angle2 == 180:
        jonafat2.showturtle()
        jonafat2.speed(2)
        n = 1
        for i in range(0, n):
            jonafat2.goto(hossein.xcor()-300, hossein.ycor())
            n + 1
    if angle2 == 270:
        jonafat2.showturtle()
        jonafat2.speed(2)
        n = 1
        for i in range(0, n):
            jonafat2.goto(hossein.xcor(), hossein.ycor()-300)
            n + 1








wn.onkeypress(up, "w")
wn.onkeypress(down, "s")
wn.onkeypress(left, "a")
wn.onkeypress(right, "d")
wn.onkeypress(up2, "Up")
wn.onkeypress(down2, "Down")
wn.onkeypress(left2, "Left")
wn.onkeypress(right2, "Right")
wn.onkeypress(move2, "Shift_R")

wn.onkeypress(move, "space")

wn.listen() 

2 个答案:

答案 0 :(得分:0)

看来你唯一检查它们的位置是否相同,尽管两个物体可以相互靠近,以便它们在视觉上相互碰撞,但是它们的位置并不完全相同。

您需要考虑其尺寸以正确检查碰撞。检查它们是否发生碰撞的最简单方法是获取它们之间的距离并检查它是否小于某个值。虽然存在更好的选择。

答案 1 :(得分:0)

而不是所有这些:

def collisionCheck(jonafat, hossein):
    crash = True
    jonafat1X = jonafat.xcor()
    jonafat1Y = jonafat.ycor()
    hossein2X = hossein.xcor()
    hossein2Y = hossein.ycor()
    jonafatPos = (int(jonafat1X), int(jonafat1Y))
    hosseinPos = (int(hossein2X), int(hossein2Y))
    if jonafatPos != hosseinPos:
        crash = False
    if jonafatPos == hosseinPos:
        crash = True
    return crash

让我们利用@JoshuaWaring的建议以及turtle的distance()方法,并提出更多类似的内容:

PERSONAL_SPACE = 10  # assign this to be how close is too close

def collisionCheck(jonafat, hossein):
    return jonafat.distance(hossein) < PERSONAL_SPACE

让我们重新编写代码的其余部分以制作可玩性最低的游戏:

# imports turtles
from turtle import Turtle, Screen

PERSONAL_SPACE = 15  # assign this to be how close is too close
FIRE_DISTANCE = 300
FONT = ('Arial', 36, 'normal')

# Sets screen, turtle program, and color group
screen = Screen()
screen.setup(1000, 800)
screen.bgcolor('springgreen')

def collisionCheck(bullet, player):
    return bullet.distance(player) < PERSONAL_SPACE

def up1():
    player1.seth(90)
    player1.forward(10)

def down1():
    player1.seth(270)
    player1.forward(10)

def left1():
    player1.seth(180)
    player1.forward(10)

def right1():
    player1.seth(0)
    player1.forward(10)

def clock1():
    global time1, score1

    if collisionCheck(bullet1, player2):
        score1 += 1
        TT1.undo()
        TT1.write(score1, align='center', font=FONT)
        time1 = 1
    else:
        bullet1.forward(1)

    time1 -= 1

    if time1:
        screen.ontimer(clock1, 10)
    else:
        bullet1.hideturtle()

def fire1():
    global time1

    bullet1.setpos(player1.pos())
    bullet1.setheading(player1.heading())
    bullet1.showturtle()

    time1 = FIRE_DISTANCE
    screen.ontimer(clock1, 100)

screen.onkeypress(up1, 'w')
screen.onkeypress(down1, 's')
screen.onkeypress(left1, 'a')
screen.onkeypress(right1, 'd')
screen.onkeypress(fire1, 'space')

def up2():
    player2.seth(90)
    player2.forward(10)

def down2():
    player2.seth(270)
    player2.forward(10)

def left2():
    player2.seth(180)
    player2.forward(10)

def right2():
    player2.seth(0)
    player2.forward(10)

def clock2():
    global time2, score2

    if collisionCheck(bullet2, player1):
        score2 += 1
        TT2.undo()
        TT2.write(score2, align='center', font=FONT)
        time2 = 1
    else:
        bullet2.forward(1)

    time2 -= 1

    if time2:
        screen.ontimer(clock2, 10)
    else:
        bullet2.hideturtle()

def fire2():
    global time2

    bullet2.setpos(player2.pos())
    bullet2.setheading(player2.heading())
    bullet2.showturtle()

    time2 = FIRE_DISTANCE
    screen.ontimer(clock2, 100)

screen.onkeypress(up2, 'Up')
screen.onkeypress(down2, 'Down')
screen.onkeypress(left2, 'Left')
screen.onkeypress(right2, 'Right')
screen.onkeypress(fire2, '0')

player1 = Turtle('arrow')
player1.speed('fastest')
player1.color('blue')
player1.setheading(180)
player1.penup()
player1.forward(10)

# bullet 1
bullet1 = Turtle('circle', visible=False)
bullet1.shapesize(0.5)
bullet1.speed('fastest')
bullet1.color('black', 'blue')
bullet1.penup()

player2 = Turtle('arrow')
player2.speed('fastest')
player2.color('gold')
player2.setheading(0)
player2.penup()
player2.forward(10)

# bullet 2
bullet2 = Turtle('circle', visible=False)
bullet2.shapesize(0.5)
bullet2.speed('fastest')
bullet2.color('black', 'gold')
bullet2.penup()

# scoreboard
TT1 = Turtle(visible=False)
TT1.penup()
TT1.goto(-450, 300)
TT1.color('blue')
TT1.write('0', align='center', font=FONT)

# second scoreboard
TT2 = Turtle(visible=False)
TT2.penup()
TT2.goto(450, 300)
TT2.color('gold')
TT2.write('0', align='center', font=FONT)

time1 = 0
score1 = 0

time2 = 0
score2 = 0

screen.listen()

screen.mainloop()

仍需要额外的工作,即无法正确处理(或禁用)多次拍摄等。

enter image description here