Проблемы с движением игрока

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

Я понятия не имею, почему это происходит, так как движение персонажа влево и вправо работает нормально, то есть персонаж перемещается с помощью пользовательского ввода, нажимая кнопку ОДИН РАЗ (влево / вправо / a / d). Обратите внимание, что это Python 2.7.

Код:

 # Import modules

import sys, pygame, os, random, Tkinter, ttk, math
from pygame import *
from random import *
from Tkinter import *
from ttk import *
from math import *

class Application(Frame):

    # Game Menu Setup

    def __init__(self, master):
        Frame.__init__(self,master)
        self.grid()
        self.create_buttons()

    def Collision(self):
        pass 

    def create_buttons(self):

        self.button = Button(self)
        self.button["text"] = "Play Game"
        self.button["command"] = self.Game
        self.button.grid(row=0, column=1)

        self.button1 = Button(self)
        self.button1["text"] = "Help / Instructions"
        self.button1["command"] = self.Instructions
        self.button1.grid(row=0, column=2)

        self.button2 = Button(self)
        self.button2["text"] = "Quit"
        self.button2["command"] = self.Quit
        self.button2.grid(row=0, column=3)

    # Main Class

    def Game(self):

        # Initialise Pygame + Clock

        pygame.init()
        mainClock = pygame.time.Clock()
        pygame.mouse.set_visible(False)

        # Image Setup

        Cursor = pygame.image.load("Cursor.png")
        Food = pygame.image.load("Food.png")
        Background = pygame.image.load("Wallpaper.jpg")

        # Food Setup

        FoodImage = pygame.Surface((20, 20))

        # Music Setup

        pygame.mixer.music.load("Helix Nebula.mp3")

        # Window Setup

        WINDOWHEIGHT = 600 #set standard values
        WINDOWWIDTH = 800
        windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
        pygame.display.set_caption('The Basilisk')

        # Player Drawing

        player = pygame.Rect(50, 50, 50, 50)

        # Movement Variables

        moveLEFT = False
        moveRIGHT = False
        moveUP = False
        moveDOWN = False

        MOVESPEED = 7

        # Score Setup

##        Score = 0
##        print score

        # Game Loop & Events

        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()

                # Change the keyboard variables

                elif event.type == KEYDOWN:                
                    if event.key == K_LEFT or event.key == ord('a'):
                        moveLEFT = True
                        moveRIGHT = False
                        moveUP = False
                        moveDOWN = False
                        movex = 0.5
                        movey = 0
                    if event.key == K_RIGHT or event.key == ord('d'):
                        moveRIGHT = True
                        moveLEFT = False
                        moveUP = False
                        moveDOWN = False
                        movex = -0.5
                        movey = 0
                    if event.key == K_UP or event.key == ord('w'):
                        moveUP = True
                        moveLEFT = False
                        moveRIGHT = False
                        moveDOWN = False
                        movey = 0.5
                        movex = 0
                    if event.key == K_DOWN or event.key == ord('s'):
                        moveDOWN = True
                        moveLEFT = False
                        moveRIGHT = False
                        moveUP = False
                        movey = -0.5
                        movex = 0
                    if event.key == ord('o'):
                        pygame.mixer.music.pause()
                    if event.key == ord('r'):
                        pygame.mixer.music.play()
                    if event.key == ord('p'): 
                        pygame.mixer.music.unpause()
                elif event.type == KEYUP:
                    if event.key == K_ESCAPE:
                        pygame.quit()
                        sys.exit()                        
                    elif event.key == K_LEFT or event.key == ord('a'):
                        moveLEFT = True
                        moveRIGHT = False
                        moveUP = False
                        moveDOWN = False
                    elif event.key == K_RIGHT or event.key == ord('d'):
                        moveRIGHT = True
                        moveLEFT = False
                        moveUP = False
                        moveDOWN = False
                    elif event.key == K_UP or event.key == ord ('w'):
                        moveUP = True
                        moveLEFT = False
                        moveUP = False
                        moveDOWN = False
                    elif event.key == K_DOWN or event.key == ord('s'):
                        moveDOWN = True
                        moveLEFT = False
                        moveUP = False
                        moveDOWN = False

            # Loading Image(s) Setup

            windowSurface.blit(Background, (0,0))
            windowSurface.blit(Food, (15, 15))

            # Player Movement Setup

            if moveDOWN and player.bottom < WINDOWHEIGHT:
                player.top += MOVESPEED
            if moveUP and player.top > 0:
                player.top-= MOVESPEED
            if moveLEFT and player.left > 0:
                player.left -= MOVESPEED
            if moveRIGHT and player.right < WINDOWWIDTH:
                player.right += MOVESPEED

            # Mouse Setup

            mousex, mousey = pygame.mouse.get_pos()
            mousex -= Cursor.get_width()/2
            mousey -= Cursor.get_height()/2

            # Final Update + Character Loading

            pygame.draw.rect(windowSurface, pygame.Color('green'), player)
            windowSurface.blit(Cursor, (mousex, mousey))
            pygame.display.update()
            mainClock.tick(60)

    # Quit Screen

    def Quit(self):

        os._exit(0)

    # Instructions Screen

    def Instructions(self):

        root.title("Instructions")
        root.geometry("260x200")

        app = Frame(root)
        app.grid()

        label_1 = Label(app, text = "The Point of the game is to eat")
        label_2 = Label(app, text = "as many chicks as possible using")
        label_3 = Label(app, text = "the 'Basilisk'. The character controls")
        label_4 = Label(app, text = "the Basilisk using the WASD / arrow keys.")
        label_5 = Label(app, text = "Press the 'Escape' key to exit.")
        label_6 = Label(app, text = "Press the 'o' key to pause the music,")
        label_7 = Label(app, text = "'p' key to unpause the music, and")
        label_8 = Label(app, text = "'r' to restart / play the music.")

        label_1.grid()
        label_2.grid()
        label_3.grid()
        label_4.grid()
        label_5.grid()
        label_6.grid()
        label_7.grid()
        label_8.grid()

