RoRo
RoRo

Reputation: 31

Trying to move paddle up and down

I am making a one man pong game and I got everything except for moving the paddle up and down and I don't really understand how to do it can someone help. Is it something to do with the "pos" or is it something to do it with the syntax of the lines. The part where it controls the movements of the paddles is def move paddle

import tkinter

# steps
# ball diagonal
# paddle draw
# paddle animation with keyboard (right/left) -> challenge up/down
# collisions (if time)

# graphic parameters
canvas_width = 400
canvas_height = 500
ball_size = 30
timer_refresh = 20
paddle_width = 100
paddle_height = 20

# ball movement
y_move = 2
x_move = 2
# paddle movement
paddle_speed = 6

# game_state
game_running = True

def end_game():
    global game_running

    game_running = False
    canvas.create_text(canvas_width/2, canvas_height/2, text="you lost!")

# move paddle when key is pressed
def move_paddle(event):
    key_symbol = event.keysym
    print(key_symbol)
    pos = canvas.coords(paddle)
    left = pos[0]
    right = pos[2]
    up = pos[1]
    down = pos[3]
    if key_symbol == "Left" and left > 0:
        canvas.move(paddle, -paddle_speed, 0)
    elif key_symbol == "Right" and right <= canvas_width:
        canvas.move(paddle, paddle_speed, 0)
    # move paddle up
    elif key_symbol == "Up" and up >= 0:
        canvas.move(paddle, paddle_speed, 0)
    # move paddle down
    elif key_symbol == "Down" and down <= canvas_width:
        canvas.move(paddle, paddle_speed, 0)*

def collision(ball_pos):
    overlap_result = canvas.find_overlapping(ball_pos[0],ball_pos[1],ball_pos[2],ball_pos[3])
    if paddle in overlap_result:
        return True;
    else:
        return False;


# draw/move ball
def draw():
    global y_move, x_move
    canvas.move(ball1, x_move, y_move)
    pos = canvas.coords(ball1)
    top_y = pos[1]
    bottom_y = pos[3]
    left = pos[0]
    right = pos[2]
    if top_y <= 0:
        y_move = -y_move
    elif bottom_y >= canvas_height-5:
        y_move = -y_move
        end_game()
    # did I hit left or right wall?
    elif left <= 0 or right >= canvas_width-5:
        x_move = -x_move

    # did I collide with the paddle? if so bounce vertically
    if collision(pos):
        y_move = -y_move

# animation timer
def master_timer():
    # draw/move ball
    draw()
    # tkinter processing
    tk.update_idletasks()
    tk.update()
    if game_running:
        tk.after(timer_refresh, master_timer)

tk = tkinter.Tk()
tk.title("Simplified Pong")
# block resizing window
tk.resizable(0,0)

# drawing the canvasd
canvas = tkinter.Canvas(tk, width=canvas_width, height=canvas_height, bd=0, highlightthickness=0)
canvas.pack()
ball1 = canvas.create_oval(0, 0, ball_size, ball_size, fill="red")
canvas.move(ball1, canvas_width/2, canvas_height/2)

paddle = canvas.create_rectangle(0,0,paddle_width, paddle_height, fill="black")
canvas.move(paddle, canvas_width/2, canvas_height/1.2)


canvas.bind_all("<KeyPress-Right>", move_paddle)
canvas.bind_all("<KeyPress-Left>", move_paddle)
canvas.bind_all("<KeyPress-Up>", move_paddle)
canvas.bind_all("<KeyPress-Down>", move_paddle)
master_timer()
tk.mainloop()

Upvotes: 0

Views: 248

Answers (1)

Delrius Euphoria
Delrius Euphoria

Reputation: 15098

The problem is quite simple if you refer to the docs of move method, for tkinter, or have an understanding of how to use it. From the docs:

.move(tagOrId, xAmount, yAmount) Moves the items specified by tagOrId by adding xAmount to their x coordinates and yAmount to their y coordinates.

So if you notice, it takes the x coords first and then the y coords. So when you want to translate(move) upon the y axis(up and down), you want to alter the y axis argument, but instead you are doing it for the x axis. So you have to pass the variable onto the correct parameter only.

elif key_symbol == "Up" and up >= 0:
    canvas.move(paddle, 0, -paddle_speed)
# move paddle down
elif key_symbol == "Down" and down <= canvas_width:
    canvas.move(paddle, 0, paddle_speed)

Also note that you can get rid of all the key binds and just keep a single general bind, because inside your function, you are already getting the key that is pressed dynamically, so it doesn't make much sense to bind to all possible keys:

canvas.bind_all("<KeyPress>", move_paddle) # Instead of Up, Down, Left and Right

Also another tip is, you can take advantage of * to pass the contents of the iterable as the argument to the function:

canvas.find_overlapping(*ball_pos) # Instead of ball_pos[0] and so on

Upvotes: 2

Related Questions