2017-12-01 4 views
0

私は衝突のために一定の矩形を持っているスプライトを持っていますが、キャンバス上のその矩形よりも大きく見せたいです。たとえば、衝突矩形を(0,0,50,50)にしたい場合、例として(0,0,70,70)のように画面上のスプライトを表示します。これら2つを区別する方法はありますか?見た目とは違った形になっていますか?

+0

[this](https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_rect_ratio)はあなたの質問に答えていますか? –

+0

2つの矩形を維持します。最初は 'blit()'に、2番目は衝突をチェックします。 – furas

答えて

1

ここでは、衝突検出に2番目の矩形を使用する方法を示す例を示します。私はがrectの代わりに衝突するかどうかをチェックするコールバック関数collidedを定義しました。このコールバック関数は、pygame.sprite.spritecollideまたはgroupcollideに渡す必要があります。

import pygame as pg 
from pygame.math import Vector2 


class Player(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((70, 40)) 
     self.image.fill(pg.Color('steelblue4')) 
     self.rect = self.image.get_rect(center=pos) 
     # A inflated rect as the hitbox. 
     self.hitbox = self.rect.copy() 
     self.hitbox.inflate_ip(-42, -22) 
     self.vel = Vector2(0, 0) 
     self.pos = Vector2(pos) 

    def update(self): 
     self.pos += self.vel 
     self.rect.center = self.pos 
     self.hitbox.center = self.pos # Also update the hitbox coords. 


def collided(sprite, other): 
    """Check if the hitboxes of the two sprites collide.""" 
    return sprite.hitbox.colliderect(other.hitbox) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group() 
    player = Player((300, 200), all_sprites) 
    enemies = pg.sprite.Group(
     Player((100, 250), all_sprites), 
     Player((400, 300), all_sprites), 
     ) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEMOTION: 
       player.pos = event.pos 

     all_sprites.update() 
     # Pass the custom collided callback function to spritecollide. 
     collided_sprites = pg.sprite.spritecollide(
      player, enemies, False, collided) 
     for sp in collided_sprites: 
      print('Collision', sp) 

     screen.fill((30, 30, 30)) 

     all_sprites.draw(screen) 
     for sprite in all_sprites: 
      # Draw rects and hitboxes. 
      pg.draw.rect(screen, (0, 230, 0), sprite.rect, 2) 
      pg.draw.rect(screen, (250, 30, 0), sprite.hitbox, 2) 

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


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
関連する問題