Как заставить пулю следовать за мышью - PullRequest
1 голос
/ 04 июня 2019

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

Мне удалось сделать пули, но они стреляют только вверх, в то время как мне нужно стрелять туда, где находится мышь.

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

Это то, что у меня есть:

Code is removed for now. Will re-upload in 1 to 2 months.
run = True

while run:

   [...]

        elif event.type == pygame.MOUSEBUTTONDOWN:
            bullet = Bullet()
            bullet.rect.x = player.rect.x
            bullet.rect.y = player.rect.y
            all_sprite_list.add(bullet)

, и этоВесь мой код, если это поможет:

Code is removed for now. Will re-upload in 1 to 2 months.

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

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Вы можете определить положение мыши в событии pygame.MOUSEBUTTONDOWN.

if event.type == pygame.MOUSEBUTTONDOWN:
    aim_pos = event.pos

Возможно, вы также хотите, чтобы пуля следовала в направлении, в котором вы стреляете.

player_position = player.rect.center

# Assume you have got where you're aiming by aim_pos.
bullet_vec = pygame.math.Vector2(aim_pos[0] - player_position[0],
                                 aim_pos[1] - player_position[1]).normalize() * 10 #move speed
bullet = Bullet()
bullet.rect.center = player.rect.center
bullet.vec = bullet_vec
all_sprite_list.add(bullet)

И двигается следующимНаправление.

class Bullet(pygame.sprite.Sprite):
    ....your codes

    def update(self):
        self.rect.move_ip(self.vec.x, self.vec.y)
1 голос
/ 04 июня 2019
def update(self):
    self.rect.y -= 3

Это часть кода, которая управляет функцией, о которой вы спрашивали (куда движется мяч), но я думаю, вы знаете об этом, потому что написали ее.

будут появляться сообщения об ошибках, и если я попытаюсь их отредактировать, появится еще больше сообщений об ошибках, и я действительно не знаю, почему.

Ну, это программирование для вас. Продолжай их чинить.

Я настоятельно рекомендую установить линтер, кстати. Запуск pylint в вашем коде дает мне все это, что похоже на обратную связь, которую вы просите нас:

$ pylint --errors-only your-game.py
************* Module game
your-game.py:8:0: E1101: Module 'pygame' has no 'init' member (no-member)
your-game.py:30:21: E1121: Too many positional arguments for lambda call (too-many-function-args)
your-game.py:45:21: E1121: Too many positional arguments for lambda call (too-many-function-args)
your-game.py:93:21: E1121: Too many positional arguments for lambda call (too-many-function-args)
your-game.py:130:21: E1121: Too many positional arguments for lambda call (too-many-function-args)
your-game.py:299:25: E1101: Module 'pygame' has no 'QUIT' member (no-member)
your-game.py:301:25: E1101: Module 'pygame' has no 'MOUSEBUTTONDOWN' member (no-member)
your-game.py:336:25: E1101: Module 'pygame' has no 'QUIT' member (no-member)
your-game.py:339:27: E1101: Module 'pygame' has no 'KEYDOWN' member (no-member)
your-game.py:340:28: E1101: Module 'pygame' has no 'K_LEFT' member (no-member)
your-game.py:342:30: E1101: Module 'pygame' has no 'K_RIGHT' member (no-member)
your-game.py:344:30: E1101: Module 'pygame' has no 'K_UP' member (no-member)
your-game.py:346:30: E1101: Module 'pygame' has no 'K_DOWN' member (no-member)
your-game.py:349:27: E1101: Module 'pygame' has no 'KEYUP' member (no-member)
your-game.py:350:28: E1101: Module 'pygame' has no 'K_LEFT' member (no-member)
your-game.py:352:30: E1101: Module 'pygame' has no 'K_RIGHT' member (no-member)
your-game.py:354:30: E1101: Module 'pygame' has no 'K_UP' member (no-member)
your-game.py:356:30: E1101: Module 'pygame' has no 'K_DOWN' member (no-member)
your-game.py:359:27: E1101: Module 'pygame' has no 'MOUSEBUTTONDOWN' member (no-member)
your-game.py:376:0: E1101: Module 'pygame' has no 'quit' member (no-member)

Также поговорим об этом:

wall = Wall(0, 0, 10, 800)                                                    
wall_list.add(wall)                                                           
all_sprite_list.add(wall)

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

walls = (
         (0, 0, 10, 800),
         (40, 40, 10, 75),
         (50, 40, 190, 10),
         # ...
        )
for wall_coords in walls:
    wall = Wall(*wall_coords)
    wall_list.add(wall)
    all_sprite_list.add(wall)

Это 43 строки из ваших 144, делающих одно и то же - намного легче читать и редактировать, если вы контролируете громадный объем вашего кода.

0 голосов
/ 04 июня 2019

Итак, глядя на это, когда MOUSEBUTTONDOWN, вы создаете новую Bullet () в позиции игрока.Затем при обновлении пули.Вы перемещаете его y координату вверх на 3 единицы.

Я бы рекомендовал присвоить каждому атрибуту bullet a velocity и target.Это позволит вам «выстрелить и забыть» каждую пулю, не беспокоясь о том, чтобы каждый раз вручную обновлять ее.

def __init__(self, velocity: float, target: tuple or list):
    # other stuff
    self.velocity = velocity
    self.target = target

def update(self):

    # get the angle towards the target
    x_delta = self.target[0] - self.rect.x
    y_delta = self.target[1] - self.rect.y
    rotation = -math.atan2(y_delta, x_delta)

    # move towards the target
    self.rect.x += math.cos(rotation) * self.velocity
    self.rect.y -= math.sin(rotation) * self.velocity
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...