- 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/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!