import tkinter as tk from PIL import Image,ImageTk import random import threading import time from world import World RENDER_WIDTH, RENDER_HEIGHT = 640 // 32 + 1, 480 // 32 + 1 FPS = 20 class Camera: def __init__(self, x: int, y: int): self.x: int = x self.y: int = y class Renderer: def render(self): offset_x, offset_y = self.camera.x % 32, self.camera.y % 32 index = 0 self.world.update_chunks(self.camera.x // 32, self.camera.y // 32) for tile in self.tiles: self.canvas.moveto(tile, 32 * (index % RENDER_WIDTH)- offset_x, 32 * (index // RENDER_WIDTH) - offset_y) self.canvas.itemconfig(tile, image=self.sprites[self.world.get_block( self.camera.x // 32 + index % RENDER_WIDTH, self.camera.y // 32 + index // RENDER_WIDTH ).id]) index += 1 pass def update_thread(self): while self.running: self.render() self.camera.x += 8 time.sleep(1 / FPS) pass def __init__(self): self.running = True self.window = tk.Tk() self.window.title("MC 2D") self.window.geometry("640x480") self.camera = Camera(90 * 32, 90 * 32) self.world = World(self.camera.x // 32, self.camera.y // 32) self.sprites = [ "sprites/air.png", "sprites/stone.png", "sprites/dirt.png", "sprites/grass.png" ] self.sprites = [ ImageTk.PhotoImage(Image.open(sprite)) for sprite in self.sprites ] self.canvas = tk.Canvas(self.window, width=640, height=480, background="white") self.canvas.pack() self.tiles = [ self.canvas.create_image(32 * (i % RENDER_WIDTH) - 16, 32 * (i // RENDER_WIDTH) - 16, anchor="nw", image=self.sprites[random.randint(0, len(self.sprites) - 1)]) for i in range(RENDER_WIDTH * RENDER_HEIGHT) ] self.tupdate = threading.Thread(target=self.update_thread) self.tupdate.start() self.window.mainloop() self.running = False