From 2e0d6d5245cbc81ca57e31879e152b1bfb539d59 Mon Sep 17 00:00:00 2001 From: bvs Date: Mon, 7 Oct 2013 12:58:26 +0600 Subject: [PATCH] new file: levels/1.txt modified: platformerhabrahabr.py --- levels/1.txt | 44 ++++++++++++++++++++ platformerhabrahabr.py | 92 ++++++++++++++++++++---------------------- 2 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 levels/1.txt diff --git a/levels/1.txt b/levels/1.txt new file mode 100644 index 0000000..de8a8e8 --- /dev/null +++ b/levels/1.txt @@ -0,0 +1,44 @@ +[ +----------------------------------| +- * -| +- * * P -| +---- *--** --| +- -- -| +- -| +- -| +- -| +-- ---- -| +- -| +-- -| +- ** -| +- --- -| +- -| +- -| +- --- -| +- -| +- -------- * ---- -| +- -| +- - -| +- ** -- -| +- * -| +- ** -| +--------------- *** -- -| +- -| +- -| +----------------------------------| +] + +player 55 44 + +portal 128 512 900 35 + +portal 170 512 700 64 + +monster 190 250 2 1 150 10 + +monster 190 400 2 3 150 150 + +monster 150 200 1 2 150 100 + + +/ diff --git a/platformerhabrahabr.py b/platformerhabrahabr.py index e2cfcc8..364fe6c 100644 --- a/platformerhabrahabr.py +++ b/platformerhabrahabr.py @@ -14,6 +14,8 @@ DISPLAY = (WIN_WIDTH, WIN_HEIGHT) # Группируем ширину и высоту в одну переменную BACKGROUND_COLOR = "#000000" +FILE_DIR = os.path.dirname(__file__) + class Camera(object): def __init__(self, camera_func, width, height): self.camera_func = camera_func @@ -35,55 +37,57 @@ def camera_configure(camera, target_rect): t = max(-(camera.height-WIN_HEIGHT), t) # Не движемся дальше нижней границы t = min(0, t) # Не движемся дальше верхней границы - return Rect(l, t, w, h) + return Rect(l, t, w, h) + + +def loadLevel(): + global playerX, playerY # объявляем глобальные переменные, это координаты героя + levelFile = open('%s/levels/1.txt' % FILE_DIR) + line = " " + commands = [] + while line[0] != "/": # пока не нашли символ завершения файла + line = levelFile.readline() #считываем построчно + if line[0] == "[": # если нашли символ начала уровня + while line[0] != "]": # то, пока не нашли символ конца уровня + line = levelFile.readline() # считываем построчно уровень + if line[0] != "]": # и если нет символа конца уровня + endLine = line.find("|") # то ищем символ конца строки + level.append(line[0: endLine]) # и добавляем в уровень строку от начала до символа "|" + + if line[0] != "": # если строка не пустая + commands = line.split() # разбиваем ее на отдельные команды + if len(commands) > 1: # если количество команд > 1, то ищем эти команды + if commands[0] == "player": # если первая команда - player + playerX= int(commands[1]) # то записываем координаты героя + playerY = int(commands[2]) + if commands[0] == "portal": # если первая команда portal, то создаем портал + tp = BlockTeleport(int(commands[1]),int(commands[2]),int(commands[3]),int(commands[4])) + entities.add(tp) + platforms.append(tp) + animatedEntities.add(tp) + if commands[0] == "monster": # если первая команда monster, то создаем монстра + mn = Monster(int(commands[1]),int(commands[2]),int(commands[3]),int(commands[4]),int(commands[5]),int(commands[6])) + entities.add(mn) + platforms.append(mn) + monsters.add(mn) def main(): + loadLevel() pygame.init() # Инициация PyGame, обязательная строчка screen = pygame.display.set_mode(DISPLAY) # Создаем окошко pygame.display.set_caption("Super Mario Boy") # Пишем в шапку bg = Surface((WIN_WIDTH,WIN_HEIGHT)) # Создание видимой поверхности # будем использовать как фон bg.fill(Color(BACKGROUND_COLOR)) # Заливаем поверхность сплошным цветом - - hero = Player(55,55) # создаем героя по (x,y) координатам + left = right = False # по умолчанию - стоим up = False running = False - - entities = pygame.sprite.Group() # Все объекты - animatedEntities = pygame.sprite.Group() # все анимированные объекты, за исключением героя - monsters = pygame.sprite.Group() # Все передвигающиеся объекты - platforms = [] # то, во что мы будем врезаться или опираться - + + hero = Player(playerX,playerY) # создаем героя по (x,y) координатам entities.add(hero) - level = [ - "----------------------------------", - "- -", - "- -- -", - "- * -", - "- -", - "- -- -", - "-- -", - "- P -", - "- ---- --- -", - "- -", - "-- -", - "- * -", - "- --- -", - "- -", - "- -", - "- * --- * -", - "- -", - "- ------- ---- -", - "- -", - "- - -", - "- -- -", - "- *** -", - "- -", - "----------------------------------"] - timer = pygame.time.Clock() x=y=0 # координаты for row in level: # вся строка @@ -102,21 +106,10 @@ def main(): platforms.append(pr) animatedEntities.add(pr) - x += PLATFORM_WIDTH #блоки платформы ставятся на ширине блоков y += PLATFORM_HEIGHT #то же самое и с высотой x = 0 #на каждой новой строчке начинаем с нуля - tp = BlockTeleport(128,512,800,64) - entities.add(tp) - platforms.append(tp) - animatedEntities.add(tp) - - mn = Monster(190,200,2,3,150,15) - entities.add(mn) - platforms.append(mn) - monsters.add(mn) - total_level_width = len(level[0])*PLATFORM_WIDTH # Высчитываем фактическую ширину уровня total_level_height = len(level)*PLATFORM_HEIGHT # высоту @@ -136,7 +129,6 @@ def main(): if e.type == KEYDOWN and e.key == K_LSHIFT: running = True - if e.type == KEYUP and e.key == K_UP: up = False if e.type == KEYUP and e.key == K_RIGHT: @@ -156,6 +148,10 @@ def main(): screen.blit(e.image, camera.apply(e)) pygame.display.update() # обновление и вывод всех изменений на экран - +level = [] +entities = pygame.sprite.Group() # Все объекты +animatedEntities = pygame.sprite.Group() # все анимированные объекты, за исключением героя +monsters = pygame.sprite.Group() # Все передвигающиеся объекты +platforms = [] # то, во что мы будем врезаться или опираться if __name__ == "__main__": main()