Python Forum

Full Version: Tkinter platformer game
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I'm trying to create a platformer with tkinter,
i've created the character and now i'm trying to create a dynamic background with a biomes system so when the player passes from a biome to another the background changes the image.
from tkinter import *
from PIL import Image, ImageTk
from random import *

current_image = None
path_img_1 = "assets/background/notte.png"  # images path
path_img_2 = "assets/background/Hills Layer 01.png"


def move_oval(oval, canvas, master, increase=2):  # move the ball
    x1, y1, x2, y2 = canvas.coords(oval)
    if x1 <= 0:
        increase = 2
    elif x2 >= canvas_width:
        increase = -2
    x1 += increase
    x2 += increase
    canvas.coords(oval, x1, y1, x2, y2)
    master.after(10, lambda: move_oval(oval, canvas, master, increase=increase))


def resize_image(width, height, path_image):  # create image from the paths and resize them
    image = Image.open(path_image)
    img_copy = image.copy()
    image = img_copy.resize((width, height))
    return image


def change_image(to_configure, img_to_change, new_image,master, canvas, alpha=0.0, image=None):  # chenge gradually two     images
    global current_image

    if alpha > 1:  # if alpha is > 1 the the cycle stops
        current_image = image
        return
    else:
        new_img = Image.blend(img_to_change, new_image, alpha)  # it modify a bit the image ( depends to the alpha value )
        modifying_image = ImageTk.PhotoImage(new_img)  # create a Photoimage from the modified image
        image = modifying_image
        canvas.itemconfigure(to_configure, image=modifying_image)  # modify the canvas object with the new Photoimage
        canvas.update()  # update the canvas
        master.after(50, lambda: change_image(to_configure, img_to_change, new_image, master, canvas,alpha=alpha + 0.2, image=image))  # call again the cycle with alpha increased by 0.2

master = Tk()
monitor_width = master.winfo_screenwidth()
monitor_height = master.winfo_screenheight()
canvas_width = monitor_width
canvas_height = monitor_height
x = (monitor_width / 2) - (canvas_width // 2)
y = (monitor_height / 2) - (canvas_height // 2)
master.geometry('%dx%d+%d+%d' % (canvas_width + 4, canvas_height + 4, x, y))
master.title("My game")
canvas = Canvas(master, width=canvas_width, height=canvas_height, bg="black")
canvas.place(x=0)


img_1 = resize_image(canvas_width, canvas_height, path_img_1)  # resize the    images
img_2 = resize_image(canvas_width, canvas_height, path_img_2)

img = ImageTk.PhotoImage(img_1)
image_keeper = img

canvas_image = canvas.create_image(0, 0, image=img, anchor=NW)

oval = canvas.create_oval(350, 340, 370, 360, fill="red")
move_oval(oval, canvas, master)

button = Button(canvas, text="change image", command=lambda: change_image(to_configure=canvas_image, img_to_change=img_1, new_image=img_2, master=master, canvas=canvas, alpha=0.0, image=None))
button.place(x=0)

master.mainloop()
here is an executable example for my issue.
The problem is that when the player changes biome the game call a function that modify the background image and while the image is changing huge lag starts in all the game elements
(it took a few seconds for change the image), i thought to use threading but don't know how to implement it for solve my issue. In the example the is not so much lag becouse the background image is only 1 but in my game i have 3 background images that are changed at the same time and the lag increase much. There are simpliest way for do this or something that i can do for solve it?
Since def change_image is causing a slow down.
You might consider creating images at load time and storing them in a list.
Instead of recreating them during main loop.
More code the main loop handles the slower it will run.

Learning Python Profilers would let you know. What code is using the most time.