簡體   English   中英

小品類

[英]Pyglet Into Class

鑒於到目前為止,我一直使用Pygame,所以我想開始使用Pyglet,以了解其工作原理。

import pyglet, os

class runGame():
    widthDisplay = 1024
    heightDiplay = 576
    title = "Pokémon Life and Death: Esploratori del proprio Destino"

    wra = pyglet.image.load("wra.png")
    wrb = pyglet.image.load("wrb.png")

    def __init__(self):
        platform = pyglet.window.get_platform()
        display = platform.get_default_display()
        screen = display.get_default_screen()
        self.widthScreen = screen.width
        self.heightScreen = screen.height
        self.xDisplay = int(self.widthScreen / 2 - self.widthDisplay / 2)
        self.yDisplay = int(self.heightScreen / 2 - self.heightDiplay / 2)
        self.Display = pyglet.window.Window(width=self.widthDisplay, height=self.heightDiplay, caption=self.title, resizable=False)
        self.Display.set_location(self.xDisplay, self.yDisplay)
        pyglet.app.run()

game = runGame()

到目前為止,一切都很好,並且一切正常。 但是從某種意義上說,我已經錯了,既然我必須畫些東西,該怎么辦? 從某種意義上說,Pyglet是否可以留在Pygame之類的課程中?

標記的解決方案可能會解決問題。
但是,我認為它並沒有真正增加更多的功能。

如果您真的想讓Pyglet成為一個類,那么您實際上必須繼承一些東西,或者利用我偵察的OOP方式進行編程。

這是我的兩分錢:

import pyglet
from pyglet.gl import *
from collections import OrderedDict
from time import time

key = pyglet.window.key

class main(pyglet.window.Window):
    def __init__ (self, width=1024, height=576, caption="Pokémon Life and Death: Esploratori del proprio Destino", fps=True, *args, **kwargs):
        super(main, self).__init__(width, height, *args, **kwargs)

        platform = pyglet.window.get_platform()
        display = platform.get_default_display()
        screen = display.get_default_screen()

        self.xDisplay = int(screen.width / 2 - self.width / 2)
        self.yDisplay = int(screen.height / 2 - self.height / 2)
        self.set_location(self.xDisplay, self.yDisplay)

        self.sprites = OrderedDict()

        if fps:
            self.sprites['fps_label'] = pyglet.text.Label('0 fps', x=10, y=10)
            self.last_update = time()
            self.fps_count = 0

        self.keys = OrderedDict()

        self.mouse_x = 0
        self.mouse_y = 0

        self.alive = 1

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = 0

    def on_mouse_motion(self, x, y, dx, dy):
        self.mouse_x = x
        self.mouse_y = y

    def on_mouse_release(self, x, y, button, modifiers):
        print('Released mouse at {}x{}'.format(x, y))


    def on_mouse_press(self, x, y, button, modifiers):
        if button == 1:
            print('Pressed mouse at {}x{}'.format(x, y))


    def on_mouse_drag(self, x, y, dx, dy, button, modifiers):
        self.drag = True
        print('Dragging mouse at {}x{}'.format(x, y))

    def on_key_release(self, symbol, modifiers):
        try:
            del self.keys[symbol]
        except:
            pass

    def on_key_press(self, symbol, modifiers):
        if symbol == key.ESCAPE: # [ESC]
            self.alive = 0

        self.keys[symbol] = True

    def pre_render(self):
        pass

    def render(self):
        self.clear()

        # FPS stuff (if you want to)
        self.fps_count += 1
        if time() - self.last_update > 1: # 1 sec passed
            self.sprites['fps_label'].text = str(self.fps_count)
            self.fps_count = 0
            self.last_update = time()

        #self.bg.draw()
        self.pre_render()

        for sprite in self.sprites:
            self.sprites[sprite].draw()

        self.flip()

    def run(self):
        while self.alive == 1:
            self.render()

            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch_events()

if __name__ == '__main__':
    x = main()
    x.run()

這樣,您實際上可以與您的類進行交互,就好像它是pyglet類一樣。 例如,您無需使用裝飾器等即可獲得on_key_press

您應該為正在做的每件事做更多的功能。 例如,如果您想划一條線,您可能有

import pyglet, os

class runGame():
    widthDisplay = 1024
    heightDiplay = 576
    title = "Pokémon Life and Death: Esploratori del proprio Destino"

    wra = pyglet.image.load("wra.png")
    wrb = pyglet.image.load("wrb.png")

    def __init__(self):
        platform = pyglet.window.get_platform()
        display = platform.get_default_display()
        screen = display.get_default_screen()
        self.widthScreen = screen.width
        self.heightScreen = screen.height
        self.xDisplay = int(self.widthScreen / 2 - self.widthDisplay / 2)
        self.yDisplay = int(self.heightScreen / 2 - self.heightDiplay / 2)
        self.Display = pyglet.window.Window(width=self.widthDisplay,    height=self.heightDiplay, caption=self.title, resizable=False)
        self.Display.set_location(self.xDisplay, self.yDisplay)
        pyglet.app.run()

    def drawLine(x, y):
        drawLine(x, y)

您將必須根據要執行的功能來創建函數,但是如果在runGame程序之前不打算多次使用runGame類,則不應使用OOP編程和過程編程。

您可以通過繼承pyglet.window.Window類來創建自定義pyglet窗口。 之后,在您的init方法中調用超類init(這將在pyglet.window.Window類中調用init),然后覆蓋繼承的方法(on_draw,on_key_press,on_key_release等)。 之后創建一個更新方法,該方法將在pyglet.clock.schedule_interval中每秒調用60次,最后只需調用pyglet.app.run()方法即可。

import pyglet


class GameWindow(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def on_draw(self):
        self.clear()

    def on_mouse_press(self, x, y, button, modifiers):
        pass

    def on_mouse_release(self, x, y, button, modifiers):
        pass

    def on_mouse_motion(self, x, y, dx, dy):
        pass

    def update(self, dt):
        pass

if __name__ == "__main__":
    window = GameWindow(1280, 720, "My Window", resizable=False)
    pyglet.clock.schedule_interval(window.update, 1/60.0)
    pyglet.app.run() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM