view scripts/level-editor @ 634:20d6aef11249 default tip

Fix iCCC profiles in PNGs to avoid verbose warnings from libpng.
author Simon Cross <hodgestar@gmail.com>
date Fri, 27 Jan 2023 23:32:07 +0100
parents 5d59238f8996
children
line wrap: on
line source

#!/usr/bin/env python
"Skaapsteker level editor"

from __future__ import division

import optparse
import os.path
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))

import pygame
import pygame.key
from pygame.locals import (SWSURFACE, QUIT, KEYDOWN, K_UP, K_DOWN, K_LEFT,
                           K_RIGHT, KMOD_SHIFT, K_q, K_ESCAPE)

from skaapsteker.constants import SCREEN
from skaapsteker.level import DebugLevel
from skaapsteker.sprites.player import Player
from skaapsteker.widgets.text import Text
from skaapsteker.gamestate import GameState
from skaapsteker.sound import SoundSystem
from skaapsteker.data import filepath

FRAMERATE = 60

def run(levelname):
    clock = pygame.time.Clock()
    screen_surface = pygame.display.get_surface()
    game = GameState(None)
    game.load_game(filepath("game.json"))
    player = Player(game.world, SoundSystem(False))
    level = DebugLevel(levelname, player)
    level_surface = level.get_surface()
    position = [0, 0]
    fpss = [FRAMERATE]
    while True:
        events = pygame.event.get()
        for ev in events:
            if ev.type is QUIT:
                return
            elif ev.type is KEYDOWN:
                distance = 64
                if ev.mod & KMOD_SHIFT != 0:
                    distance *= 10
                if ev.key == K_UP:
                    position[1] -= distance
                elif ev.key == K_DOWN:
                    position[1] += distance
                elif ev.key == K_LEFT:
                    position[0] -= distance
                elif ev.key == K_RIGHT:
                    position[0] += distance
                elif ev.key in (K_q, K_ESCAPE):
                    return

        position[0] = max(position[0], 0)
        position[0] = min(position[0], level.pixel_size[0] - SCREEN[0])
        position[1] = max(position[1], 0)
        position[1] = min(position[1], level.pixel_size[1] - SCREEN[1])

        clip_rect = pygame.Rect(position, screen_surface.get_size())
        level_surface.set_clip(clip_rect)
        level.draw(level_surface)
        level.sprites.draw(level_surface)
        screen_surface.blit(level_surface, (0, 0), clip_rect)

        tilepos = (position[0] // 64, position[1] // 64)
        text = Text("Level: %s.\nOffset: %r Tile: %r\nFPS: %.1f"
                    % (levelname, position, tilepos, sum(fpss)/len(fpss)),
                    (10, 10),
                    color='white')
        text.draw(screen_surface)

        pygame.display.flip()
        fpss = (fpss + [1000 / clock.tick(FRAMERATE)])[-FRAMERATE:]

def main():
    p = optparse.OptionParser(usage="%prog [options] levelname")
    opts, args = p.parse_args()
    if len(args) != 1:
        p.error("Must provide level name")
    pygame.display.init()
    pygame.font.init()
    pygame.display.set_mode(SCREEN, SWSURFACE)
    pygame.display.set_caption("Skaapsteker Level Editor")
    pygame.key.set_repeat(100, 20)
    run(args[0])

if __name__ == '__main__':
    main()