|
|
|
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("<Key>", self.key_press)
|
|
|
|
self.window.bind("<KeyRelease>", self.key_release)
|
|
|
|
|
|
|
|
self.window.mainloop()
|
|
|
|
self.running = False
|