2026-03-05 14:13:43 +00:00
import pygame
import sys
from scripts . tilemap import *
from scripts . clouds import Clouds
from scripts . utils import load_images
RENDER_SCALE = 2.0
class better_list ( list ) :
def __init__ ( self , iterable ) :
super ( ) . __init__ ( iterable )
class Editor :
def __init__ ( self ) :
pygame . init ( )
pygame . display . set_caption ( " Editor " )
self . screen = pygame . display . set_mode ( ( 640 , 480 ) )
self . display = pygame . Surface ( ( 320 , 240 ) )
self . clock = pygame . time . Clock ( )
self . running = True
self . collision_area = pygame . Rect ( 50 , 50 , 300 , 50 )
self . movement = [ False , False , False , False ]
2026-04-17 16:04:33 +00:00
2026-03-05 14:13:43 +00:00
self . assets = {
" decor " : load_images ( " tiles/decor " ) ,
" grass " : load_images ( " tiles/grass " ) ,
" large_decor " : load_images ( " tiles/large_decor " ) ,
" stone " : load_images ( " tiles/stone " ) ,
}
self . tilemap = Tilemap ( self , 16 )
2026-04-17 16:04:33 +00:00
try :
self . tilemap . load ( ' map.json ' )
except FileNotFoundError :
pass
2026-03-05 14:13:43 +00:00
self . isJumping = False
self . scroll = [ 0 , 0 ]
self . tile_list = better_list ( self . assets )
self . tile_group = 0
self . tile_variant = 0
self . clicking = False
self . right_clicking = False
self . shifting = False
self . sekunde = 60
self . zaehler = 0
2026-04-17 16:04:33 +00:00
self . on_grid = True
2026-03-05 14:13:43 +00:00
def run ( self ) :
while self . running :
self . display . fill ( ( 0 , 0 , 0 ) )
2026-04-17 16:04:33 +00:00
self . scroll [ 0 ] + = ( self . movement [ 1 ] - self . movement [ 0 ] ) * 3
self . scroll [ 1 ] + = ( self . movement [ 3 ] - self . movement [ 2 ] ) * 3
render_scroll = ( int ( self . scroll [ 0 ] ) , int ( self . scroll [ 1 ] ) )
self . tilemap . render ( surface = self . display , offset = render_scroll )
2026-03-05 14:13:43 +00:00
current_tile_img = self . assets [ self . tile_list [ self . tile_group ] ] [ self . tile_variant ] . copy ( )
current_tile_img . set_alpha ( 100 )
2026-04-17 16:04:33 +00:00
mpos = pygame . mouse . get_pos ( )
mpos = ( mpos [ 0 ] / RENDER_SCALE , mpos [ 1 ] / RENDER_SCALE )
tile_pos = ( int ( ( mpos [ 0 ] + self . scroll [ 0 ] ) / / self . tilemap . tile_size ) ,
int ( ( mpos [ 1 ] + self . scroll [ 1 ] ) / / self . tilemap . tile_size ) )
# print(tile_pos[0] * self.tilemap.tile_size + self.scroll[0], tile_pos[1]*self.tilemap.tile_size + self.scroll[1])
# print(mpos)
if self . on_grid :
self . display . blit ( current_tile_img , ( tile_pos [ 0 ] * self . tilemap . tile_size - self . scroll [ 0 ] , tile_pos [ 1 ] * self . tilemap . tile_size - self . scroll [ 1 ] ) )
else :
self . display . blit ( current_tile_img , ( mpos [ 0 ] , mpos [ 1 ] ) )
if self . clicking :
if self . on_grid :
self . tilemap . tilemap [ str ( tile_pos [ 0 ] ) + ' ; ' + str ( tile_pos [ 1 ] ) ] = {
' type ' : self . tile_list [ self . tile_group ] ,
' variant ' : self . tile_variant ,
' pos ' : tile_pos
}
if not self . on_grid :
self . tilemap . offgrid_tiles . append ( { " type " : self . tile_list [ self . tile_group ] , " variant " : self . tile_variant , " pos " : ( mpos [ 0 ] + self . scroll [ 0 ] , mpos [ 1 ] + self . scroll [ 1 ] ) } )
if self . right_clicking :
tile_loc = str ( tile_pos [ 0 ] ) + ' ; ' + str ( tile_pos [ 1 ] )
if tile_loc in self . tilemap . tilemap :
del self . tilemap . tilemap [ tile_loc ]
for offi_tile in self . tilemap . offgrid_tiles . copy ( ) :
offi_tile_img = self . assets [ offi_tile [ ' type ' ] ] [ offi_tile [ ' variant ' ] ]
offi_tile_r = pygame . Rect ( offi_tile [ " pos " ] [ 0 ] - self . scroll [ 0 ] , offi_tile [ " pos " ] [ 1 ] - self . scroll [ 1 ] , offi_tile_img . get_width ( ) , offi_tile_img . get_height ( ) )
if offi_tile_r . collidepoint ( mpos ) :
self . tilemap . offgrid_tiles . remove ( offi_tile )
2026-03-05 14:13:43 +00:00
self . display . blit ( current_tile_img , ( 5 , 5 ) )
for event in pygame . event . get ( ) :
if event . type == pygame . QUIT :
self . running = False
2026-04-17 16:04:33 +00:00
if event . type == pygame . MOUSEBUTTONUP :
if event . button == 1 : self . clicking = False
if event . button == 3 : self . right_clicking = False
2026-03-05 14:13:43 +00:00
if event . type == pygame . KEYDOWN :
2026-04-17 16:04:33 +00:00
2026-03-05 14:13:43 +00:00
if event . key == pygame . K_ESCAPE :
self . running = False
2026-04-17 16:04:33 +00:00
2026-03-05 14:13:43 +00:00
if event . key == pygame . K_a :
self . movement [ 0 ] = True
2026-04-17 16:04:33 +00:00
2026-03-05 14:13:43 +00:00
if event . key == pygame . K_d :
self . movement [ 1 ] = True
2026-04-17 16:04:33 +00:00
2026-03-05 14:13:43 +00:00
if event . key == pygame . K_w :
self . movement [ 2 ] = True
2026-04-17 16:04:33 +00:00
2026-03-05 14:13:43 +00:00
if event . key == pygame . K_s :
self . movement [ 3 ] = True
if event . key == pygame . K_LSHIFT :
self . shifting = True
2026-04-17 16:04:33 +00:00
if event . key == pygame . K_g :
self . on_grid = not self . on_grid
2026-03-05 14:13:43 +00:00
2026-04-17 16:04:33 +00:00
if event . key == pygame . K_o :
self . tilemap . save ( ' map.json ' )
print ( " Map gespeichert " )
if event . key == pygame . K_t :
self . tilemap . autotile ( )
2026-03-05 14:13:43 +00:00
if event . type == pygame . KEYUP :
if event . key == pygame . K_a :
self . movement [ 0 ] = False
if event . key == pygame . K_d :
self . movement [ 1 ] = False
if event . key == pygame . K_s :
self . movement [ 3 ] = False
if event . key == pygame . K_w :
self . movement [ 2 ] = False
if event . key == pygame . K_LSHIFT :
self . shifting = False
if event . type == pygame . MOUSEBUTTONDOWN :
if event . button == 1 :
self . clicking = True
if event . button == 3 :
self . right_clicking = True
if event . button == 4 :
if self . shifting :
if self . tile_variant > = len ( self . assets [ self . tile_list [ self . tile_group ] ] ) - 1 :
self . tile_variant = 0
else :
self . tile_variant + = 1
else :
if self . tile_group > = len ( self . tile_list ) - 1 :
self . tile_group = 0
self . tile_variant = 0
else :
self . tile_group + = 1
self . tile_variant = 0
if event . button == 5 :
if self . shifting :
if self . tile_variant < = 0 :
self . tile_variant = len ( self . assets [ self . tile_list [ self . tile_group ] ] ) - 1 # Lösung vom Problem musste das von oben nehmen: len(self.assets[self.tile_list[self.tile_group]])-1
else :
self . tile_variant - = 1
else :
if self . tile_group < = 0 :
self . tile_group = len ( self . tile_list ) - 1
self . tile_variant = 0
else :
self . tile_group - = 1
self . tile_variant = 0
self . zaehler + = 1
if self . zaehler > = self . sekunde :
self . zaehler = 0
2026-04-17 16:04:33 +00:00
# print(f"{self.tile_group} + {self.tile_variant}")
2026-03-05 14:13:43 +00:00
self . screen . blit ( pygame . transform . scale ( self . display , self . screen . get_size ( ) ) , ( 0 , 0 ) )
pygame . display . update ( )
self . clock . tick ( 60 )
pygame . quit ( )
sys . exit ( )
editor = Editor ( )
editor . run ( )