Pyglet中的Sprite没有做我想要的

时间:2016-12-10 00:27:58

标签: python python-3.x pyglet

我想要一个圆圈,当点击时,移动到屏幕上的其他位置。但是,当我点击圆圈时,没有任何反应。

global $wpdb;
$your_query = "SELECT * FROM wp_posts";
$results = $wpdb->get_results($your_query);
foreach ($results as $post){
    // your loop output here
}

2 个答案:

答案 0 :(得分:0)

我不熟悉pyglet,但我猜测问题是你正在检查是否x == circle.x等,这意味着它只会在你单击圆圈正中心的单个像素时移动。尝试距离中心的某种最大距离(例如斜边math.sqrt( (x-circle.x)**2 + (y-circle.y)**2) < circle.radius

答案 1 :(得分:0)

import pyglet
from pyglet.gl import *
from random import randint

glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

class Circle(pyglet.sprite.Sprite):
    def __init__(self, radiance=5, x=0, y=0):
        self.texture = pyglet.image.load('circle.png')
        super(Circle, self).__init__(self.texture)

    def click(self, x, y):
        if x >= self.x and y >= self.y:
            if x <= self.x + self.texture.width and y <= self.y + self.texture.height:
                return self

mouse = pyglet.window.mouse

#VARS
window = pyglet.window.Window(width = 640, height = 480)
score = 0
#circleImg = pyglet.image.load("circle.png")
#circle = pyglet.sprite.Sprite(circleImg, randint(1, window.width), randint(1, window.height))
circle = Circle(x=50, y=50)
text = pyglet.text.Label("Click red!", font_name = "Times New Roman", font_size = 18, x = 260, y = 10)


#DETECT MOUSE PRESS ON CIRCLE
@window.event
def on_mouse_press(x, y, button, modifiers):
    if circle.click(x, y):
        print('Clicked in circle')
        circle.x = randint(0, window.width - 10)
        circle.y = randint(0, window.height - 10)

@window.event
def on_draw():
    window.clear()
    text.draw()
    circle.draw()

pyglet.app.run()

对此操作的简短描述是它创建了一个名为Circle的自定义类,它继承了Sprite类。它将circle.png加载为带有Alpha通道的纹理,该通道由GL库混合。

我们添加一个名为click的自定义函数,用于检查最低x,y坐标是否高于最低x,y的圆,然后检查光标是否在x+width以下和y图像区域相同。

如果是这种情况,我们将循环精灵类作为True值返回,以防我们想要使用精灵。

未来的改进:

您应该使用gl functions绘制圆圈,因此我在类定义中定义了radiance。但是,光辉从未使用过,它是未来的占位符。 这样你就可以使用数学来定义你是否真的在圈内点击了,但这超出了我的快速答案范围。我必须自己做很多调试才能得到数学加法(它&# 39;不是我强硬的一面)。

现在使它起作用的是我们使用图像宽度,高度,x和y数据粗略地检查我们是否在图像中,即#34;圆圈&#34;。

作为奖励,我会将此答案添加到增强列表中,因为它包含一些可能有用的内容。一种方法是用自定义pyglet.window.Window类替换90%的代码来替换全局变量和装饰器。

它看起来像这样:

import pyglet
from pyglet.gl import *
from random import randint

glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

key = pyglet.window.key

class Circle(pyglet.sprite.Sprite):
    def __init__(self, radiance=5, x=0, y=0):
        self.texture = pyglet.image.load('circle.png')
        super(Circle, self).__init__(self.texture)

    def click(self, x, y):
        if x >= self.x and y >= self.y:
            if x <= self.x + self.texture.width and y <= self.y + self.texture.height:
                return self

class MainScreen(pyglet.window.Window):
    def __init__ (self):
        super(MainScreen, self).__init__(800, 600, fullscreen = False)
        self.x, self.y = 0, 0

        self.bg = pyglet.sprite.Sprite(pyglet.image.load('background.jpg'))
        self.sprites = {}
        self.sprites['circle'] = Circle(x=50, y=50)
        self.sprites['label'] = pyglet.text.Label("Click red!", font_name = "Times New Roman", font_size = 18, x = 260, y = 10)
        self.alive = 1

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = 0

    def on_mouse_press(self, x, y, button, modifiers):
        if self.sprites['circle'].click(x, y):
            print('Clicked in circle')
            self.sprites['circle'].x = randint(0, self.width - 10)
            self.sprites['circle'].y = randint(0, self.height - 10)

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

    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()