Блок в моей игре не будет двигаться, когда я использую определенные команды. Я нажму 'W', и он не будет двигаться вверх - PullRequest
0 голосов
/ 19 мая 2019

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

    #Importing Modules
    from random import randint
    from pygame.locals import *
    import pygame
    ##################

    # Making User Controled Block
    class User_Block:
        def __init__(self):
          self.x_cor = 300
          self.y_cor = 300
          self.length = 20
          self.width = 20
          self.color = GREEN
          pygame.draw.rect(screen,self.color,[self.x_cor,self.y_cor,self.length,self.width],0)
    ##############################

    # Making Enemys
    class Enemy_Block:
        def __init__(self):
          self.x_cor = randint(100,500)
          self.y_cor = 100
          self.length = randint(10,100)
          self.width = randint(10,100)
          self.color = (255,0,255)
          pygame.draw.rect(screen,self.color,[self.x_cor,self.y_cor,self.length,self.width],5)
    ########################

    # Set Up Screen
    screen = pygame.display.set_mode((600,600))
    ##########################################

    # Varible Used "while" Loop
    done = False
    #############


    # Colors
    WHITE = (0,0,0)
    BLACK = (255,255,255)
    RED = (255,0,0)
    GREEN = (0,255,0)
    BLUE = (0,0,255)
    ########################

    # User Controled Block
    User_Block = User_Block()
    ########################

    # Enemys
    Enemy_List = []
    for i in range(10):
      Enemy_List.append(Enemy_Block())
    ######################

    # Most important code here
    while not done:
        for event in pygame.event.get():
          if event.type == pygame.QUIT:
              done == True

          #Moving Character
          if event.type == pygame.KEYDOWN:
            if event.key == K_w:
              User_Block.y_cor += 100
        Clock = pygame.time.Clock()
        Clock.tick(60)
    ######################################

        pygame.display.update()
    pygame.quit()
    ###################

Ожидаемый результат - мой персонаж будет двигаться вверх, когда я нажму "w". Фактический результат состоит в том, что блок остается на своей позиции.

1 Ответ

0 голосов
/ 19 мая 2019

Здесь две вещи.

  1. Когда вы перемещаете прямоугольник, изменяя его координаты, вы должны перерисовать.pygame не делает это автоматически.Если вы не вызываете нужные функции, экран не меняется.
  2. У вас есть User_Block = User_Block().Не используйте одно и то же имя класса для его экземпляра.Как минимум используйте заглавную букву: user_block = User_Block().Вы собираетесь перезаписать ссылку на класс.

Как перемещать изображения на экране

В своем коде вы используете pygame.draw.rect вместо Поверхность , поэтому, чтобы оставаться в согласии с этим выбором, вам нужно снова позвонить:

pygame.draw.rect(screen, ...)

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

Самый простой, но менее эффективный способ - заполнить весь экран цветом фона, вызвав screen.fill(BLACK) непосредственно перед перерисовкой.Менее эффективно, потому что вы фактически перерисовываете весь экран и удаляете также другие изображения, которые должны перерисовываться при каждой итерации основного цикла.
Это соответствующий код, поместите его сразу после строки, в которой вы обновляете координату:

screen.fill(BLACK) #note: black is (0, 0, 0) not (255, 255, 255).
user_block.draw()
for en in Enemy_List:
  en.draw()

Конечно, вам нужно определить метод draw, как я уже говорил выше.

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

Заключительное примечание: , как я уже сказал, рисование, как это, неэффективно.В этом простом случае это хорошо, но для сложных игр, в которых движется много вещей, игра замедлится.Мы можем сделать лучше, но я думаю, что объяснение здесь заходит слишком далеко за рамки ответа, вы можете сами исследовать, как это сделать, взглянуть на Surface и метод blit, чтобы начать.

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