Tkinter прыгать и запускать игру холст объекта столкновения - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь написать небольшую игру Jump´n´Run в tkinter с canvas и пока она работает довольно хорошо, но у меня проблема в том, что я не могу обернуть голову.

Посмотрите на эти три изображения : на первом столкновение работает нормально - я могу прыгать с одного весла на другое.

На втором изображении вы можете видеть, что всякий раз, когда я попадаю подона не падает, и подпрыгивать тоже невозможно, вероятно, потому что у меня 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()

1 Ответ

0 голосов
/ 12 марта 2019

Вы должны отвести себя от кирпича, чтобы не застрять.Опираясь на кирпич, вы также должны иметь измененное состояние, чтобы предотвратить дрожание.

...