tkinter跳转并运行游戏画布对象碰撞

问题描述 投票:0回答:1

我正在尝试使用画布在tkinter中编写一个小的Jump'n'Run游戏,到目前为止它的工作非常好,但我有一个问题,我无法绕过我的脑袋。

看看these three pictures:第一次撞击工作正常 - 我可以从一个桨跳到另一个桨。

在第二张图片中,你可以看到,每当我进入桨下它不会掉下来并且跳起来也是不可能的,可能是因为我在self.y = 0碰撞检测中有self.brick。我怎么能这样工作,即使它在桨下它反弹,因为这很重要,例如当我开始添加第二行桨。

我的碰撞代码:

        def brick_hit(self, pos):
        for brick_line in self.bricks:
            for brick in brick_line:
                brick_pos = self.gamerootCanvas.coords(brick.id)
                try:
                    if pos[3] > brick_pos[1]:
                        if pos[2] > brick_pos[0] and pos[0] < brick_pos[2]:
                            return True
                except:
                    continue
        return False

我的完整代码:

def jump_and_run():
gameroot = Toplevel()
gameroot.title("Game Root")
gameroot.resizable(0, 0)
gameroot.wm_attributes("-topmost", 1)
gamerootCanvas = Canvas(gameroot, width=1800, height=800, bd=0, highlightthickness=0)
gameroot_Background = PhotoImage(file="jumpnrunbackground.png")
gamerootCanvas.create_image(500, 250, image=gameroot_Background)
gamerootCanvas.pack()
gamerootCanvas.update()

class Player:
    def __init__(self, gamerootCanvas, bricks, color):
        self.gamerootCanvas = gamerootCanvas
        self.id = gamerootCanvas.create_rectangle(25,25,0,0, fill=color)
        self.gamerootCanvas.move(self.id, 5, 650)
        self.bricks = bricks
        self.x = 0
        self.y = 0
        self.gravity = 0.1
        self.gamerootCanvas_height = gamerootCanvas.winfo_height()
        self.gamerootCanvas_width = gamerootCanvas.winfo_width()
        self.gamerootCanvas.bind_all("<KeyPress-Right>", self.move_right)
        self.gamerootCanvas.bind_all("<KeyRelease-Right>", self.move_right_stop)
        self.gamerootCanvas.bind_all("<KeyPress-Left>", self.move_left)
        self.gamerootCanvas.bind_all("<KeyRelease-Left>", self.move_left_stop)
        self.gamerootCanvas.bind_all("<KeyPress-Up>", self.jump_)
        self.gamerootCanvas.bind_all("<KeyRelease-Up>", self.jump_stop)
        self.jump_counter = 0
        self.move_counter = 0

    def move_player(self):
        self.gamerootCanvas.move(self.id, self.x, self.y)
        pos = self.gamerootCanvas.coords(self.id)
        self.y += self.gravity

        if pos[0] <= 0:
            self.x = 1

        elif pos[2] >= self.gamerootCanvas_width:
            self.x = -1

        elif pos[1] <= 0:
            self.y = 1

        elif pos[3] >= self.gamerootCanvas_height:
            self.y = 0

        elif self.brick_hit(pos) == True:
            self.y = 0

    def move_right(self, evt):
        self.x = 2

    def move_right_stop(self, evt):
        self.x = 0

    def move_left(self, evt):

        self.x = -2

    def move_left_stop(self, evt):
        self.x = 0

    def jump_(self, evt):
        if self.jump_counter < 2:
            self.y = -6
            self.jump_counter += 2

    def jump_stop(self, evt):
        self.y = 0
        self.jump_counter = 0

    def brick_hit(self, pos):
        for brick_line in self.bricks:
            for brick in brick_line:
                brick_pos = self.gamerootCanvas.coords(brick.id)
                try:
                    if pos[3] > brick_pos[1]:
                        if pos[2] > brick_pos[0] and pos[0] < brick_pos[2]:
                            return True
                except:
                    continue
        return False

class Bricks1:
    def __init__(self, gamerootCanvas, color):
        self.gamerootCanvas = gamerootCanvas
        self.id = gamerootCanvas.create_rectangle(50, 15, 0, 0, fill=color, width=2)
        self.gamerootCanvas.move(self.id, 5, 700)

def generate_bricks():
    global bricks
    bricks = []
    for i in range(0, 1):
        b = []
        for j in range(0, 14):
            Bricks_1 = Bricks1(gamerootCanvas, "Blue")
            b.append(Bricks_1)
        bricks.append(b)
    for i in range(0, 1):
        for j in range(0, 14):
            gamerootCanvas.move(bricks[i][j].id, 158.2 * j, 40 * i)

generate_bricks()

player1 = Player(gamerootCanvas, bricks, "Red")

while True:
    gameroot.update_idletasks()
    player1.move_player()
    gameroot.update()
    gameroot.after(5)

play_gameloop_sound()
gameUI.mainloop()
python canvas tkinter collision-detection tkinter-canvas
1个回答
0
投票

你应该把自己从砖块上移开以防止卡住。当在砖上休息时,你也应该改变状态以防止抖动。

© www.soinside.com 2019 - 2024. All rights reserved.