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

由于movexmovey在函数内部,它们是局部变量,它们的值永远不会在函数外部改变(它将始终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

我会采取完全不同的方法并将您的 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 回答
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 回答