मैं Flappy बर्ड का एक सरल संस्करण बनाने की कोशिश कर रहा हूँ। मेरे सर्कल (फ्लैपी बर्ड) और मेरे आयतों (पाइप) के बीच टकराव का पता लगाने के लिए मैं pygame.sprite.collide_rect() का उपयोग कर रहा था लेकिन मैं टकराव को संभालने का एक बेहतर तरीका चाहता था।

लेकिन मास्क टकराव का उपयोग करने से टक्कर का पता नहीं चलता है। वृत्त सीधे आयत से होकर गुजरता है जैसे कि वह वहां नहीं है।

यहाँ मेरा कोड है:

bird_group = pygame.sprite.Group()
pipe_group = pygame.sprite.Group()

class Bird(pygame.sprite.Sprite):
    def __init__(self, x_loc, y_loc, velocity):
        super(Bird, self).__init__()
        self.velocity = velocity
        self.x_loc = x_loc
        self.y_loc = y_loc
        self.image = pygame.image.load(os.path.join(game_folder,"index2.png")).convert()
        self.image.set_colorkey(WHITE)
        self.image = pygame.transform.scale(self.image,(60,65))
        self.rect = self.image.get_rect()
        self.rect.center = (x_loc,y_loc)
    def update(self):
        self.rect.y += self.velocity
        self.velocity = self.velocity+1
        self.mask = pygame.mask.from_surface(self.image)
    def jump(self):
        self.velocity = -10
    def boundary_collison(self):
        if self.rect.bottom+100>=display_height or self.rect.top<=0:
            return True

class UpperPipe(pygame.sprite.Sprite):
    """docstring for UpperPipe"""
    def __init__(self, pipe_x, pipe_height, pipe_speed):
        super(UpperPipe, self).__init__()
        self.pipe_speed = pipe_speed
        self.image = pygame.Surface((pipe_width, pipe_height))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = (pipe_x)
        self.rect.y = (0)
    def update(self):
        self.rect.x -= self.pipe_speed
        self.mask = pygame.mask.from_surface(self.image)
    def x_cord(self):
        return self.rect.x

class LowerPipe(pygame.sprite.Sprite):
    """docstring for UpperPipe"""
    def __init__(self, pipe_x, pipe_height, pipe_speed):
        super(LowerPipe, self).__init__()
        self.pipe_speed = pipe_speed
        self.image = pygame.Surface((pipe_width, display_height-(pipe_gap+pipe_height)))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.x = (pipe_x)
        self.rect.y = (pipe_height+pipe_gap)
    def update(self):
        self.rect.x -= self.pipe_speed
        self.mask = pygame.mask.from_surface(self.image)
    def x_cord(self):
        return self.rect.x

निम्नलिखित कोड मैं स्प्राइट्स बनाने के लिए उपयोग करता हूं:

bird = Bird(x_loc,y_loc,velocity)
bird_group.add(bird)

pipe_list = []
init_pipe_x = 500
for make in range(pipe_count):
    pipe_x = init_pipe_x+((between_pipe+pipe_width)*make)
    pipe_height = (round(random.uniform(0.2,0.8), 2))*(display_height-pipe_gap)
    upper = UpperPipe(pipe_x,pipe_height,pipe_speed)
    lower = LowerPipe(pipe_x,pipe_height,pipe_speed)
    add_pipe = [upper,lower]
    pipe_list.append(add_pipe)
    pipe_group.add(upper)
    pipe_group.add(lower)

अपने गेम लूप के अंदर पता लगाने के लिए मैं निम्नलिखित कोड का उपयोग करता हूं:

bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False,pygame.sprite.collide_mask)
if bird_hits:
    gameExit = True
2
Ashmeet Lamba 2 जुलाई 2018, 20:35

2 जवाब

सबसे बढ़िया उत्तर

जिन pygame.Surface को आप mask.from_surface को पास करते हैं, उनमें एक अल्फ़ा चैनल होना चाहिए। इसका मतलब है कि आपको या तो convert_alpha< पर कॉल करना होगा /a> या set_colorkey सतहों की विधि।

class UpperPipe(pygame.sprite.Sprite):

    def __init__(self, pipe_x, pipe_height, pipe_speed):
        super(LowerPipe, self).__init__()
        self.pipe_speed = pipe_speed
        # Either call `convert_alpha` ...
        self.image = pygame.Surface((pipe_width, display_height-(pipe_gap+pipe_height))).convert_alpha()
        self.image.fill(GREEN)
        # ... or call `set_colorkey`.
        # I think surfaces converted with convert_alpha are blitted faster.
        # self.image.set_colorkey((0, 0, 0))

        # You also don't have to create the mask repeatedly in the
        # update method. Just call it once in the __init__ method.
        self.mask = pygame.mask.from_surface(self.image)
0
skrx 3 जुलाई 2018, 11:20

आपने अपनी कक्षा में किसी भी collide_mask को परिभाषित नहीं किया है: कुछ इस तरह

self.mask = pygame.mask.from_surface(image) 

तो अगर आपके ऊपरी और निचले पाइप का रेक्ट इनमें से हिटबिक्स से मेल खाता है: बस उपयोग करें

bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False)

या उपयोग करने के लिए अपने class में एक self.mask बनाएं

bird_hits = pygame.sprite.spritecollide(bird,pipe_group,False,pygame.sprite.collide_mask)
0
icetomtom 2 जुलाई 2018, 20:58