import tkinter as tk from PIL import Image,ImageTk import random import threading import time from world import World import sys 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 key_press(self, event: tk.Event): if event.keysym == "Escape": self.running = False self.keys[event.keysym] = True def key_release(self, event: tk.Event): if event.keysym in self.keys: self.keys[event.keysym] = False def is_down(self, key): if not (key in self.keys): return 0 return 1 if self.keys[key] else 0 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 def update(self): move_x = self.is_down("Right") - self.is_down("Left") move_y = self.is_down("Down") - self.is_down("Up") self.camera.x += move_x * 10 self.camera.y += move_y * 10 def update_thread(self): while self.running: self.update() self.render() time.sleep(1 / FPS) 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.keys = {} self.sprites = [ "sprites/air.png", "sprites/stone.png", "sprites/dirt.png", "sprites/grass.png", "sprites/coal.png", "sprites/iron.png", "sprites/gold.png", "sprites/diamond.png", "sprites/log.png", "sprites/leaf.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.bind("", self.key_press) self.window.bind("", self.key_release) self.window.mainloop() self.running = False