【问题标题】:pygame moving a user controlled object until key is released?pygame移动用户控制的对象直到释放键?
【发布时间】:2013-03-18 03:26:51
【问题描述】:

我玩 pygame 已经有一段时间了,stackoverflow 的老手给了我一些帮助,帮助我更好地改进代码以在屏幕上移动角色。每次按键时角色都会移动,减速然后停止,只有再次按键时才会继续移动。任何人都可以帮助角色在释放钥匙时减速并停止吗?

谢谢你

import sys
import pygame
import os
from pygame.locals import *

character = "toon.png"
bg = "bg.jpg"

delta = {
    pygame.K_LEFT: (-10, 0),
    pygame.K_RIGHT: (+10, 0),
    pygame.K_UP: (0, -10),
    pygame.K_DOWN: (0, +10),
    }

class Toon(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(character)
        self.bg = pygame.image.load(bg)
        self.rect = self.image.get_rect()
        self.speed = [2, 2]
        self.area = pygame.display.get_surface().get_rect()
    def update(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.right > self.area.width:
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.bottom > self.area.height:
            self.speed[1] = -self.speed[1]

class Main(object):
    def __init__(self):
        self.setup()
    def setup(self):
        pygame.init()
        size = (self.width, self.height) = (640,360)
        self.black = (0, 0, 0)
        self.bg = pygame.image.load(bg)
        self.screen = pygame.display.set_mode(size, 0, 32)
        self.toon = Toon()
        self.setup_background()
    def setup_background(self):
        self.background = pygame.Surface(self.screen.get_size())
        self.background = self.background.convert()
        self.screen.blit(self.bg, (0, 0))
        pygame.display.flip()
    def draw(self):
        self.screen.blit(self.bg, (0, 0))
        self.screen.blit(self.toon.image, self.toon.rect)
        pygame.display.flip()
    def event_loop(self):
        toon = self.toon
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    deltax, deltay = delta.get(event.key, (0, 0))
                    toon.speed[0] += deltax
                    toon.speed[1] += deltay
            toon.speed[0] *= 0.95
            toon.speed[1] *= 0.95
            toon.update()
            self.draw()
            pygame.time.delay(10)

if __name__ == '__main__':
    app = Main()
    app.event_loop()

【问题讨论】:

  • 简单 - 您需要跟踪您想要继续移动的方向。按下键时,设置方向。如果释放所有键,但仍指示方向,则朝该方向减速。如果您的速度为 0 或非常接近 0,请移除方向 - 现在您将停止。

标签: python python-2.7 pygame


【解决方案1】:

我只想更改您的 Main.event_loop() 并将另一个函数添加到您的主类,它使用 pygame.key.get_pressed

def event_loop(self):
    toon = self.toon
    while True:
        self.event_handle()
        toon.speed[0] *= 0.95
        toon.speed[1] *= 0.95
        toon.update()
        self.draw()
        pygame.time.delay(10)

def event_handle(self):
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    # This will allow diagonal movements.. 
    key = pygame.key.get_pressed()
    if key[pygame.K_LEFT]:
        self.toon.speed[0] = -10
    if key[pygame.K_RIGHT]:
        self.toon.speed[0] = +10
    if key[pygame.K_UP]:
        self.toon.speed[1] = -10
    if key[pygame.K_DOWN]:
        self.toon.speed[1] = +10

变化:

  1. 我添加了一个新函数,即event_handle,它将处理事件和键。
  2. 您会注意到 for 事件循环不进行任何键处理。那是因为我们使用的是更适合当前工作的pygame.key.get_pressed
    • 它返回当前按下的键的布尔值列表。我们通过索引key 来检查我们想要的键(这里的箭头)。

效果:
你的问题解决了。

【讨论】:

    【解决方案2】:

    KEYDOWN 时创建friction = 1,在KEYUP 时创建friction &lt; 1

                elif event.type == pygame.KEYDOWN:
                    deltax, deltay = delta.get(event.key, (0, 0))
                    toon.speed[0] += deltax
                    toon.speed[1] += deltay
                    friction = 1
                elif event.type == pygame.KEYUP:
                    friction = 0.95
            toon.speed = [x*friction for x in toon.speed]
    

    import sys
    import pygame
    import os
    from pygame.locals import *
    
    character = "toon.png"
    bg = "bg.jpg"
    
    delta = {
        pygame.K_LEFT: (-10, 0),
        pygame.K_RIGHT: (+10, 0),
        pygame.K_UP: (0, -10),
        pygame.K_DOWN: (0, +10),
        }
    
    class Toon(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load(character)
            self.bg = pygame.image.load(bg)
            self.rect = self.image.get_rect()
            self.speed = [0, 0]
            self.area = pygame.display.get_surface().get_rect()
        def update(self):
            self.rect = self.rect.move(self.speed)
            if self.rect.left < 0 or self.rect.right > self.area.width:
                self.speed[0] = -self.speed[0]
            if self.rect.top < 0 or self.rect.bottom > self.area.height:
                self.speed[1] = -self.speed[1]
    
    class Main(object):
        def __init__(self):
            self.setup()
        def setup(self):
            pygame.init()
            size = (self.width, self.height) = (640,360)
            self.black = (0, 0, 0)
            self.bg = pygame.image.load(bg)
            self.screen = pygame.display.set_mode(size, 0, 32)
            self.toon = Toon()
            self.setup_background()
        def setup_background(self):
            self.background = pygame.Surface(self.screen.get_size())
            self.background = self.background.convert()
            self.screen.blit(self.bg, (0, 0))
            pygame.display.flip()
        def draw(self):
            self.screen.blit(self.bg, (0, 0))
            self.screen.blit(self.toon.image, self.toon.rect)
            pygame.display.flip()
        def event_loop(self):
            toon = self.toon
            friction = 1        
            while True:
                for event in pygame.event.get():
                    if event.type == QUIT:
                        pygame.quit()
                        sys.exit()
                    elif event.type == pygame.KEYDOWN:
                        deltax, deltay = delta.get(event.key, (0, 0))
                        toon.speed[0] += deltax
                        toon.speed[1] += deltay
                        friction = 1
                    elif event.type == pygame.KEYUP:
                        friction = 0.95
                toon.speed = [x*friction for x in toon.speed]
                toon.update()
                self.draw()
                pygame.time.delay(10)
    
    if __name__ == '__main__':
        app = Main()
        app.event_loop()
    

    【讨论】:

    • 这真是太美了,非常感谢你们俩。在我不学习的空闲时间,我一直在努力解决这个问题,而且我一直在摸索。向你们俩致敬
    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多