如何使用pyglet批处理绘制场景或关卡

时间:2014-12-08 03:07:16

标签: pyglet

所以我目前正在学习Python 2.7的pyglet,而我正试图制作一款具有关卡的简单游戏。第一场景#39;将是标题/介绍部分,第二部分将是某种教程,其余部分是游戏关卡。

为此,我创建了7个批次(1个简介,1个教程,5个级别),即batch,batch1,... batch6。我还为每个代表场景/级别的批次创建了7个类。这就是我为介绍批次和类做的事情:

batch = pyglet.graphics.Batch()
batch1 = pyglet.graphics.Batch()
class StartState:
    def __init__(self):
        self.welcome = pyglet.text.Label('WELCOME TO', font_name='Arial', font_size=32, color=(200,255,255,255), x=400, y=550, anchor_x='center', anchor_y='center', batch=batch)
        self.title = pyglet.text.Label("MY GAME", font_name='Arial', font_size=32, color=(100,200,170,255), x=400, y=450, anchor_x='center', anchor_y='center', batch=batch)
        self.press = pyglet.text.Label("press 'SPACE' to continue", font_name='Arial', font_size=32, color=(200,255,150,255), x=400, y=250, anchor_x='center', anchor_y='center', batch=batch)
    def update(self, dt):
        if keymap[pyglet.window.key.SPACE]:
            self.welcome.delete()
            self.title.delete()
            self.press.delete()
            states.pop()
            batch1.draw()

其他场景也会如此。状态列表是我用来存储我的类/场景的列表。 states = [Level5(),Level4(),...,TutorialState(),StartState()]。因此,每当达到提升条件时,在此课程中按“空格”,窗口将被清除。即删除精灵/标签并使用states.pop()和batch1.draw()继续下一个场景。

在我输入这些课程后,我在最后添加了这个课程:

@window.event
def on_draw():
    window.clear()
    batch.draw()

def update(dt):
    if len(states):
        states[-1].update(dt)
    else:
        pyglet.app.exit()

states.append(Level5())
states.append(Level4())
states.append(Level3())
states.append(Level2())
states.append(Level1())
states.append(TutorialState())
states.append(StartState())


pyglet.clock.schedule_interval(update, 1.0/60.0)
window.clear()
window.flip()
window.set_visible(True)
pyglet.app.run()

这里的问题是它只加载起始批次/场景。每当我按下'SPACE'要进入教程场景,起始批处理的标签/精灵会消失,但它不会绘制batch1或加载教程类/场景。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

为每个场景类创建批处理后:

    import pyglet
    from pyglet.window import key

    class SceneTemplate(object):
        """a template with common things used by every scene"""
        def __init__(self, text):
            self.batch = pyglet.graphics.Batch()
            self.label = pyglet.text.Label(
                text,
                font_name='Arial', font_size=32,
                color=(200, 255, 255, 255), x=32, y=704,
                batch=self.batch)
            # (...)

    class MainMenuScene(SceneTemplate):
        def __init__(self):
            super(MainMenuScene, self).__init__(text='MainMenuScene')
            # (...)

    class IntroScene(SceneTemplate):
        def __init__(self):
            super(IntroScene, self).__init__(text='Introduction')
            # (...)

    class Level1(SceneTemplate):
        def __init__(self):
            super(Level1, self).__init__(text='Level 1')
            # (...)

您可以控制另一个类中的状态/场景,例如窗口类(我个人喜欢subclass the pyglet window, to keep things organized and some other reasons):

    class Window(pyglet.window.Window):
        def __init__(self):
            super(Window, self).__init__(width=1024, height=768)
            self.states = [MainMenuScene(), IntroScene(), Level1()]  # and so on...
            self.current_state = 0  # later you change it to get the scene you want
            self.set_visible()

        def on_draw(self):
            self.clear()
            self.states[self.current_state].batch.draw()

        def on_key_press(self, symbol, modifiers):
            if symbol == key.SPACE:
                new_state = self.current_state + 1
                new_state = new_state % len(self.states)
                self.current_state = new_state   
            # if you want each scene to handle input, you could use pyglet's push_handlers(), or even something like:
            #     self.states[self.current_state].on_key_press(symbol, modifiers)
            # giving them access to the window instance might be needed.

    if __name__ == '__main__':
        window = Window()
        pyglet.app.run()