You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
5.4 KiB
Python
168 lines
5.4 KiB
Python
1 year ago
|
# Imports
|
||
|
import pygame
|
||
|
import pickle
|
||
|
from os import path
|
||
|
# Set Up
|
||
|
pygame.init()
|
||
|
fps = 60
|
||
|
clock = pygame.time.Clock()
|
||
|
tile_size = 48
|
||
|
cols = 35
|
||
|
margin = 100
|
||
|
screen_width = tile_size * cols
|
||
|
screen_height = 900 + margin
|
||
|
screen = pygame.display.set_mode((screen_width, screen_height))
|
||
|
pygame.display.set_caption('Level Editor')
|
||
|
clicked = False
|
||
|
level = 1
|
||
|
white = (255, 255, 255)
|
||
|
black = (0, 0, 0)
|
||
|
font = pygame.font.SysFont('Futura', 24)
|
||
|
#load images
|
||
|
background = pygame.image.load('images/background_editor.png')
|
||
|
left = pygame.image.load("images/left.png")
|
||
|
middle = pygame.image.load('images/middle.png')
|
||
|
right = pygame.image.load("images/right.png")
|
||
|
water = pygame.image.load('images/water1.png')
|
||
|
enemy = pygame.image.load('images/enemy.png')
|
||
|
door = pygame.image.load('images/door.png')
|
||
|
button_save = pygame.image.load('images/button_save.png')
|
||
|
button_load = pygame.image.load('images/button_load.png')
|
||
|
button_exit = pygame.image.load("images/button_exit.png")
|
||
|
# Create Empty World
|
||
|
world_data = []
|
||
|
for row in range(35):
|
||
|
r = [0] * 35
|
||
|
world_data.append(r)
|
||
|
# Output Text
|
||
|
def draw_text(text, font, text_col, x, y):
|
||
|
img = font.render(text, True, text_col)
|
||
|
screen.blit(img, (x, y))
|
||
|
# Grid
|
||
|
def draw_vertical():
|
||
|
for c in range(36):
|
||
|
# Vertical Lines
|
||
|
pygame.draw.line(screen, white, (c * tile_size, 0), (c * tile_size, screen_height - margin -36))
|
||
|
def draw_horizontal():
|
||
|
for c in range(19):
|
||
|
# Horizontal Lines
|
||
|
pygame.draw.line(screen, white, (0, c * tile_size), (screen_width, c * tile_size))
|
||
|
# Draw World
|
||
|
def draw_world():
|
||
|
for row in range(18):
|
||
|
for column in range(35):
|
||
|
if world_data[row][column] > 0:
|
||
|
# Left
|
||
|
if world_data[row][column] == 1:
|
||
|
image = pygame.transform.scale(left, (tile_size, tile_size))
|
||
|
screen.blit(image, (column * tile_size, row * tile_size))
|
||
|
# Middle
|
||
|
elif world_data[row][column] == 2:
|
||
|
image = pygame.transform.scale(middle, (tile_size, tile_size))
|
||
|
screen.blit(image, (column * tile_size, row * tile_size))
|
||
|
# Right
|
||
|
if world_data[row][column] == 3:
|
||
|
image = pygame.transform.scale(right, (tile_size, tile_size))
|
||
|
screen.blit(image, (column * tile_size, row * tile_size ))
|
||
|
# Water
|
||
|
elif world_data[row][column] == 4:
|
||
|
image = pygame.transform.scale(water, (tile_size, tile_size))
|
||
|
screen.blit(image, (column * tile_size, row * tile_size))
|
||
|
# Enemy
|
||
|
if world_data[row][column] == 5:
|
||
|
image = pygame.transform.scale(enemy, (tile_size, int(tile_size * 0.75)))
|
||
|
screen.blit(image, (column * tile_size, row * tile_size + (tile_size * 0.25)))
|
||
|
# Door
|
||
|
if world_data[row][column] == 6:
|
||
|
image = pygame.transform.scale(door, (tile_size, int(tile_size * 0.75)))
|
||
|
screen.blit(image, (column * tile_size, row * tile_size + (tile_size * 0.25)))
|
||
|
# Button Class
|
||
|
class Button():
|
||
|
# Init
|
||
|
def __init__(self, x, y, image):
|
||
|
self.image = image
|
||
|
self.images = pygame.transform.scale(image, (100,55))
|
||
|
self.rect = self.images.get_rect()
|
||
|
self.rect.topleft = (x, y)
|
||
|
self.clicked = False
|
||
|
# Draw
|
||
|
def draw(self):
|
||
|
self.clicked = False
|
||
|
pos = pygame.mouse.get_pos()
|
||
|
if self.rect.collidepoint(pos):
|
||
|
if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
|
||
|
self.clicked = True
|
||
|
screen.blit(self.images, (self.rect.x, self.rect.y))
|
||
|
return self.clicked
|
||
|
# Scale and Initialise Classes
|
||
|
background = pygame.transform.scale(background, (1750,865))
|
||
|
load_button = Button(screen_width // 2 - 330, screen_height - 95, button_load)
|
||
|
save_button = Button(screen_width // 2 - 50, screen_height - 95, button_save)
|
||
|
exit_button = Button(screen_width // 2 + 250, screen_height - 95, button_exit)
|
||
|
# Game Loop
|
||
|
run = True
|
||
|
while run:
|
||
|
# Clock
|
||
|
clock.tick(fps)
|
||
|
# Background
|
||
|
screen.fill(black)
|
||
|
screen.blit(background, (0, 0))
|
||
|
# Grid
|
||
|
draw_vertical()
|
||
|
draw_horizontal()
|
||
|
draw_world()
|
||
|
#text showing current level
|
||
|
draw_text(f'Level: {level}', font, white, tile_size, screen_height - 80)
|
||
|
draw_text('Press W or S to change level', font, white, tile_size, screen_height - 60)
|
||
|
# Load Button
|
||
|
if load_button.draw():
|
||
|
#load in level data
|
||
|
if path.exists(f'levels/custom/level_{level}'):
|
||
|
pickle_in = open(f'levels/custom/level_{level}', 'rb')
|
||
|
world_data = pickle.load(pickle_in)
|
||
|
else:
|
||
|
pickle_out = open(f'levels/custom/level_{level}', 'wb')
|
||
|
pickle.dump(world_data, pickle_out)
|
||
|
pickle_out.close()
|
||
|
# Save Button
|
||
|
if save_button.draw():
|
||
|
pickle_out = open(f'levels/custom/level_{level}', 'wb')
|
||
|
pickle.dump(world_data, pickle_out)
|
||
|
pickle_out.close()
|
||
|
# Exit Button
|
||
|
if exit_button.draw():
|
||
|
run = False
|
||
|
# Event Handler
|
||
|
for event in pygame.event.get():
|
||
|
# Quit Game
|
||
|
if event.type == pygame.QUIT:
|
||
|
run = False
|
||
|
# Clicks To Chnage Tiles
|
||
|
if event.type == pygame.MOUSEBUTTONDOWN and clicked == False:
|
||
|
clicked = True
|
||
|
mouse_position = pygame.mouse.get_pos()
|
||
|
x = mouse_position[0] // tile_size
|
||
|
y = mouse_position[1] // tile_size
|
||
|
# Check That The Coordinates Are Within The Tile Area
|
||
|
if x < 35 and y < 18:
|
||
|
# Update Tile Value
|
||
|
if pygame.mouse.get_pressed()[0] == 1:
|
||
|
world_data[y][x] += 1
|
||
|
if world_data[y][x] > 6:
|
||
|
world_data[y][x] = 0
|
||
|
elif pygame.mouse.get_pressed()[2] == 1:
|
||
|
world_data[y][x] -= 1
|
||
|
if world_data[y][x] < 0:
|
||
|
world_data[y][x] = 6
|
||
|
if event.type == pygame.MOUSEBUTTONUP:
|
||
|
clicked = False
|
||
|
# Change Level
|
||
|
if event.type == pygame.KEYDOWN:
|
||
|
if event.key == pygame.K_w:
|
||
|
level += 1
|
||
|
elif event.key == pygame.K_s and level > 1:
|
||
|
level -= 1
|
||
|
#update game display window
|
||
|
pygame.display.update()
|
||
|
# Quit Pygame
|
||
|
pygame.quit()
|