繁体   English   中英

pygame形状旋转

[英]Pygame shape rotation

我正在做一个小游戏,按下键时无法旋转一种形状。 我设法旋转了形状,但是当按下键时它会继续旋转(90度),而不是保持在新位置。 我有一种感觉,它处于某种类型的循环中,但是我似乎无法使它脱离循环。 希望有人能帮忙。 相关代码位于底部的第六行(elif键[K_d])

class Player(pygame.sprite.Sprite):

def __init__(self, screen):
    self.screen = screen
    self.image = pygame.image.load(os.path.join('shape.png'))
    self.rect = self.image.get_rect()
    self.rect.x = 10
    self.rect.y = 540
    #You don't need to define self.width because it is now self.rect.width
    #Same with self.height
    self.speed = 10

def update(self):
    keys = pygame.key.get_pressed()      

    if keys[K_LEFT]:
        self.rect.left -= self.speed
        if self.rect.left < 0: #The left edge
            self.rect.left = 0
    elif keys[K_RIGHT]:
        self.rect.right += self.speed
        if self.rect.right > WINDOW_WIDTH:
            self.rect.right = WINDOW_WIDTH
    elif keys[K_UP]:
        self.rect.top -= self.speed
        if self.rect.top < 0:
            self.rect.top = 0
    elif keys[K_DOWN]:
        self.rect.bottom += self.speed
        if self.rect.bottom > WINDOW_HEIGHT:
            self.rect.bottom = WINDOW_HEIGHT
    ***#THE CODE BELOW IS THE SHAPES ROTATION***.        
    elif keys[K_d]:
        self.image = pygame.transform.rotate(self.image, 90)   

def draw(self, screen=None):
    if screen is None:
        screen = self.screen

    screen.blit(self.image, (self.rect.x, self.rect.y))

据我所知,您实际上是在每帧调用一次更新。

pygame.keys.get_pressed()如果确实按下了“ d”,则每帧返回“ d”。 更好地使用pygame.KEYDOWN和KEYUP事件的事件检查。 仅在按下键并释放后才触发它们。

我建议将键盘映射添加到主程序类的构造函数(

def __init__(self):

部分)。

我现在仅将d键添加到我的示例中,您可以自己添加其他键。

self.keymap = {pygame.K_d: False}

然后还在主循环中检查事件:

while running:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key in self.keymap:
                self.keymap[event.key] = True

        if event.type == pygame.KEYUP:
            if event.key in self.keymap:
                self.keymap[event.key] = False

按下键时仅一次触发KEYDOWN,并且在按下键时不会在每一帧都返回True。 它将主类中的变量设置为True,您可以在其他类中使用该变量。

释放密钥时,也仅一次触发KEYUP。 它将键映射中的变量重置为False,因此程序已准备好处理该键的下一个KEYDOWN事件。

检查播放器的update方法中的变量:

if Main.keymap[K_d] == True:
    self.image = pygame.transform.rotate(self.image, 90)

这对您有用吗?

// edit:再次说明这一点,并希望指出代码中的问题所在:

pygame.keys.get_pressed

如果仍然按下该键,则每帧返回True,因此在按住该键的同时在每一帧中进行旋转。

pygame.KEYDOWN

pygame.KEYUP

仅在按下或释放键时才触发一次,因此即使您一直按下该键也不会再次返回True。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM