为什么我的玩家在Python中不动

问题描述 投票:0回答:2

我的播放器不会移动,我不明白为什么。我遵循了有关如何使其移动的教程。我做了那个人所做的事情,但它对我来说不起作用。

这是我的代码:

import pygame


pygame.init()


screen = pygame.display.set_mode((800,600))

pygame.display.set_caption("use arows")





class player:

    def __init__(self ,x, y):

        self.x = x
        self.y = y
        self.width = 32
        self.height = 32
        self.velocity = 0
        self.falling = False
        self.onGround = False

    def detectCollisions(self,x1,y1,w1,h1,x2,y2,w2,h2):

        if (x2+w2>=x1>=x2 and y2+h2>=y1>=y2):

            return True

        elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1>=y2):

            return True

        elif (x2+w2>=x1>=x2 and y2+h2>=y1+h1>=y2):

            return True

        elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1+h1>=y2):

            return True

        else:

            return False

    def update(self, gravity, blockList):
        if (self.velocity < 0):
            self.falling = True

        collision = False
        blockX,blockY =  0,0
        for block in blockList:

            collision = self.detectCollisions(self.x, self.y, self.width, self.height, block.x, block.y, block.width, block.height )
            if collision == True:
                blockx = block.x
                blocky = block.y
                break


        if(collision == True):
            if (self.falling == True):
                self.falling == False
                self.onGround== True
                self.velocity = 0
                self.y = blocky - self.height

        if (self.onGround == False):
            self.velocity += gravity
        self.y -= self.velocity

    def render(self,screen):
        pygame.draw.rect(screen,(0,0,0),(self.x, self.y, self.width, self.height))


class Block:
    def __init__ (self, x, y):
       self.x = x
       self.y = y
       self.width = 32
       self.height = 32

    def render(self,screen):
        pygame.draw.rect(screen,(0,0,0),(self.x, self.y, self.width, self.height))



gravity = -0.5

black = (0,0,0)
white = (255,255,255)
blue = (50,60,200)

clock = pygame.time.Clock()

player = player(0,0)

# 25 colums and 19 rows
level1 = [
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
]

blockList = []

for y in range (0,len(level1)):
    for x in range (0,len(level1[y])):
        if (level1[y][x] == 1):
            blockList.append(Block(x*32, y*32))

movex,movey=0,0

gameloop = True
while gameloop:

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

    if(event.type == pygame.KEYDOWN):
        if (event.key == pygame.K_RIGHT):
            movex = 5

        elif (event.key == pygame.K_LEFT):
            movex = -5


    if(event.type == pygame.KEYUP):
        if (event.key == pygame.K_RIGHT):
            movex = 0

        elif (event.key == pygame.K_LEFT):
           movex = 0

    screen.fill(blue)

    for block in blockList:
        block.render(screen)

    player.update(gravity, blockList)
    player.render(screen)
    clock.tick(60)

    pygame.display.update()

pygame.quit()
python pygame
2个回答
0
投票

您的游戏循环中存在嵌套问题。对事件操作的检查需要在 for 循环内进行,因此它会在帧期间检查每个事件。它仅检查当前编码的最后一个事件。

像这样缩进您的事件检查:

gameloop = True
while gameloop:

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

        if(event.type == pygame.KEYDOWN):
            if (event.key == pygame.K_RIGHT):
                movex = 5

            elif (event.key == pygame.K_LEFT):
                movex = -5


        if(event.type == pygame.KEYUP):
            if (event.key == pygame.K_RIGHT):
                movex = 0

            elif (event.key == pygame.K_LEFT):
                movex = 0

编辑:

除了上述之外,还没有使用

movex
变量,并且实际上,您的播放器更新函数没有水平移动的方法。

您需要对您的 Player 类进行一些更新:

def __init__(self ,x, y):

    self.x = x
    self.y = y
    self.width = 32
    self.height = 32
    self.yVelocity = 0
    self.xVelocity = 0 #Add xVelocity variable to track horizontal speed.
    self.falling = False
    self.onGround = False


def update(self, gravity, blockList):
    if (self.yVelocity < 0):
        self.falling = True

    collision = False
    blockX,blockY =  0,0
    for block in blockList:

        collision = self.detectCollisions(self.x, self.y, self.width, self.height, block.x, block.y, block.width, block.height )
        if collision == True:
            blockx = block.x
            blocky = block.y
            break


    if(collision == True):
        if (self.falling == True):
            self.falling == False
            self.onGround== True
            self.yVelocity = 0
            self.xVelocity = 0 #On a collision, stop all movement.
            self.y = blocky - self.height

    if (self.onGround == False):
        self.yVelocity += gravity
    self.y -= self.yVelocity
    self.x -= self.xVelocity #Modify position according to velocity.

然后,在游戏循环中,根据输入更新玩家的 xVelocity:

player.xVelocity = movex #Update horizontal velocity.
player.update(gravity, blockList)
player.render(screen)
clock.tick(60)

这应该有帮助。


0
投票

定义打印( *值:对象, 九月:str |无=“”, 结束:str |无=” ”, 文件:SupportsWrite[str] |无=无, 刷新:文字[False] = False ) -> 无: ... 默认打印( *值:对象, 九月:str |无=“”, 结束:str |无=” ”, 文件:_SupportsWriteAndFlush[str] |无=无, 冲洗:布尔 ) -> 无: ...

© www.soinside.com 2019 - 2024. All rights reserved.