我的班级不适用于这个简单的角色动作脚本

时间:2013-09-08 00:02:28

标签: python class pygame

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,它工作正常。

3 个答案:

答案 0 :(得分:0)

由于movexmovey位于函数内部,因此它们是本地人,它们的值永远不会在函数外部发生变化(它始终为0movex, movey = 0, 0 )。阅读Python中的变量范围。

您必须在global movex类中添加global moveymove,或者在函数上返回movexmovey的值,并使用返回事件捕获循环的值,如:

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

我会重新组织整个事情,并为移动函数而不是类提供单独的文件。

答案 1 :(得分: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对象知道如何改变自己的状态。通过制作将键事件组合映射到方法的字典,您不必拥有那些长if/elif/elif块。您也可以忽略每个keyup事件;除非用户按某个键,否则不要做任何事情。

答案 2 :(得分:0)

稍微放大一下:

movex =- 0.3

你想要

movex -= 0.3

你的版本实际上被python理解为:

movex = (- 0.3)

也就是说,否定0.3并将结果分配给名为movex本地变量,同样地:movex =+ 0.3是"确保0.3是一个数字,并将其分配给movex"。

就地操作员将操作符放在等号之前。修复它会给你一个有用的回溯,告诉你你不能分配一个尚未被声明的变量,因为它仍然像你想要movex和python解释器一样movey是当地人。修复:

def moveLeft(self):
    global movex
    movex -= 0.3