2017-02-27 4 views
1

이전에 파이썬으로 여러 가지 간단한 2 차원 게임을 만들었고 간단하기 때문에 그런 것을 만들 필요가 없었습니다. 하지만 지금은 네 번째로 돌아갈 필요가 있기 때문에 필요합니다. 앞으로 나아가려면 어떤 종류의 방향이 필요합니다 ...상태 기계를 파이썬으로 작성하기

저는 새로운 게임으로 약 200 줄에 달하며 실제 게임을 시작하지 않았습니다. 현재는 모든 창, 이벤트 및 주를 다루고 있습니다.

### state machine 

def run: 
    #~setup window 

    # Current state 
    state = menu() 

    running = True 
    while running: 
    #~event handler 

    returns = state.update(events) 
    if returns == "playgame": 
     state = game() 
    state.draw(window) 
#menu state 
class menu: 
    def __init__(self): 
    #~define vars for the menu (buttons, etc...) 
    self.clickables = [] # filled with gui etc.. 
    self.image = image() # image of the menu 

    def update(self, events): 
    for event in events: # go through events 
     for clickable in self.clickables: # go through clickables 
     if clickable.testClicked(event.pos) != False: # Returns if clicked 
      return clickable.testClicked(event.pos) 

    def draw(self, window): 
    self.image.draw(window) 
#game state 
class game(menu): # Exactly the same as menu (just used as example) 
    def __init__(self): 
    super(menu).__init__() 
#gui button 
class button: # Extremely shortened for example use 
    def __init__(self, do): # do is a string 
    self.whenClickedDo = do 

    def testClicked(self, mousePos): 
    if mousePos in self.myRect: # myRect is the area of the button (Example!) 
     return self.whenClickedDo 
    return False 

이 위의 예는 완전히 돌진하지만 숙고 문제가되었다 ... 무엇이을 달성하기 위해 더 나은 방법, 또는이 일을 할 수있는 스마트/달성 위의 방법입니까?

TLDR; 함수 "run"은 자신을 다른 상태로 변경하는 데 사용될 값을 반환 할 수있는 "state"값을가집니다. 그것은 상태 기계를 만드는 합리적인 방법입니까?

+0

그래서 (게임이 느리다는 것을) 명확히하기 위해 게임에 대한 조언을 듣고 있습니까? E.G. '메인 메뉴'상태, '게임 플레이'상태 등을 표시 할 수 있습니까? – RichSmith

+0

@RichSmith 아니요 ... 현재 상태 업데이트 상태에서 새 상태를 반환하는 경우 커뮤니티의 대다수가 선호하는 기능을 알고 싶습니다. – AUFakie

답변

0

저는 C++로 간단한 게임 엔진을 작성하고 화면 기반 시스템을 사용했습니다. 이제 파이썬으로 간단한 버전을 작성해 보겠습니다. 아이디어는 게임의 각 부분이 다른 화면이라는 것입니다. 그래서 주 메뉴는 화면이고, 게임 플레이 화면 (모든 동작이 이루어지는 곳)이 있습니다. 사용자가 설정 등을 변경할 수있는 옵션 화면이있을 수 있습니다. 이들은 화면 목록, 각 화면 목록에 위치가 있으며 게임 이벤트에 따라 화면을 전환 할 수 있습니다. 따라서 주 메뉴 화면이 활성화되어있는 경우 사용자가 '재생'버튼을 클릭하면 게임 플레이 화면이로드됩니다.

필자는 필자의 머리 꼭대기를 정확히 어떻게 파이썬으로 이식 할 수 있을지 생각하지 않는다. 그러나 이것은 적어도 어딘가에서 시작해야한다.

class Screen: 

    # you can have objects in the screen as variables of the class here 
    # e.g self.player = None 

    def onEntry(self): 
     # here you would init the assets for your screen 
     # this could be the interface, sprites etc 
     # e.g self.player = Player() 

    def onExit(self): 
     # do any clean up 
     # maybe save player data if this is a gameplay screen 
     # e.g self.player.save() 

    def update(self): 
     # main loop for this screen 
     # e.g self.player.update() 

게임의 각 특정 화면이 화면 클래스에서 상속 및 해당 화면에 대한 사용자 정의 로직과 이러한 기능을 구현하는 것이 :

그래서 화면이 이런 수준의 것이 될 것입니다. 그러면 화면 목록은 기본적으로 이러한 사용자 정의 Screen 클래스 목록 일뿐입니다. 게임은이 화면들 사이를 오가는 것일뿐입니다.

+0

저는 거의 동일한 생각을 가지고 있다고 생각합니다. 이것이 가장 좋은 방법 중 하나라고 생각하십니까? 템플릿없이 "스크린"개념을 사용합니다. – AUFakie

+0

@AUFakie 그래, 나는이 접근 방식이 정말 마음에 든다. 게임 상태와 로직이 서로 완전히 분리되어 있기 때문에 새로운 기능을 추가하는 것이 정말 간단해진다. – RichSmith