You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

69 lines
2.1 KiB

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