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
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
|