Липкая ситуация в Ткинтере - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь написать обнаружение столкновений, но у меня появляется странное поведение при залипании: когда я сталкиваюсь с объектом, он проходит, а когда я go возвращаюсь, он залипает. что происходит здесь?

настройка модуля

import tkinter as tk
import random

настройка переменных

groundheight = 700
playersize = 50
PVx = 5
PVy = 0
playermass = 25
groundmass = 1000
playerx = 0
playery = -5
isgrounded = False
enemysize = 25

поведение игрока

def forever():
    global PVx
    global PVy
    global playerx
    global playery
    global isgrounded
    enemyarray = canv.find_withtag("enemy")
    playerx = canv.coords("player")[2]-playersize/2
    playery = canv.coords("player")[3]-playersize/2
    canv.move("player", PVx, PVy)
    distoground = math.sqrt(math.pow(playery - groundheight, 2))
    if distoground <= playersize:
        PVy = 0
    else:
        isgrounded = False
        PVy += 0.1
    root.after(16, forever)

поведение противника


def enemyupdate():
    global PVx
    global PVy
    enemyarray = canv.find_withtag("enemy")
    for i in enemyarray:
        enemymass = 25
        Evx = 0
        EVy = 0
        x = canv.coords("enemy")[2]-playersize
        y = canv.coords("enemy")[3]-playersize
        distoground = math.sqrt(math.pow(y - groundheight, 2))
        distoplayer = math.sqrt(((x-playerx)**2)+((y-playery)**2))
        if distoground <= playersize:
            EVy = 0
        else:
            EVy += 5

здесь происходят столкновения

        if distoplayer <= playersize+enemysize:
            tempx = Evx
            Evx = (playermass*PVx + enemymass*Evx)/(playermass+enemymass)
            PVx = (playermass*PVx + enemymass*Evx)/(playermass+enemymass)
        canv.move(i, Evx, EVy)
    root.after(16, enemyupdate)

получение ввода

def getaxis(X):
    global PVx
    PVx = X

код перехода для более позднего

def jump(event):
    global PVy
    if isgrounded:
        PVy -= 5

ткинтер основной л oop

root = tk.Tk()
root.geometry("1920x1080")
root.state("zoomed")
canv = tk.Canvas(width=1920, height=1080, bg='light blue')
canv.create_rectangle(0, groundheight, 1920, 1080, fill="White")
player = canv.create_oval(0, 700, playersize, 700-playersize, fill="Red", tag="player")
canv.pack()
root.after(1, forever)
root.after(1, enemyupdate)
root.bind("<space>", jump)
root.bind("<Left>", lambda *args: getaxis(-5))
root.bind("<Right>", lambda  *args: getaxis(5))
for i in range(1):
    enemx = 500
    player = canv.create_oval(enemx+enemysize, 700, enemx - enemysize, 700-enemysize*2, fill="Red", tag="enemy")
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...