Ta gra jest strzelcem kosmicznym i mam dziwny problem, w którym moje lasery czasami uderzają w wroga, a inne czasy przechodzą przez ponadto.

for lasers in amtLasers:
    if lasers.y < invaders.y:
        if lasers.x > invaders.x-56 and lasers.x < invaders.x+28:
            amtLasers.pop(amtLasers.index(lasers))
            amtInvaders.pop(amtInvaders.index(invaders))
            score += 20

Mam zajęcia dla laserów i najeźdźców i amtlazerów to lista, która przechowuje lasery na ekranie, dopóki nie zostaną usunięte. Nie mam na celu zniszczenia wroga w kontakcie, więc udało mi się zauważyć, że jeśli nadal strzelam wroga, ten sam wróg zostanie trafiony czasami i nie zostaną trafieni. Dlaczego tak się dzieje i jak mogę to naprawić?

Oto edycja: lasery trafiają tylko na ostatnio spawnął wroga i myślę, że wiem dlaczego

class invader(object):
    def __init__(self):
        self.x = randint(30, 1020)
        self.y = 0
        color = randint(1, 3)
        if color == 1:
            self.col = (225,0,0)
        elif color == 2:
            self.col = (0,225,0)
        elif color == 3:
            self.col = (0,115,255)
        self.vel = randint(1, 2)

Kiedy nowy wróg jest spawany, invaders.x i najeźdźców Jak śledziłbym każdego wroga osobno?

1
Cheesy 14 marzec 2021, 04:13

1 odpowiedź

Najlepsza odpowiedź

Będziesz musiał sprawdzić, czy którykolwiek z laserów uderzył w żadną z wrogów. Użyj 2 zagnieżdżonych pętli, aby iterować wrogów i lasery:

for lasers in amtLasers[:]:
    for invaders in amtInvaders[:]:

        if lasers.y < invaders.y:
            if lasers.x > invaders.x-56 and lasers.x < invaders.x+28:
                amtLasers.pop(amtLasers.index(lasers))
                amtInvaders.pop(amtInvaders.index(invaders))
                score += 20

Zauważ, że musisz iterować na płytkich kopii listy. Zobacz Jak usunąć elementy z listy podczas iteracji? .

Polecam użycie pygame.Rect obiekty i {X1}} dla testu kolizji:

laser_rect = pygame.Rect(laser.x, laser.y, laser_width, laser_height)
invader_rect = pygame.Rect(invaders.x, invaders.y, invaders_width, invaders_height)

if laser_rect .colliderect(invader_rect):
    amtLasers.pop(amtLasers.index(lasers))
    amtInvaders.pop(amtInvaders.index(invaders))
    score += 20

Zobacz Jak wykryć zdecentrowanie w Pygame? i Jak wykryć kolizje między dwoma prostokątnymi obiektami lub obrazów W Pigame.

1
Rabbid76 14 marzec 2021, 07:52