2017-04-05 6 views
0

2つのスプライトが互いに近似しているかどうかを確認するにはどうすればよいですか? ifの多くを必要とします。スプライトの中心が半径内であれば、私はチェックしたい2つのスプライトがお互いに近いかどうかを確認するにはどうすればよいですか

def is_near(myPearl,bPearl): 
    if (abs(myPearl.rect.x - bPearl.rect.x) == 100 and abs(myPearl.rect.y -  bPearl.rect.y) == 100) or abs(myPearl.rect.y - bPearl.rect.y) == 100 or myPearl.rect.x == bPearl.rect.x: 
     return 1 # 1 means that the pearl is near it and this pearl is next to the pushed pearl 
    if abs(myPearl.rect.x - bPearl.rect.x) == 200 or abs(myPearl.rect.y - bPearl.rect.y) == 200 or myPearl.rect.x == bPearl.rect.x: 
     return 2 # 2 means that the pearl is near it and this pearl is two slots near the pushed pearl 

答えて

1

をだ場合、私が得た唯一のことはそれほど多くはないとのこと、私がそれを必要とするのならば、私のゲーム(六角)のための多くをやっているします別のスプライトのpg.math.Vectorとそのdistance_toメソッドを使用して距離を取得し、それが半径よりも小さいかどうかを調べることができます。次の例では、circle_collision関数でこれを行い、それはpg.sprite.groupcollideへのコールバックとして渡されます。スプライトが衝突しないように、私はif left != right:テストが必要でした。

import sys 
import pygame as pg 
from pygame.math import Vector2 
from pygame.color import THECOLORS 


class Player(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((50, 30)) 
     self.image.fill(THECOLORS['sienna1']) 
     self.rect = self.image.get_rect(center=pos) 
     self.radius = 100 


def circle_collision(left, right): 
    if left != right: 
     distance = Vector2(left.rect.center).distance_to(right.rect.center) 
     return distance < left.radius 
    else: 
     return False 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 

    sprite_group = pg.sprite.Group() 
    player1 = Player((100, 300), sprite_group) 
    player2 = Player((400, 300), sprite_group) 
    player3 = Player((100, 100), sprite_group) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == pg.MOUSEMOTION: 
       player1.rect.center = event.pos 

     sprite_group.update() 
     collided_sprites = pg.sprite.groupcollide(
      sprite_group, sprite_group, False, False, 
      collided=circle_collision) 

     # Draw everything. 
     screen.fill(THECOLORS['lemonchiffon4']) 
     sprite_group.draw(screen) 

     for collided_sprite in collided_sprites: 
      pg.draw.circle(screen, THECOLORS['lightcyan1'], 
          collided_sprite.rect.center, 
          collided_sprite.radius, 2) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit() 

また、スプライトにもう1つの大きな矩形を与え、他のスプライトの矩形と衝突するかどうかを調べることもできます。コードはほとんど同じですが、distance < radiusチェックの代わりにpygame.rect.colliderectが使用されています。

import sys 
import pygame as pg 
from pygame.color import THECOLORS 


class Player(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((50, 30)) 
     self.image.fill(THECOLORS['sienna1']) 
     self.rect = self.image.get_rect(center=pos) 
     self.vicinity_rect = self.rect.inflate(200, 200) 
     self.vicinity_rect.center = self.rect.center 

    def update(self): 
     self.vicinity_rect.center = self.rect.center 


def vicinity_collision(left, right): 
    if left != right: 
     return left.vicinity_rect.colliderect(right.rect) 
    else: 
     return False 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 

    sprite_group = pg.sprite.Group() 
    player1 = Player((100, 300), sprite_group) 
    player2 = Player((400, 300), sprite_group) 
    player3 = Player((100, 100), sprite_group) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      if event.type == pg.MOUSEMOTION: 
       player1.rect.center = event.pos 

     sprite_group.update() 
     collided_sprites = pg.sprite.groupcollide(
      sprite_group, sprite_group, False, False, 
      collided=vicinity_collision) 

     # Draw everything. 
     screen.fill(THECOLORS['lemonchiffon4']) 
     sprite_group.draw(screen) 

     for collided_sprite in collided_sprites: 
      pg.draw.rect(screen, THECOLORS['lightcyan1'], 
         collided_sprite.vicinity_rect, 2) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit() 
+1

あなたが言及した2番目の方法がおそらくより良い方法でしょう。 –

+1

私は大きなrectの例を追加しました。 – skrx

関連する問題