Прыгающий мяч игра ткинтер холст - PullRequest
2 голосов
/ 07 февраля 2020

Я пишу игру на python, в которой цель - отскочить мяч от платформы. Все работает довольно хорошо, но движение платформы не так гладко. Не могли бы вы помочь мне сделать движение платформы более плавным? Если код не слишком понятен, извините, но я новичок в python

import tkinter as tk
import random

root = tk.Tk()

width = 900
height = 500

canvas = tk.Canvas(root, bg='white', width=width, height=height)
canvas.pack()

x = random.randrange(700)

ball = canvas.create_oval(x+10, 10, x+50, 50, fill='green')

platform_y = height - 20
platform = canvas.create_rectangle(width//2-50, platform_y, width//2+50, platform_y+10, fill='black')

xspeed = 2
yspeed = 2
skore = 0
body = 0

def move_ball():
  global xspeed
  global yspeed
  x1, y1, x2, y2 = canvas.coords(ball)
  if x1 <= 0 or x2 >= width:
    xspeed = -xspeed
  if y1 <= 0:
    yspeed = 10
  elif y2 == platform_y: 
    cx = (x1 + x2) // 2
    px1, _, px2, _ = canvas.coords(platform)
    if px1 <= cx <= px2:
      yspeed = -10
    else:
      canvas.create_text(width//2, height//2, text='Game Over', font=('Arial Bold', 32), fill='red')
      return
  canvas.move(ball, xspeed, yspeed)
  canvas.after(20, move_ball)

def board_right(event):
  x1, y1, x2, y2 = canvas.coords(platform) 
  if x2 < width:
    dx = min(width-x2, 10)
    canvas.move(platform, dx, 0)

def board_left(event):
  x1, y1, x2, y2 = canvas.coords(platform)
  if x1 > 0:
    dx = min(x1, 10)
    canvas.move(platform, -dx, 0)

canvas.bind_all('<Right>', board_right)
canvas.bind_all('<Left>', board_left)

move_ball()

root.mainloop()

1 Ответ

1 голос
/ 07 февраля 2020

Проблема в том, что скорость платформы зависит от скорости автоматического повторения вашей клавиатуры.

Вместо того, чтобы двигаться один раз для каждого события <Right> или <Left>, используйте нажатие клавиши, чтобы Запустите платформу в нужном направлении и отпустите кнопку, чтобы остановить движение платформы. Затем используйте after для многократного перемещения платформы в заданном направлении.

Пример:

after_id = None
def platform_move(direction):
    """
    direction should be -1 to move left, +1 to move right,
    or 0 to stop moving
    """
    global after_id
    speed = 10
    if direction == 0:
        canvas.after_cancel(after_id)
        after_id = None
    else:
        canvas.move(platform, direction*speed, 0)
        after_id = canvas.after(5, platform_move, direction)

canvas.bind_all("<KeyPress-Right>", lambda event: platform_move(1))
canvas.bind_all("<KeyRelease-Right>", lambda event: platform_move(0))
canvas.bind_all("<KeyPress-Left>", lambda event: platform_move(-1))
canvas.bind_all("<KeyRelease-Left>", lambda event: platform_move(0))

Приведенный выше код не обрабатывает случай, когда вы можете нажать обе клавиши на в то же время, но это можно сделать с помощью небольшого дополнительного логика c. Суть в том, чтобы показать, как вы можете использовать клавиши для запуска и остановки анимации.

...