1

わかりましたので、私のコードは以下のとおりです。現在、私はpygameが初めてで、画面上で画像を移動する方法を理解しようとしています。私がpygameについて見てきたことから、次のコードは画像を上に移動する必要があります(現在可能な唯一の移動)。しかし、押し上げても画像が動かない。Python は、システム トレイに印刷されているため、私が押し上げていることを認識していますが、動きがありません。誰か助けてもらえますか?

import pygame, sys
from pygame.locals import *

FPS = 30


WIN_WIDTH = 800
WIN_HEIGHT = 600
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)

COLOR = (255, 0, 255)
IMAGE = pygame.image.load('squirrel.png')
STARTSIZE = 25

LEFT = 'left'

def main():
    pygame.init()
    FPS_CLOCK = pygame.time.Clock()
    movement = 1

    moveUp = False

    DISPLAY_SURFACE = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))

    while True:
        DISPLAY_SURFACE.fill(COLOR)

        playerObj = {'surface': pygame.transform.scale(IMAGE, (STARTSIZE, STARTSIZE)),
                     'facing': LEFT,
                     'size': STARTSIZE,
                     'x': HALF_WIDTH,
                     'y': HALF_HEIGHT}

        playerObj['rect'] = pygame.Rect( (playerObj['x'], playerObj['y'], playerObj['size'], playerObj['size']) )
        DISPLAY_SURFACE.blit(playerObj['surface'], playerObj['rect'])


        for event in pygame.event.get():

            if event.type == KEYDOWN:
                if event.key == K_UP:
                    moveUp = True

            if event.type == KEYUP:
                if event.key == K_UP:
                    moveUp = False

            elif event.type == QUIT:
                pygame.quit()
                sys.exit()

        if moveUp:
            playerObj['y'] += movement
            print("moving up")

        else:
            print('stopped')

        pygame.display.update()
        FPS_CLOCK.tick(FPS)

if __name__ == '__main__':
    main()
4

2 に答える 2

1

while ループを反復するたびに新しい playerObj を作成しているため、移動することはありません (毎回「y」値を HALF_HEIGHT に設定しているため)。playerObj 定義を while ループの外に移動します。

于 2013-01-09T06:53:45.607 に答える
0

while ループに入る前に playerObj を作成し、毎回にのみ描画する必要がありますDISPLAY_SURFACE。また、辞書のキーを増やしてyも役に立ちませんrect。代わりに変更する必要があります。低侵襲のソリューションは次のようになります。

import pygame, sys
from pygame.locals import *

FPS = 30


WIN_WIDTH = 800
WIN_HEIGHT = 600
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)

COLOR = (255, 0, 255)
IMAGE = pygame.image.load('squirrel.png')
STARTSIZE = 25

LEFT = 'left'

def main():
    pygame.init()
    FPS_CLOCK = pygame.time.Clock()
    movement = 1

    moveUp = False

    DISPLAY_SURFACE = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))

    playerObj = {'surface': pygame.transform.scale(IMAGE, (STARTSIZE, STARTSIZE)),
                     'facing': LEFT,
                     'size': STARTSIZE,
                     'x': HALF_WIDTH,
                     'y': HALF_HEIGHT}

    playerObj['rect'] = pygame.Rect( (playerObj['x'], playerObj['y'], playerObj['size'], playerObj['size']) )

    while True:
        DISPLAY_SURFACE.fill(COLOR)
        DISPLAY_SURFACE.blit(playerObj['surface'], playerObj['rect'])
        for event in pygame.event.get():

            if event.type == KEYDOWN:
                if event.key == K_UP:
                    moveUp = True

            if event.type == KEYUP:
                if event.key == K_UP:
                    moveUp = False

            elif event.type == QUIT:
                pygame.quit()
                sys.exit()

        if moveUp:
            playerObj['rect'].y -= movement
            print("moving up")

        else:
            print('stopped')

        pygame.display.update()
        FPS_CLOCK.tick(FPS)

if __name__ == '__main__':
    main()

それは機能します、私はそれを自分で試しました。ただし、コードをリファクタリングする必要があります。最初の x、y などの値を辞書に保持する必要はありません。

編集 4 方向すべてに移動すると、次のようになります。

import pygame, sys
from pygame.locals import *

FPS = 30


WIN_WIDTH = 800
WIN_HEIGHT = 600
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)

COLOR = (255, 0, 255)
IMAGE = pygame.image.load('squirrel.png')
STARTSIZE = 25

LEFT = 'left'

def move_rect(rect, key, distance):
    if key == K_UP: 
        rect.y-=distance
    elif key == K_DOWN: 
        rect.y+=distance
    elif key == K_LEFT: 
        rect.x-=distance
    elif key == K_RIGHT: 
        rect.x+=distance

def main():
    pygame.init()
    FPS_CLOCK = pygame.time.Clock()
    movement = 1

    key2mvmt = {K_UP:False, K_DOWN:False, K_LEFT:False, K_RIGHT:False}

    DISPLAY_SURFACE = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))

    playerObj = {'surface': pygame.transform.scale(IMAGE, (STARTSIZE, STARTSIZE)),
                     'facing': LEFT,
                     'size': STARTSIZE,
                     'x': HALF_WIDTH,
                     'y': HALF_HEIGHT}

    playerObj['rect'] = pygame.Rect( (playerObj['x'], playerObj['y'], playerObj['size'], playerObj['size']) )

    while True:
        DISPLAY_SURFACE.fill(COLOR)
        DISPLAY_SURFACE.blit(playerObj['surface'], playerObj['rect'])
        for event in pygame.event.get():

            if event.type == KEYDOWN:
                if key2mvmt.has_key(event.key):
                    key2mvmt[event.key]= True

            if event.type == KEYUP:
                if key2mvmt.has_key(event.key):
                    key2mvmt[event.key]= False

            elif event.type == QUIT:
                pygame.quit()
                sys.exit()

        for k in key2mvmt.keys():
            if key2mvmt[k]:
                move_rect(playerObj['rect'], k, movement)

        else:
            print('stopped')

        pygame.display.update()
        FPS_CLOCK.tick(FPS)

if __name__ == '__main__':
    main()
于 2013-01-09T07:07:45.723 に答える