以下のクラスを使用して、弾丸のリストとスプライトのリストを作成しました。弾丸がスプライトと衝突したかどうかを検出し、そのスプライトと弾丸を削除するにはどうすればよいですか?
#Define the Sprite class
class Sprite:
def __init__(self,x,y, name):
self.x=x
self.y=y
self.image = pygame.image.load(name)
self.rect = self.image.get_rect()
def render(self):
window.blit(self.image, (self.x,self.y))
# Define the bullet class to create bullets
class Bullet:
def __init__(self,x,y):
self.x = x + 23
self.y = y
self.bullet = pygame.image.load("user_bullet.BMP")
self.rect = self.bullet.get_rect()
def render(self):
window.blit(self.bullet, (self.x, self.y))
私がpygameについて理解していることから、 colliderect
メソッドを使用して、2つの長方形が重なっているかどうかを確認する必要があります。これを行う1つの方法は、衝突をチェックするメソッドをBullet
クラスに含めることです。
def is_collided_with(self, Sprite):
return self.rect.colliderect(Sprite.rect)
次に、次のように呼び出すことができます。
Sprite = Sprite(10, 10, 'my_Sprite')
bullet = Bullet(20, 10)
if bullet.is_collided_with(Sprite):
print 'collision!'
bullet.kill()
Sprite.kill()
組み込みメソッドを使用して実行しようとしていることには、非常に簡単な方法があります。
ここに例があります。
import pygame
import sys
class Sprite(pygame.Sprite.Sprite):
def __init__(self, pos):
pygame.Sprite.Sprite.__init__(self)
self.image = pygame.Surface([20, 20])
self.image.fill((255, 0, 0))
self.rect = self.image.get_rect()
self.rect.center = pos
def main():
pygame.init()
clock = pygame.time.Clock()
fps = 50
bg = [255, 255, 255]
size =[200, 200]
screen = pygame.display.set_mode(size)
player = Sprite([40, 50])
player.move = [pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP, pygame.K_DOWN]
player.vx = 5
player.vy = 5
wall = Sprite([100, 60])
wall_group = pygame.Sprite.Group()
wall_group.add(wall)
player_group = pygame.Sprite.Group()
player_group.add(player)
# I added loop for a better exit from the game
loop = 1
while loop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = 0
key = pygame.key.get_pressed()
for i in range(2):
if key[player.move[i]]:
player.rect.x += player.vx * [-1, 1][i]
for i in range(2):
if key[player.move[2:4][i]]:
player.rect.y += player.vy * [-1, 1][i]
screen.fill(bg)
# first parameter takes a single Sprite
# second parameter takes Sprite groups
# third parameter is a do kill command if true
# all group objects colliding with the first parameter object will be
# destroyed. The first parameter could be bullets and the second one
# targets although the bullet is not destroyed but can be done with
# simple trick bellow
hit = pygame.Sprite.spritecollide(player, wall_group, True)
if hit:
# if collision is detected call a function in your case destroy
# bullet
player.image.fill((255, 255, 255))
player_group.draw(screen)
wall_group.draw(screen)
pygame.display.update()
clock.tick(fps)
pygame.quit()
# sys.exit
if __name__ == '__main__':
main()
箇条書きのグループを作成してから、箇条書きをグループに追加します。
私がすることはこれです:プレーヤーのためのクラスで:
def collideWithBullet(self):
if pygame.Sprite.spritecollideany(self, 'groupName'):
print("CollideWithBullet!!")
return True
そしてどこかのメインループで:
def run(self):
if self.player.collideWithBullet():
print("Game Over")
うまくいけば、それはあなたのために働きます!!!