# Final Settings for Menu

root = Tk()
root.title("Navigation")
root.geometry("260x25")
app = Application(root)
root.mainloop()

Редактировать Итак, что теперь будет с приведенным выше кодом, так это то, что игрок нажмет кнопку "Играть в игру", и окно игры откроется, и игрок будет контролировать зеленый квадрат и перемещать его влево, вправо, вверх и вниз. Когда игрок движется влево и вправо, ему / ей нужно всего лишь нажать кнопки A или W или клавишу со стрелкой влево или клавишу со стрелкой вправо ОДИН РАЗ, чтобы квадрат переместился влево / вправо. Случай для направления сверху и снизу не совпадает. Символ перемещается до тех пор, пока пользователь вводит данные, т. Е. Клавиши W или S или клавишу со стрелкой вниз или клавишу со стрелкой вверх необходимо удерживать для перемещения квадрата в указанных направлениях. Как я могу это исправить?

2 ответа

Решение

Кажется, что ваш event.type==KEYUP: состояние глючит:
вы устанавливаете false движения вверх и вниз после установки их истинного...
Проверьте этот код:
см комментарии в последних двух if-else заявления

elif event.type == KEYUP:
    if event.key == K_ESCAPE:
        pygame.quit()
        sys.exit()                        
    elif event.key == K_LEFT or event.key == ord('a'):
        moveLEFT = True
        moveRIGHT = False
        moveUP = False
        moveDOWN = False
    elif event.key == K_RIGHT or event.key == ord('d'):
        moveRIGHT = True
        moveLEFT = False
        moveUP = False
        moveDOWN = False
    elif event.key == K_UP or event.key == ord ('w'):
        moveUP = True
        moveLEFT = False
        moveUP = False   ##This line is faulty moveRIGHT=FALSE should be used instead
        moveDOWN = False
    elif event.key == K_DOWN or event.key == ord('s'):
        moveDOWN = True
        moveLEFT = False
        moveUP = False
        moveDOWN = False   ##This line is faulty moveRIGHT=FALSE should be used instead


Как предложение:
Вы можете использовать операторы print в тех частях кода, где, по вашему мнению, может быть ошибка.
А затем отследите распечатанные записи, чтобы увидеть, где все работает хорошо, а где нет.
Это даст вам правильное представление об ошибке.
Его часть тестирования Белой Коробки

Похоже, вы скопировали код для непрерывного перемещения и попытались его адаптировать. Если вы хотите просто двигаться сразу после нажатия кнопки, пусть ваши события KEYDOWN напрямую изменят положение игрока.

Если вы хотите оживить движение, все становится сложнее: у вас должно быть 2 состояния: движение и стояние. Стоя, вы слушаете события KEYDOWN, а затем запускаете движение в нужном направлении, если оно есть. Если вы двигаетесь, вы игнорируете события KEYDOWN (или сохраняете их на потом, если хотите действительно продвинуться) и снова переходите в положение стоя, как только достигнете целевого квадрата.

Кроме того, если вы хотите поддерживать оба режима транзита (нажмите клавишу ИЛИ удерживайте клавишу), вам нужно будет добавить дополнительную логику... возможно, проверьте pygame.key.get_pressed(), чтобы увидеть, следует ли переходить от перехода в стоячий режим или просто продолжай двигаться на другую клетку.

Другие вопросы по тегам