Почему мой танк не двигается, когда я нажимаю "a" и "d"? - PullRequest
2 голосов
/ 29 мая 2019

В настоящее время я застрял при попытке заставить мой танк двигаться, когда пользователь нажимает «a» и «d». Линии, включающие нажатие клавиши для перемещения танка, кажутся правильными, и я считаю, что должно работать. Я также впервые использую один из этих форумов. Пожалуйста, оставьте отзыв, чтобы я мог улучшить. Спасибо за вашу помощь.

Я обратился к моему учителю и друзьям за помощью, но все они задаются вопросом, почему танк не будет двигаться. Я также искал через Интернет и YouTube для ответов. Странно то, что мы с моим другом напрямую скопировали видео на YouTube о перемещении пользователя, где пользователь может перемещать прямоугольник вокруг. Мой друг может удерживать «w», «a», «s» или «d» для перемещения прямоугольника, но я не могу удерживать «w», «a», «s» или «d» для перемещения это но нужно спамить кнопку. Странно то, что когда вы перемещаете мышь, я могу удерживать клавиши «w», «a», «s» или «d».

import pygame
from pygame.locals import *
import math
import random

width = 640 
height = 480
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("2 Player Tanks")


def gameloop(): 
    pygame.init()
    time = pygame.time.get_ticks()

    screen.fill(white)

    tankx = 100
    tanky = 100
    tankwidth = 40
    tankheight = 20
    turretwidth = 5 
    wheelwidth = 5
    tankmove = 5

    def tank(x,y):
        x = int(x)
        y = int(y)
        pygame.draw.circle(screen,black,(x,y),10)
        pygame.draw.rect(screen,black,(x-tankheight,y,tankwidth,tankheight))
        pygame.draw.line(screen,black,(x,y),(x-20,y-20), turretwidth)

        startx = 15
        for i in range(7):
            pygame.draw.circle(screen,black,(x-startx,y+20),wheelwidth)
            startx -= 5

   for event in pygame.event.get():
        if event.type == pygame.QUIT:
           pygame.quit()

        keys= pygame.key.get_pressed()

        if keys[pygame.K_a]:
            tankx -= tankmove
        if keys[pygame.K_d]:
            tankx += tankmove
        if keys[pygame.K_w]:
            tanky -= tankmove
        if keys[pygame.K_s]:
            tanky += tankmove         

         tank(tankx,tanky)
         pygame.display.update()

gameloop()

Я хочу, чтобы игрок мог использовать «a» и «d» для горизонтального перемещения танка.

1 Ответ

1 голос
/ 29 мая 2019

Цикл событий выполняется только тогда, когда происходит событие.Это означает, что он выполняется, когда клавиша нажата или клавиша отпущена - однако, когда клавиша удерживается нажатой, событие не происходит и цикл обработки не выполняется.

Вы должны оценивать нажатия клавиш в основном цикле (в области gameloop), а не в цикле событий:

например,

def gameloop(): 

    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    # <--
    keys= pygame.key.get_pressed()

    if keys[pygame.K_a]:
        tankx -= tankmove
    if keys[pygame.K_d]:
        tankx += tankmove
    if keys[pygame.K_w]:
        tanky -= tankmove
    if keys[pygame.K_s]:
        tanky += tankmove         

    tank(tankx,tanky)
    pygame.display.update()

Примечание: pygame.key.get_pressed() возвращает текущие состояния клавиш, и состояния оцениваются и обновляются при вызове pygame.event.get().


Положениебак сбрасывается в начале кадра, потому что переменные tankx и tanky установлены в начале gameloop:

 def gameloop(): 
      #[...]

      tankx = 100
      tanky = 100

Определите переменные вглобальный охват и используйте оператор global для доступа к ним.
Уменьшите скорость танка, потому что он будет двигаться очень быстро (tankmove = 1).

The pygame.init() следует вызывать только один раз, в начале применения.

например,

def gameloop(): 
    global tankx, tanky, tankmove

    tankwidth = 40
    tankheight = 20
    turretwidth = 5 
    wheelwidth = 5

    time = pygame.time.get_ticks()

    screen.fill(white)

    # [...]

pygame.init()

tankx = 100
tanky = 100
tankmove = 1
run = True
while run:
    gameloop()

Я могу перемещать танк с рандомизированнымфон, но программа продолжает рисовать новый танк.Чтобы это исправить, я добавил screen.fill (белый).Это решает проблему рисования, но теперь у меня нет фона.

Не рисуйте случайный фон в окне.Создайте pygame.Surface и нарисуйте случайный фон на поверхности.
.blit поверхность фона на экране в каждом кадре:

background_surface = pygame.Surface((widht, height))
# draw background to "background_surface" rather then "screen"
# [...]
def gameloop():

    # [...]

    # blit background instead of screen.fill(white)
    screen.blit(background_surface, (0, 0))

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