0

次のような for ループを実行するタイル マップがあります。

def Draw_Level( x, y, column, obsticles, entities, image_cache ):

    #Grass#
    if column == "G":
        g = Grass(x, y, image_cache)
        entities.add(g)
    #Plain Grass#
    elif column == "P":
        p = Plain_Grass(x,y, image_cache)
        entities.add(p)
    #Grass with yellow flower#
    elif column == "F":
        f = Grass_Flower(x,y, image_cache)
        entities.add(f)
    #Grass To Sand (50/50 split block) Direct#
    elif column == "Y":
        q = Grass_To_SandD(x,y, image_cache)
        entities.add(q)

#Example If a class
class Grass(Entity):

    def __init__(self, x, y, image_cache):
        Entity.__init__(self)
        self.image = functions.get_image("data/images/Grass.png", image_cache)
        self.image.convert()
        self.rect = Rect(x, y, 32, 32)

たとえば、マウスがこれらのいずれかをクリックし、x と y が最も近い 32 (ブロックの幅と高さ) に決定されたとします。どのスプライトがクリックされたかを判断するにはどうすればよいですか? たとえば、「草」ブロックをクリックすると、その草ブロックが画面に描画される座標が表示されますが、どうすればそれを削除できますか?

Entites = すべてのエンティティを保持するリスト

エンティティ リストから呼び出す方法はありますか? リストを介してRectを呼び出すと混乱するので、行き詰まっています:S.

4

2 に答える 2

2

あなたがやりたいことは、「ヒット検出」または「ヒットテスト」と呼ばれます。コードの場合、エンティティのリストを調べて、マウス クリックの x、y 位置を、それぞれが占めている四角形の範囲に対してチェックする必要があります。

それぞれをクラスにするhit_test(self, x, y)と、それらにメソッドを追加して、それぞれで呼び出すことができます。これらの行に沿ったもの:

class Grass(Entity):
    def __init__(self, x, y, image_cache):
        Entity.__init__(self)
        self.image = functions.get_image("data/images/Grass.png", image_cache)
        self.image.convert()
        self.rect = Rect(x, y, 32, 32)
    def hit_test(self, x, y):
        return (self.rect.x <= x < self.rect.x+self.rect.width and 
                self.rect.y <= y < self.rect.y+self.rect.height) 
于 2013-07-16T15:47:45.973 に答える
2

を使用rect.collidepointして、マウス カーソルが四角形内にあるかどうかを判断できます。

entities_the_mouse_is_over = [entity for entity in entities if entity.rect.collidepoint(mouse_x, mouse_y)]

このアプローチを使用する場合は、丸めアルゴリズムを再検討してください。これは、 または のいずれかが最も近い 32 に切り上げられた場合には機能しませんmouse_xmouse_yたとえば、タイルに の四角形が(0,0,32,32)あり、ユーザーが (20,20) をクリックしたとします。mouse_x(32,32) に切り上げられmouse_yますが、これは rect(0,0,32,32) に関する限りではありませんcollidepoint

を切り捨てるだけであれば、うまくいきますcollidepoint。前の例では、(20,20) は rect(0,0,32,32) 内にある (0,0) に切り捨てられます。

丸めをまったく行わないこともできます。

于 2013-07-16T15:44:01.160 に答える