首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python输入法控件

python输入法控件
EN

Stack Overflow用户
提问于 2014-04-11 04:21:30
回答 2查看 503关注 0票数 2

有什么方法可以让我从用户那里得到输入并移动播放器图像?每当我按W、A、S或D键时,我都可以移动播放器图像,但它只移动了1个像素。在按下键时,我能做什么使它移动呢?

代码语言:javascript
复制
import pygame
from pygame.locals import *


pygame.init()
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Gaben's Future Adventure")

player = pygame.image.load("images/player.png")
player_rect = player.get_rect()

white = (255, 255, 255)
black = (0, 0, 0)

class World(object):
    def __init__(self):
        pass

class Controls(object):
    def __init__(self):
        self.speed = 1
        self.keys = [False, False, False, False]

    def moveUp(self, player_rect):
        player_rect.y -= self.speed
    def moveLeft(self, player_rect):
        player_rect.x -= self.speed
    def moveRight(self, player_rect):
        player_rect.x += self.speed
    def moveDown(self, player_rect):
        player_rect.y += self.speed

    def update(self):
        pass

def main():
    running = True


    while running:
        screen.fill(white)


        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                print "Exiting game."

            if event.type == pygame.KEYDOWN:
                if event.key == K_w:
                    print "W down"
                elif event.key == K_a:
                    print "A down"
                elif event.key == K_s:
                    Controls().moveDown(player_rect)
                    print "S down"
                elif event.key == K_d:
                    Controls().moveRight(player_rect)
                    print "D down"

            if event.type == pygame.KEYUP:
                if event.key == K_w:
                    print "W up"
                elif event.key == K_a:
                    print "A up"
                elif event.key == K_s:
                    print "S up"
                elif event.key == K_d:
                    print "D up"

        screen.blit(player, player_rect)
        pygame.display.flip()
        print player_rect.x
        print player_rect.y
main()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-11 07:11:11

我会为我感兴趣的所有密钥创建一个dict。对于移动,这些值只是一个(x, y)元组:

代码语言:javascript
复制
move_map = {pygame.K_w: ( 0, -1),
            pygame.K_s: ( 0,  1),
            pygame.K_a: (-1,  0),
            pygame.K_d: ( 1,  0)}

然后,在主循环中,我将计算一个运动矢量:

代码语言:javascript
复制
    # get all pressed keys
    pressed = pygame.key.get_pressed()

    # get all movement modifiers from our move_map where the key is pressed.
    move = [move_map[key] for key in move_map if pressed[key]]

    # add all movement modifiers together in cases multiple keys are pressed.
    # map(sum, zip(*...)) is not very efficient, but easy to remember :-)
    final = map(sum, zip(*move))

    # usually you want to normalize the result first, and multiplicate it 
    # with the desired velocity of that object.

    # if we have a movement vector, just move the player_rect
    if final:
        player_rect.move_ip(*final)

    # also, you probably want to use a Clock object to limit your framerate

完整代码:

代码语言:javascript
复制
import pygame
from pygame.locals import *


pygame.init()
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Gaben's Future Adventure")

player = pygame.image.load("images/player.png")
player_rect = player.get_rect()

white = (255, 255, 255)
black = (0, 0, 0)

class World(object):
    def __init__(self):
        pass

move_map = {pygame.K_w: ( 0, -1),
            pygame.K_s: ( 0,  1),
            pygame.K_a: (-1,  0),
            pygame.K_d: ( 1,  0)}

def main():
    running = True


    while running:
        screen.fill(white)


        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                print "Exiting game."

        pressed = pygame.key.get_pressed()
        move = [move_map[key] for key in move_map if pressed[key]]
        final = map(sum, zip(*move))
        if final:
            player_rect.move_ip(*final)


        screen.blit(player, player_rect)
        pygame.display.flip()
        print player_rect.x
        print player_rect.y
main()
票数 3
EN

Stack Overflow用户

发布于 2014-04-11 19:34:06

你必须写:

代码语言:javascript
复制
keys = pygame.key.get_pressed()
f keys[pygame.K_w]:
    print('K_w pressed')
elif keys[pygame.K_s]:
    print('K_s pressed')
elif keys[pygame.K_a]:
    print('K_a pressed')
elif keys[pygame.K_d]:
    print('K_d pressed')

for event in pygame.event.get():循环之外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23003459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档