окно pygame и консольное приложение python - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть работающее одиночное текстовое приключение на Python.Он обрабатывает одно слово команды со списками.Так что игрок может получать вещи, бросать вещи, носить одежду, и у него есть боевая система.Я хочу расширить это.Я использовал Pygame для создания карты, после очень хорошей демонстрации на YouTube, и теперь я застрял.Как я могу переключиться с консольного приложения на 2d карту ... и вернуться обратно?

Это произошло из-за переполнения стека.У него была небольшая причудливость формата.Я получил это работает.Вы можете видеть, что консоль не находится в интерактивном режиме.

import pygame
import sys
from pygame.locals import *

white = (255,255,255)
black = (0,0,0)

objs = []

MAIN_BUTTON = 1

class Pane():

  def __init__(self, screen):
    self.Screen = pygame.display.set_mode((1000,600), 0, 32)
    self.Screen = screen #pygame.display.set_mode((1000,600), 0, 32)
    self.font = pygame.font.SysFont('Arial', 25)
    self.Screen.fill((white))
    pygame.display.update()

  def drawPane(self, textToDisplay):
    self.Screen.blit(self.font.render(textToDisplay, True, (black)), (75, 135))
    pygame.draw.rect(self.Screen, (black), (0, 100, 200, 100), 2)

  def drawPane2(self, textToDisplay):
    self.Screen.blit(self.font.render(textToDisplay, True, (black)), (250, 115))
    pygame.draw.rect(self.Screen, (black), (400, 500, 200, 100), 2)

class Application():

  def __init__(self):
    pygame.init()
    pygame.display.set_caption('Box Test')
    self.Screen = pygame.display.set_mode((1000,600), 0, 32)

    numberOfPanes = 0
    self.NoOfPanes = numberOfPanes

    self.addPane("hello")
    self.addPane2("b")
    self.mousePosition()
    pygame.display.update()


  def addPane(self, textToDisplay):
    myPane = Pane(self.Screen )
    myPane.drawPane(textToDisplay)

  def addPane2(self, textToDisplay):
    myPane = Pane(self.Screen )
    myPane.drawPane2(textToDisplay)

  def clearScreen(self):
    self.screen.fill((white))
    pygame.display.update()

  def mousePosition(self):
    global posx, posy
    global clickPos
    global releasePos
    for event in pygame.event.get():
      if event.type == MAIN_BUTTON:
        self.Pos = pygame.mouse.get_pos()
        return MAIN_BUTTON
      else:
        return False

  def run(self):
    clock = pygame.time.Clock()

    while True:
            # --- events ---
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          pygame.quit()
          sys.exit()

        if event.type == pygame.MOUSEBUTTONUP:
          posx,posy = pygame.mouse.get_pos()
          if (175 <= posx <= 375) and (75 <= posy <= 175):
            print("bob")
          else:
            print("error")

            # --- FPS ---
      clock.tick(12) # 12 FPS (Frames Per Second)

if __name__ == '__main__':
    Application().run()

Я мог бы определить some_number some_bigger_number && another_number a_fourth_number, чтобы ограничить местоположения на 2D-карте.Примерно так:

def update(self, target):
    x = -target.rect.x + int(WIDTH / 2)
    y = -target.rect.y + int(HEIGHT / 2)

    print("" + str(x) + "," + str(y) + "")

    if -220 < y > -322 and -627 < x > -1059:
        events(self)

Конечно, я знаю, что это не работает, я только пытаюсь описать то, что, по моему мнению, может работать.Событие будет выглядеть так:

def events(self):
    # catch all events here
    for event in pg.event.get():
        if event.type == pg.QUIT:
            self.quit()
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_ESCAPE:
                self.quit()


if event.type == pg.K_CTRL and pg.k_UP
    BLUE = pg.Color('dodgerblue')
    text = '''Oubliette.\nA crack in the ceiling above the middle of the north wall allows a trickle of water to flow down to the floor. The water pools near the base of the wall, and a rivulet runs along the wall an out into the hall. The water smells fresh.\n\n

На юг - это дверь \ n На запад - это дверь \ n \ n '' 'ptext.draw (text, (10, 10), color= СИНИЙ)

Могу ли я взломать и выйти из окна пигмея?

Здесь приведена ссылка на более раннюю версию, в которой только на 20-30 комнат больше внимания уделялось механике команд.Вы увидите, что взаимодействие с терминалом в виде оболочки домашнего приготовления необходимо.https://github.com/DangerousTod/Text-Adventure-Tomb/blob/master/January-Tomb.zip

То, на что я надеюсь, является чем-то вроде Сказки Барса РЭШ.В Nintendo Bard's Tale вы перемещаетесь по карте, пока не встретитесь или не войдете в здание.Мне бы очень хотелось, чтобы над скроллером была консоль и место для изображений в стиле ретро.Спасибо за ваши предложения и за мои навыки кодирования и не забудьте упомянуть мастерство переполнения стека.Сейчас 2 часа ночи, и я действительно не знаю, почему некоторые фрагменты уклоняются ... Предложения ???

Обновление ... Я возился с печатью позиций x, y и этот измененный код работает:

    def events(self):
        # catch all events here
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.quit()
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    self.quit()
            if event.type == pg.KEYUP:
#            if event.type == pg.K_l:
                posx,posy = self.player.rect.x, self.player.rect.y

#                print(posx,posy)
                if (1120 <= posx <= 1296) and (351 <= posy <= 321):

                    print("In An Oubliette.")
                elif (1120 <= posx <= 1253) and (362 <= posy <= 382):
                    print("Oubliette.")
                elif (1253 <= posx <= 1332) and (376 <= posy <= 391):
                    print("A crack in the ceiling above the middle of the north wall allows a trickle of water to flow down to the floor.")
                elif (1333 <= posx <= 1366) and (410 <= posy <= 432):
                    print("The water pools near the base of the wall.")
                elif (1385 <= posx <= 1400) and (407 <= posy <= 432):
                    print("a rivulet runs along the wall an out into the hall.")
                elif (992 <= posx <= 1094) and (361 <= posy <= 432): 
                    print("Oubliette.")
#                        Printed = True

#                elif (1760 <= posx <= 1920) and (192 <= posy <= 432):
#                    print("The Rat Pit.\n")
#                elif (1920 <= posx <= 2544) and (288 <= posy <= 336):
#                    print("Bones Tangled In Thick Cobwebs.\n")
                else:
                    print("Dungeon of the UnderKingdom")

Вы видите, я просто пробую вещи, чтобы увидеть, что произойдет, смеется.Это действительно круто.Вы можете бродить по лабиринту, но если вы будете искать, нажимая клавиши ВВЕРХ, вы можете получить небольшие подсказки о том, где вы находитесь.И я предполагаю, что если я могу печатать, я могу запустить любой другой код, который мне нравится, если он не нарушит цикл pg.

Я мог бы перенести довольно много логики в терминальную сессию дозапуск лабиринта.Но в лабиринте, если вы начнете получать слишком много урона или что-то еще, что вам захочется получить доступ к вашему оборудованию и т. Д.

Еще одно обновление, я думаю, что оно готово к закрытию: как всегда, я зашел слишком далеко в своемтестирование, чтобы получить любой полезный результат прошлой ночью.Сегодня он ударил меня, просто переместите заявление печати!Посмотрите на этот снимок экрана:

Running Python in active terminal session

Если эта возможность не является для вас чем-то новым, извините за неудобства.Для меня это большое откровение.Некоторые могут задаться вопросом о возможности запуска произвольного кода в приложении Pygame.Спасибо за внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...