首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyglet -α加载/闪烁图像

pyglet -α加载/闪烁图像
EN

Stack Overflow用户
提问于 2017-09-04 22:29:50
回答 1查看 4.3K关注 0票数 5

我试着用pyglet做一个简单的应用程序。到目前为止,我的主要问题是,我似乎无法将一幅图像与alpha混合--所有的透明像素都转换为黑色像素。我不确定问题是图像的加载还是闪电战。下面是关于我如何渲染图像的一个非常基本的概述:

代码语言:javascript
复制
import pyglet
import pyglet.clock

window = pyglet.window.Window()

window.config.alpha_size = 8

#fancy text
text = pyglet.resource.image("text.png")

#background image
bg = pyglet.resource.image("bg.png")

bg.blit(0, 0)
text.blit(100, 100)

pyglet.app.run()

任何帮助都是非常感谢的。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-05 06:25:10

你很可能只需要启用GL ALPHA混合。

代码语言:javascript
复制
from pyglet.gl import *
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

但是首先,您的代码无法运行。主要是因为您没有声明一个window.event函数来处理通常呈现事物的on_draw

其次,你永远不会清除你的窗口(这会造成混乱)。

下面是您的代码的一个最小的工作示例:

代码语言:javascript
复制
import pyglet
import pyglet.clock

window = pyglet.window.Window()

window.config.alpha_size = 8

#fancy text
text = pyglet.resource.image("text.png")

#background image
bg = pyglet.resource.image("bg.png")

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

    bg.blit(0, 0)
    text.blit(100, 100)

pyglet.app.run()

现在,这将生成以下内容:

下面是一个如何使用GL_BLEND特性的工作示例:

代码语言:javascript
复制
import pyglet
import pyglet.clock
from pyglet.gl import *

window = pyglet.window.Window()

window.config.alpha_size = 8

#fancy text
text = pyglet.resource.image("text.png")

#background image
bg = pyglet.resource.image("bg.png")

@window.event
def on_draw():
    window.clear()
    glEnable(GL_BLEND)

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    bg.blit(0, 0)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    text.blit(100, 100)

pyglet.app.run()

这产生了如下结果:

然而,这段代码很快就会变得凌乱不堪。

所以有两件事你可以做。首先,你可以把你的图像放到精灵对象中。其次,让它更加面向对象。

首先,我们要用精灵。

代码语言:javascript
复制
self.fancy_background = pyglet.sprite.Sprite(pyglet.image.load('bg.png'))
self.fancy_background.draw()  # not blit!

精灵自动使用透明度,这使你的生活(和代码)更容易。

第二,我们会把这些放进一批。

批处理可以聚集大量的精灵,这样您就可以在批处理上调用.draw(),并且该批处理中的所有精灵都会得到实例呈现。

代码语言:javascript
复制
self.background = pyglet.graphics.Batch()
self.fancy_background = pyglet.sprite.Sprite(pyglet.image.load('bg.png'), batch=self.background)
self.background.draw() # background, not fancy_background! And also not blit!!

最后,当然也是最不重要的。

我们会把这个放到课堂上,这样我们以后就可以做一些很酷的事情了。

代码语言:javascript
复制
import pyglet
import pyglet.clock
from pyglet.gl import *

key = pyglet.window.key

class main(pyglet.window.Window):
    def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
        super(main, self).__init__(width, height, *args, **kwargs)
        self.x, self.y = 0, 0

        self.background = pyglet.graphics.Batch()
        self.texts = pyglet.graphics.Batch()

        self.fancy_background = pyglet.sprite.Sprite(pyglet.image.load('bg.png'), batch=self.background)
        self.fancy_text = pyglet.sprite.Sprite(pyglet.image.load('text.png'), batch=self.texts)

        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_press(self, x, y, button, modifiers):
        if button == 1: # Left click
            pass

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

    def render(self):
        self.clear()

        self.background.draw()
        self.texts.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()

巴姆。

例如,此代码将允许您创建自定义函数和自定义"player对象“。此外,您可以更容易地进行碰撞检测,代码看起来更结构化(我添加了一些额外的功能,比如键盘和鼠标事件)。

注意,精灵的位置将默认为x=0, y=0,如最后一张图片所示。您可以在变量/句柄上或在创建sprite时使用x=100设置位置。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46044714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档