почему мои пули не двигаются, хотя мои танки - PullRequest
1 голос
/ 03 мая 2020

Я делаю игру-пигмей. Когда я нажимаю на кнопку танков, а затем нажимаю на экран (игровую зону), танк блистает по этой координате. Наряду с танком пуля также разорвана. Я могу заставить свой танк двигаться, но пули не стреляют. Я хочу, чтобы танки продолжали стрелять автоматически после сброса пули после путешествия, скажем, 40 пикселей.

Это функция, которая дает танкам и пулям координаты

tank_pos_list = []
bullet_list = []

def spawn_tank():
    global tank_pos_list
    global bullet_list
    qx, qy = pygame.mouse.get_pos()
    tankxy = [(qx - 35), (qy - 35)]
    tank_pos_list.append(tankxy)
    bullet_list.append(tankxy)

Это мой класс движения для танков и пуль.

class MovementClass:

    global bullet_list
    global tank_pos_list
    tank_surf = pygame.image.load("tank.png")
    bullet = pygame.image.load("bullet.png")

    def movetank(self, tankimg):
        for tank_pos in tank_pos_list:
            screen.blit(tankimg, (tank_pos[0], tank_pos[1]))
            tank_pos[0] += 0.2

    def movebullet(self, bulletimg):
        for j in range(len(bullet_list)):
            newx = (bullet_list[j][0] + 35)
            screen.blit(bulletimg, (newx, (bullet_list[j][1] + 34)))
            newx += 1

Это моя основная функция

def main():
    global new_tanks
    global spawner
    global tank_pos_list
    global fire_bullet_tank
    run = True
    fps = 90
    tanks = Button((59, 255, 140), 100, 610, 80, 80, text="Tanks")
    tanks_over = Button((0, 255, 0), 100, 610, 80, 80, text="Tanks")
    towers = Button((59, 255, 140), 510, 610, 150, 80, text="Towers")
    towers_over = Button((0, 255, 0), 510, 610, 150, 80, text="Towers")
    blue = pygame.image.load("blue_base.png")
    red = pygame.image.load("red_base.png")
    spawner = False

    while run:

        mx, my = pygame.mouse.get_pos()
        pos = (mx, my)
        x = pos[0]
        y = pos[1]

        mouse_pos = (mx, my)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                if spawner and my < 550 and mx < 500:
                    spawn_tank()

                    spawner = False
                if tanks.isOver(mouse_pos):
                    spawner = True

        screen.fill((50, 168, 66))

        if len(tank_pos_list) >= 11:
            tank_pos_list.pop(-1)

        pygame.draw.rect(screen, (201, 142, 47), (0, 600, 1000, 100))
        pygame.draw.line(screen, (0, 0, 0), (500, 0), (500, 600))

        if tanks.isOver(mouse_pos):
            tanks_over.draw(screen)
        else:
            tanks.draw(screen)

        if towers.isOver(mouse_pos):
            towers_over.draw(screen)
        else:
            towers.draw(screen)

        screen.blit(blue, (0, 100))
        screen.blit(red, (800, 100))

        #movement()

        movingtank = MovementClass()
        movingtank.movetank(pygame.image.load("tank.png"))
        movingbullet = MovementClass()
        movingbullet.movebullet(pygame.image.load("bullet.png"))

        pygame.display.flip()
        clock.tick(fps)

1 Ответ

3 голосов
/ 03 мая 2020

Когда вы запускаете

for tank_pos in tank_pos_list:
   ...
   tank_pos[0] += 0.2

, вы изменяете первое значение в списке внутри списка tank_pos_list. Обратите внимание, что вы добавляете tankxy в оба списка в spawn_tank, чтобы увидеть изменения в tank_pos_list и bullet_list. Это один и тот же список в обоих списках, которые вы меняете здесь.

Но когда вы запускаете

for j in range(len(bullet_list)):
    newx = (bullet_list[j][0] + 35)
    ...
    newx += 1

, вы просто создаете новую переменную newx и меняете ее значение; но вы никогда не меняете значения списков в bullet_list.


Еще несколько примечаний:

MovementClass не имеет внутреннего состояния; в принципе бесполезно, что вы создаете 2 новых экземпляра в каждом кадре. Вместо этого используйте глобальные функции (без класса) или просто встроите эти функции.

Вы загружаете "tank.png" и "bullet.png" каждый кадр с диска. Вы должны просто загрузить изображения один раз за пределы вашего основного l oop. В противном случае он скоро станет главным убийцей производительности.


Попробуйте создать класс или несколько классов, представляющих различных участников вашей игры (для этого Pygame предлагает класс Sprite) и реализуйте поведение и государство в этом классе. Хотя это не самый продвинутый метод, это правильный путь к go ИМХО для небольших игр.

Например, возможно, посмотрите на этот ответ Я сделал для других вопросов, который представляет собой пошаговое руководство по созданию такой игры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...