0
import pygame, sys
from pygame.locals import *

bifl = 'screeing.jpg'
milf = 'char_fowed_walk1.png'

pygame.init()

screen = pygame.display.set_mode((640, 360),0, 32)
background = pygame.image.load(bifl).convert()
mouse_c = pygame.image.load(milf).convert_alpha()

x, y = 0, 0
movex, movey = 0, 0


class move:
    def moveUp():
        movey =- 0.3
    def moveDown():
        movey =+ 0.3
    def moveLeft():
        movex =- 0.3
    def moveRight():
        movex =+ 0.3

    def stopUp():
        movey = 0
    def stopDown():
        movey = 0
    def stopLeft():
        movex = 0
    def stopRight():
        movex = 0




while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                move.moveLeft()
            elif event.key == K_RIGHT:
                move.moveRight()
            elif event.key == K_UP:
                move.moveUp()
            elif event.key == K_DOWN:
                move.moveDown()

        if event.type == KEYUP:
             if event.key == K_LEFT:
                 move.stopLeft()
             elif event.key == K_RIGHT:
                 move.stopRight()
             elif event.key == K_UP:
                 move.stopUp()
             elif event.key == K_DOWN:
                 move.stopDown()

    x += movex
    y += movey

    screen.blit(background, (0, 0))
    screen.blit(mouse_c, (x, y))

    pygame.display.update()

これを実行すると、プレーヤーが動かないことだけがすべて機能します。クラスと関数なしでこれをテストすると、追加したクラスと関係があることは間違いありません。pygame は正しくインストールされています。私は python 2.7 を使用しています。他のスクリプトで pygame を使用しましたが、正常に動作します。

4

3 に答える 3

0

movexとは関数内にあるためmovey、それらはローカルであり、それらの値は関数の外で変更されることはありません (常に行0から変更されmovex, movey = 0, 0ます)。Python の変数スコープについて読んでください。

クラス内にglobal movexandを配置するか、関数でandの値を返し、次のようにイベント キャプチャ ループでその戻り値を使用する必要があります。global moveymovemovexmovey

if event.key == K_LEFT:
    y += move.stopLeft()

ただし、全体を再編成し、クラスの代わりに移動関数用に別のファイルを作成します。

于 2013-09-08T00:18:41.220 に答える
0

少しズームイン:

movex =- 0.3

あなたがしたい

movex -= 0.3

あなたのバージョンは、実際にはpythonによって次のように理解されます。

movex = (- 0.3)

0.3つまり、結果を否定して という名前のローカル変数に代入しますmovex。同様に、 movex =+ 0.3 「0.3 が数値であることを確認して、それを movex に代入する」ということです。

インプレース演算子は、演算子を等号の前に置きます。それを修正するだけで、まだ宣言されていない変数を割り当てることはできないことを示す、多少役立つトレースバックが得られます。これは、Python インタープリターが必要に応じてローカルであるように見えるためmovexですmovey。それを修正すると、次のようになります。

def moveLeft(self):
    global movex
    movex -= 0.3 
于 2013-09-08T01:42:34.530 に答える
0

私はまったく異なるアプローチを取り、x/y 座標を、それらを変更する方法を知っているオブジェクトに保存します。

import pygame, sys
from pygame.locals import *

class Position(object):
    def __init__(self):
        self.x = 0
        self.y = 0

    def moveUp(self):
        self.y =- 0.3

    def moveDown(self):
        self.y =+ 0.3

    def moveLeft(self):
        self.x =- 0.3

    def moveRight(self):
        self.x =+ 0.3

pos = Position()

movemap = {
    (KEYDOWN, K_LEFT): pos.moveLeft,
    (KEYDOWN, K_RIGHT): pos.moveRight,
    (KEYDOWN, K_UP): pos.moveUp,
    (KEYDOWN, K_DOWN): pos.moveDown,
}

bifl = 'screeing.jpg'
milf = 'char_fowed_walk1.png'

pygame.init()

screen = pygame.display.set_mode((640, 360),0, 32)
background = pygame.image.load(bifl).convert()
mouse_c = pygame.image.load(milf).convert_alpha()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

        try:
            action = movemap[(event.type, event.key)]
        except KeyError:
            continue

        action()

    screen.blit(background, (0, 0))
    screen.blit(mouse_c, (pos.x, pos.y))

    pygame.display.update()

まず、Pythony のもの: Python 2.7 では、クラスは から明示的に継承する必要がありobjectます。それがそのclass Position(object)部分です。また、インスタンス メソッドの最初の引数はインスタンス オブジェクトです。それがすべてselfです。最後に、通常の関数をクラスに入れる必要はありませんdosomething(): return 5モジュールの最上位に関数を配置してもまったく問題ありません。

さて、残りに進みます:

オブジェクトは、自身の状態を変更するPosition方法を知っています。キー イベントの組み合わせをメソッドにマップする dict を作成することで、それらの長いif/elif/elifブロックを用意する必要がなくなります。すべての keyup イベントを無視することもできます。ユーザーがキーを押していない限り、何もしないでください。

于 2013-09-08T01:15:25.560 に答える