Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 21, 2016 15:20:48

tibeg
Зарегистрирован: 2016-09-21
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Игра пинг-понг в Tkinter. Ошибка с отскакиванием объекта

Привет. Начал изучать python и появилось желание написать игру, пишу по гайду, но с небольшими изменениям, но столкнулся с проблемой - отскок мяча от ракетки. Не могу понять где ошибка и почему он не меняет свою скорость на противоположную и не двигается в обратную сторону.
Привожу код:

 from tkinter import *
WIDTH  = 900 #ширина
HEIGHT = 300 #высота
# по горизонтали
BALL_X_CHANGE = 20
# по вертикали
BALL_Y_CHANGE = 0
PAD_SPEED = 15 #скорость движения ракетки
LEFT_PAD_SPEED = 0 #скорость левой ракетки
RIGHT_PAD_SPEED = 0 #скорость правой ракетки
INITIAL_SPEED = 20
BALL_MAX_SPEED = 40 # Начальная скорость по горизонтали
BALL_X_SPEED = INITIAL_SPEED # Начальная скорость по вертикали
BALL_Y_SPEED = 0 # Добавим глобальную переменную отвечающую за расстояние
right_line_distance = WIDTH-30 # до правого края игрового поля
root = Tk()
c = Canvas(root,width=WIDTH,height=HEIGHT,background="#003300") #игровая область
c.pack()
c.create_line(WIDTH/2,0,WIDTH/2,HEIGHT,fill="white") #центральная линия
c.create_line(30,0,30,HEIGHT,fill="white") #левая линия
c.create_line(WIDTH-30,0,WIDTH-30,HEIGHT,fill="white") #правая линия
BALL = c.create_oval(WIDTH/2-15,HEIGHT/2-15,WIDTH/2+15,HEIGHT/2+15,fill="white")  #создаем мяч
LEFT_PAD = c.create_line(15,0,15,100,width=30,fill="blue") #создаем левую ракетку
RIGHT_PAD = c.create_line(WIDTH-15,0,WIDTH-15,100,width=30,fill="blue") #создаем правую ракетку
def move_ball(): #функция движения мяча
    ball_left, ball_top, ball_right, ball_bot = c.coords(BALL) #получил координаты мяча
    ball_center = (ball_top + ball_bot) / 2 #нашел координату центра мяча
    
    if ball_right < right_line_distance and ball_left > 30: #проверяем не достиг ли шмяч границ поля, если нет то просто двигаем
        c.move(BALL, BALL_X_SPEED, BALL_Y_SPEED)
    elif ball_right == right_line_distance or ball_left == 30: #если шар достигает границ левого или правого полей то
        if ball_right > WIDTH/2: #проверяем находится ли он на правой стороне
             if c.coords(LEFT_PAD)[1] < ball_center < c.coords(LEFT_PAD)[3]: #проверяем находится ли мяч в пределах правой ракетки
                 c.move(BALL,-BALL_X_SPEED,BALL_Y_SPEED) #то меняем скорость на противоположную
                 
                             
def move_pads(): #функция движения ракеток
    c.move(LEFT_PAD, 0, LEFT_PAD_SPEED)
    if c.coords(LEFT_PAD)[1] < 0:
        c.move(LEFT_PAD, 0, -c.coords(LEFT_PAD)[1])
    elif c.coords(LEFT_PAD)[3] > HEIGHT:
        c.move(LEFT_PAD, 0, HEIGHT-c.coords(LEFT_PAD)[3])
      
    c.move(RIGHT_PAD, 0, RIGHT_PAD_SPEED)
    if c.coords(RIGHT_PAD)[1] < 0:
        c.move(RIGHT_PAD, 0, -c.coords(RIGHT_PAD)[1])
    elif c.coords(RIGHT_PAD)[3] > HEIGHT:
        c.move(RIGHT_PAD, 0, HEIGHT-c.coords(RIGHT_PAD)[3])
                
def main():
    move_ball()
    move_pads()
    root.after(30, main)
c.focus_set()
def movement_handler(event): #функция считывания нажатий клавиш
    global LEFT_PAD_SPEED,RIGHT_PAD_SPEED
    if event.keysym == 'w':
        LEFT_PAD_SPEED = -PAD_SPEED
    elif event.keysym == 's':
        LEFT_PAD_SPEED = PAD_SPEED
    elif event.keysym == 'Up':
        RIGHT_PAD_SPEED = -PAD_SPEED
    elif event.keysym == 'Down':
        RIGHT_PAD_SPEED = PAD_SPEED
c.bind("<KeyPress>", movement_handler)
def stop_pad(event): #функция считывания отпускания клавиш
    global RIGHT_PAD_SPEED,LEFT_PAD_SPEED
    if event.keysym == 'w':
        LEFT_PAD_SPEED = 0
    elif event.keysym == 's':
        LEFT_PAD_SPEED = 0
    elif event.keysym == 'Up':
        RIGHT_PAD_SPEED = 0
    elif event.keysym == 'Down':
        RIGHT_PAD_SPEED = 0
c.bind("<KeyRelease>", stop_pad)
          
main()
root.mainloop()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version