- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习pyglet并使用问卷调查的东西练习一些python编码,但是我无法找到一种方法来使背景图片在10秒钟之内被删除或绘制在上面或某物之上。我是新来的,并且缺乏很多我需要的知识,谢谢您的帮助!
import pyglet
from pyglet.window import Window
from pyglet.window import key
from pyglet import image
import time
card1 = False
cat_image = pyglet.image.load("cat.png")
dog_image = pyglet.image.load("dog.png")
image = pyglet.image.load("backg.png")
background_sprite = pyglet.sprite.Sprite(image)
cat = pyglet.sprite.Sprite(cat_image)
dog = pyglet.sprite.Sprite(dog_image)
window = pyglet.window.Window(638, 404, "Life")
mouse_pos_x = 0
mouse_pos_y = 0
catmeme = pyglet.image.load("catmeme.png")
sprite_catmeme = pyglet.sprite.Sprite(catmeme)
@window.event
def on_draw():
window.clear()
background_sprite.draw()
card_draw1(63, 192, 385, 192)
def card1():
while time.time() < (time.time() + 10):
window.clear()
sprite_catmeme.draw()
@window.event
def card_draw1(x1, y1, x2, y2):
cat.set_position(x1, y1)
dog.set_position(x2, y2)
cat.draw()
dog.draw()
def card_draw2():
pass
@window.event
def on_mouse_press(x, y, button, modifiers):
if x > cat.x and x < (cat.x + cat.width):
if y > cat.y and y < (cat.y + cat.height):
card1()
game = True
while game:
on_draw()
pyglet.app.run()
最佳答案
顺序和操作方式中存在一些缺陷。
我将尽力描述它们,并为您提供一段代码,该代码可能会更好地满足您的需求。
我还认为您对问题的描述有点XY Problem,当您认为自己已经接近解决方案时,就复杂问题寻求帮助时,这很常见,因此您正在寻求有关解决方案的帮助。我想出了,不是问题。
我假设您要在10秒钟内显示“启动画面”,这恰好是您的背景?然后在其上方显示cat.png
和dog.png
,对吗?
如果是这样,您可能需要在这里进行一些更改才能使其正常工作:draw()
功能
它并没有真正更新屏幕,它只是将内容添加到图形内存中。更新屏幕的是您,还是告诉图形库您已完成向屏幕中添加内容的工作,现在该更新所有已更新的内容了。因此,循环中需要的最后一件事是.draw()
,以便使您实际绘制的内容显示出来。
如果尝试摆动窗口,您的情况可能会显示出来,由于pyglet的内部机制如何工作,它应该触发场景的重新绘制。
如果您不调用window.flip()
-.flip()
调用将永远不会发生的可能性-同样,这是Pyglet / GL的内部机制,它告知图形卡某些内容已更新,我们就完成了更新现在该重绘场景了。
一个场景
这是用户所看到的最常用的词。
我可能会在文本中提到很多,所以很高兴知道这是用户所看到的,而不是您redraw()
'n或已删除的内容,这是图形的最新显示卡插入显示器。
但是由于图形缓冲区的工作方式,我们可能已经删除了内容或将内容添加到了内存中,而尚未实际绘制。请记住这一点。.draw()
调用
这本身就是一个永无止境的循环,因此在pyglet.app.run()
循环中进行循环实际上没有任何意义,因为while game:
会“挂起”整个应用程序,您要执行的任何代码都必须位于.run()
或从图形代码本身内部生成的def on_draw
。
为了更好地理解这一点,请看一下我的代码,这些年来,我已经在SO上粘贴了几次,它是两个自定义类的基本模型,继承了Pyglet的行为,但允许您设计自己的类表现稍有不同。
而且大多数功能都在event
函数下,该函数几乎总是用于捕获Events的函数。 Pyglet具有很多内置功能,我们将使用自己的功能覆盖它们(但名称必须相同)
import pyglet
from pyglet.gl import *
key = pyglet.window.key
class CustomSprite(pyglet.sprite.Sprite):
def __init__(self, texture_file, x=0, y=0):
## Must load the texture as a image resource before initializing class:Sprite()
self.texture = pyglet.image.load(texture_file)
super(CustomSprite, self).__init__(self.texture)
self.x = x
self.y = y
def _draw(self):
self.draw()
class MainScreen(pyglet.window.Window):
def __init__ (self):
super(MainScreen, self).__init__(800, 600, fullscreen = False)
self.x, self.y = 0, 0
self.bg = CustomSprite('bg.jpg')
self.sprites = {}
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
elif symbol == key.C:
print('Rendering cat')
self.sprites['cat'] = CustomSprite('cat.png', x=10, y=10)
elif symbol == key.D:
self.sprites['dog'] = CustomSprite('dog.png', x=100, y=100)
def render(self):
self.clear()
self.bg.draw()
for sprite_name, sprite_obj in self.sprites.items():
sprite_obj._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()
x = MainScreen()
x.run()
on_???
继承函数,并且只要您将函数命名为与继承的一次相同,就将您决定的内容替换为
pyglet.window.Window
的核心功能。在这种情况下,我模仿相同的功能,但增加了一些我自己的功能。
Window()
,它通常只包含一个
on_key_press()
调用而没有执行任何操作,在这里,我们检查是否按下了
pass
,如果是,则-在
key.C
中添加一个项目。因此碰巧在我们的
self.sprites
循环中,其中的任何内容都将呈现在背景之上。
self.sprites
,
render()
,
bg.jpg
-注意不同的文件结尾)
cat.png
是一个非常简单的类,旨在使您现在的生活更轻松,没有别的。它的功能非常有限,但是做得很少。
dog.png
一样对待,这意味着您可以移动它并以多种方式对其进行操作。
CustomSprite
来更新屏幕内容。这是因为
pyglet.sprite.Sprite
会如您所愿地清除窗口,这也会触发场景的重新绘制。
flip()
可能会触发重绘。
.clear()
将告诉GL后端强制重绘。
bg.draw()
只会在GPU甚至没有机会发光之前阻塞CPU。阅读有关
Batched rendering and graphics的更多信息!它将为您节省很多帧速率。
.flip()
循环中保留尽可能少的功能,并将事件触发器用作您的主要编码样式来源。
.draw()
,请使用
clock/time event调用删除猫的函数。除非您知道将代码放在何处以及原因,否则不要尝试使用自己的
render()
样式的代码。有一个很好的计时器,我很少使用。。但是,如果您要开始的话,应该这样做。
关于python - 试图绘制 Sprite 或更改图片pyglet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963164/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!