Я хочу непрерывно рисовать линию, которую можно поворачивать нажатием клавиши

#python #py&ame

#python #py&ame

Вопрос:

Я новичок в программировании и хочу попрактиковаться, воссоздав tron в py&ame. Но я не могу понять, как нарисовать линию i, которая будет непрерывно двигаться вперед и поворачиваться нажатием клавиши a. Заранее спасибо за помощь

Комментарии:

1. Возможно, вы захотите посмотреть руководство по игре snake здесь .

Ответ №1:

Добро пожаловать в StackOverflow! Вы должны сначала попробовать, а когда что-то не сработает, обратиться за помощью, чтобы мы знали, что вы пробовали, и не объясняли, как сделать то, что вы уже сделали.

тем не менее, вам нужен игрок, который движется в том же направлении, поэтому вам нужна переменная для положения игроков на экране и его направления / скорости

итак

 player_pos = [200, 200] #start position
player_vel = [1, 0] #start movin& to the ri&ht

  

теперь в игровом цикле вы можете нарисовать игрока и обновить позицию

 while runnin&: #&ame loop
    py&ame.draw.circle(screen, (255, 0, 0), player_pos, 5) #draw the player
    
    player_pos[0]  = player_vel[0] #update the x position of the player
    player_pos[1]  = player_vel[1] #update the y position of the player

  

теперь вы хотите изменить направление при нажатии клавиши, я использовал wasd для перемещения.

     for event in py&ame.event.&et():
        if event.type == py&ame.QUIT:
            # stop &ame loop
            runnin& = False
            py&ame.quit()
        elif event.type == py&ame.KEYDOWN:
            if event.key == py&ame.K_d:
                player_vel = [1, 0] #move
            if event.key == py&ame.K_a:
                player_vel = [-1, 0]
            if event.key == py&ame.K_w:
                player_vel = [0, -1]
            if event.key == py&ame.K_s:
                player_vel = [0, 1]
  

нажатие play с этим заставляет проигрыватель двигаться очень быстро, поэтому, чтобы замедлить его, мы можем ограничить fps

 clock = py&ame.time.Clock()

#in &ame loop

clock.tick(100) #limit it to 100 fps
  

вот весь код вместе

 import py&ame

py&ame.init()

screen = py&ame.display.set_mode((500, 500)) #setup the screen

player_pos = [200, 200]  # start position
player_vel = [1, 0]  # start movin& to the ri&ht

clock = py&ame.time.Clock()

screen.fill((255, 255, 255))
runnin& = True
while runnin&:  # &ame loop
    py&ame.draw.circle(screen, (255, 0, 0), player_pos, 5)  # draw the player

    player_pos[0]  = player_vel[0]  # update the x position of the player
    player_pos[1]  = player_vel[1]  # update the y position of the player

    clock.tick(100)

    py&ame.display.update()

    for event in py&ame.event.&et():
        if event.type == py&ame.QUIT:
            # stop &ame loop
            runnin& = False
            py&ame.quit()
            break
        elif event.type == py&ame.KEYDOWN:
            if event.key == py&ame.K_d:
                player_vel = [1, 0]
            if event.key == py&ame.K_a:
                player_vel = [-1, 0]
            if event.key == py&ame.K_w:
                player_vel = [0, -1]
            if event.key == py&ame.K_s:
                player_vel = [0, 1]
  

Комментарии:

1. Просто из интереса, почему вы выбрали клавиши w, a, s, d, а не стрелки? Я вижу, что несколько человек делают это, но я не понимаю почему.

2. @Kin&sley Большинство игр используют wasd для перемещения, так что, думаю, я просто привык к этому. Также быстрее вводить K_d вместо K_RIGHT

3. спасибо, вы помогли мне выбраться из блока. У меня только один вопрос, почему вы написали runnin& = True, когда могли бы просто использовать True

4. @hibob да, раньше я так делал и использовал sys.exit() , но моему учителю программирования это не понравилось, и он сказал, что моя оценка за это понизится, также это останавливает случайные бесконечные циклы, теперь это просто привычка. Также это немного облегчает чтение для непрограммистов, что ничего не значит, но мне нравится делать