मेरे पायगम गेम में, मैं चाहता हूं कि बुलेट यह पता लगाने में सक्षम हो कि यह दिए गए हिटबॉक्स में कब है। ऐसा करने के लिए मुझे स्थानीय से वैश्विक चर बनाने की जरूरत है। हालांकि, हर बार कोई नई वस्तु दिखाई देने पर वैश्विक चर को नए हिटबॉक्स में अपडेट किया जाता है। यह मुझे पिछले हिटबॉक्स को ट्रैक करने और स्क्रीन पर अभी भी पुरानी वस्तुओं के भीतर बुलेट होने का पता लगाने नहीं देता है। मैं इसे कैसे न होने दूँ? मुझे a के पिछले मान को कैसे स्टोर करना चाहिए?

यहां वह वर्ग है जहां मैं हिटबॉक्स और ऑब्जेक्ट की अन्य विशेषताओं को परिभाषित कर रहा हूं।

class Enemy:
    def __init__(self, y, width, height):
        self.width = width
        self.height = height
        self.vel = 1.5
        self.y = y
        self.x = random.randrange(screen_width - 64 * 2)
        self.index = random.choice(number)
        self.hitboxes = [(self.x + 68, self.y + 68, self.width - 10, self.height - 14),
                         (self.x + 38, self.y + 47, self.width + 20, self.height - 5),
                         (self.x + 18, self.y + 12, self.width + 32, self.height + 30),
                         (self.x + 20, self.y + 32, self.width + 16, self.height + 5),
                         (self.x + 4, self.y + 7, self.width - 24, self.height - 31)]  # hitbox list
        self.hitbox = self.hitboxes[self.index]  # selecting hitbox from list  

    def draw(self, win):
        win.blit(asteroids[self.index], (self.x, self.y))
        pygame.draw.rect(win, (255, 0, 0), self.hitbox, 2)

यहां मुख्य लूप है जहां समस्या स्थित है (कोड में टिप्पणियां पढ़ें)

asteroids = [pygame.image.load('rock0.png'), pygame.image.load('rock1.png'), pygame.image.load('rock2.png'),
             pygame.image.load('rock3.png'), pygame.image.load('rock4.png')]

number = [0, 1, 2, 3, 4]

asteroids_on_screen = []

rock = Enemy(-140, 64, 64)

run = True
clock = pygame.time.Clock()
while run:
    last = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == my_event_id:
            x = random.randrange(screen_width - 64 * 2)
            index = random.choice(number)
            asteroids_on_screen.append(Enemy(rock.y, rock.width, rock.height))
    global a  # if I define a as a global here I will be able to detect
              # when the bullet is within the hitbox of the 
              # newest added object, since a gets updated for each 
              # object that enters the screen, but not the other ones.
    for a in asteroids_on_screen:
        if -141 < a.y < 500:
            a.y += a.vel
            a.hitbox = (a.hitbox[0], a.hitbox[1] + a.vel, a.hitbox[2], a.hitbox[3])
        else:
            asteroids_on_screen.pop(asteroids_on_screen.index(a))

    for bullet in bullets:
        if bullet.x + bullet.width < a.hitbox[0] + a.hitbox[2] and bullet.x - bullet.width > a.hitbox[0]:
            if bullet.y - bullet.height < a.hitbox[1] + a.hitbox[3] and bullet.y + bullet.height > a.hitbox[1]:
                rock.hit()
                bullets.pop(bullets.index(bullet))
        if 0 < bullet.y < 500:
            bullet.y -= bullet.vel
        else:
            bullets.pop(bullets.index(bullet))
2
Den Fula Ankungen 9 सितंबर 2019, 23:11

1 उत्तर

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

बस नेस्टेड लूप का प्रयोग करें। आपको प्रत्येक क्षुद्रग्रह के खिलाफ प्रत्येक गोली की जांच करनी होगी:

# move the asteroids
for a in asteroids_on_screen:
    if -141 < a.y < 500:
        a.y += a.vel
        a.hitbox = (a.hitbox[0], a.hitbox[1] + a.vel, a.hitbox[2], a.hitbox[3])
    else:
        asteroids_on_screen.pop(asteroids_on_screen.index(a))

# hit test for each combination of asteroid and bullet
for a in asteroids_on_screen:
    for bullet in bullets:
        if bullet.x + bullet.width < a.hitbox[0] + a.hitbox[2] and bullet.x - bullet.width > a.hitbox[0]:
            if bullet.y - bullet.height < a.hitbox[1] + a.hitbox[3] and bullet.y + bullet.height > a.hitbox[1]:
                rock.hit()
                bullets.pop(bullets.index(bullet))

# move the remaining bullets
for bullet in bullets:
    if 0 < bullet.y < 500:
        bullet.y -= bullet.vel
    else:
        bullets.pop(bullets.index(bullet))
1
Rabbid76 9 सितंबर 2019, 20:28