-3

我正在制作这个游戏,它曾经可以工作,但是当我尝试编辑它时,它给了我一个错误。这是代码和错误:

import pygame
from pygame import *

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

DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 32
FLAGS = 0
CAMERA_SLACK = 30

Currentlvl = 'L_1'

def Main():
    global cameraX, cameraY
    pygame.init()
    screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
    pygame.display.set_caption("Adventure/RPG!")
    timer = pygame.time.Clock()

    up = down = left = right = running = False
    bg = Surface((32,32))
    bg.convert()
    bg.fill(Color("#000000"))
    entities = pygame.sprite.Group()
    player = Player(32, 32)
    Borders = []
    Trees = []

    x = y = 0
    for row in Currentlvl :
        for col in row:
            if col == "B":
                b = Border(x, y)
                Borders.append(b)
                entities.add(b)
            if col == "T":
                t = Tree(x, y)
                Trees.append(t)
                entities.add(t)
        x += 32
    y += 32
    x = 0
    if Currentlvl == L_1:
        L_1 = [
            "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",]
    if Currentlvl == L_2:
        L_2 = [
            "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                      T                   B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "B              T                           B",
            "B                                          B",
            "B                                          B",
            "B                                          B",
            "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",]

    total_level_width = len(Currentlvl)*32
    total_level_height = len(Currentlvl)*32
    camera = Camera(complex_camera, total_level_width, total_level_height)
    entities.add(player)

    while 1:
        time.tick(60)

        for e in pygame.event.get():
            if e.type == QUIT: raise SystemExit, "QUIT"
            if e.type == KEYDOWN and e.key == K_ESCAPE:
                raise SystemExit, "ESCAPE"
            if e.type == KEYDOWN and e.key == K_UP:
                up = True
            if e.type == KEYDOWN and e.key == K_DOWN:
                down = True
            if e.type == KEYDOWN and e.key == K_LEFT:
                left = True
            if e.type == KEYDOWN and e.key == K_RIGHT:
                right = True
            if e.type == KEYDOWN and e.key == K_SPACE:
                running = True

            if e.type == KEYUP and e.key == K_UP:
                up = False
            if e.type == KEYUP and e.key == K_DOWN:
                down = False
            if e.type == KEYUP and e.key == K_RIGHT:
                right = False
            if e.type == KEYUP and e.key == K_LEFT:
                left = False
        for y in range(32):
            for x in range(32):
                screen.blit(bg, (x * 32, y * 32))

        camera.update(player)

        player.update(up, down, left, right, running, Borders, Trees)
        for e in entities:
            screen.blit(e.image, camera.apply(e))

        pygame.display.update()

class Camera(object):
    def __init__(self, camera_func, width, height):
        self.camera_func = camera_func
        self.state = Rect(0, 0, width, height)

    def apply(self, target):
        return target.rect.move(self.state.topleft)

    def update(self, target):
        self.state = self.camera_func(self.state, target.rect)

def simple_camera(camera, target_rect):
    l, t, _, _ = target_rect
    _, _, w, h = camera
    return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h)

def complex_camera(camera, target_rect):
    l, t, _, _ = target_rect
    _, _, w, h = camera
    l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h

    l = min(0, l)                           # stop scrolling at the left edge
    l = max(-(camera.width-WIN_WIDTH), l)   # stop scrolling at the right edge
    t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling at the bottom
    t = min(0, t)                           # stop scrolling at the top
    return Rect(l, t, w, h)

class Entity(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

class Player(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.xvel = 0
        self.yvel = 0
        self.onGround = False
        self.image = Surface((32,32))
        self.image.fill(Color("#0000FF"))
        self.image.convert()
        self.rect = Rect(x, y, 32, 32)

    def update(self, up, down, left, right, running, platforms):
        if up:
            # only jump if on the ground
            if self.onGround: self.yvel -= 10
        if down:
            pass
        if running:
            self.xvel = 12
        if left:
            self.xvel = -8
        if right:
            self.xvel = 8
        if not self.onGround:
            # only accelerate with gravity if in the air
            self.yvel += 0.3
            # max falling speed
            if self.yvel > 100: self.yvel = 100
        if not(left or right):
            self.xvel = 0
        # increment in x direction
        self.rect.left += self.xvel
        # do x-axis collisions
        self.collide(self.xvel, 0, platforms)
        # increment in y direction
        self.rect.top += self.yvel
        # assuming we're in the air
        self.onGround = False;
        # do y-axis collisions
        self.collide(0, self.yvel, platforms)

    def collide(self, xvel, yvel, platforms):
        for p in platforms:
            if pygame.sprite.collide_rect(self, p):
                if isinstance(p, ExitBlock):
                    pygame.event.post(pygame.event.Event(QUIT))
                if xvel > 0:
                    self.rect.right = p.rect.left
                if xvel < 0:
                    self.rect.left = p.rect.right
                if yvel > 0:
                    self.rect.bottom = p.rect.top
                    self.onGround = True
                    self.yvel = 0
                if yvel < 0:
                    self.rect.top = p.rect.bottom
class Tree(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.image = Surface((32, 32))
        self.image.convert()
        self.image.fill(Color("#DDDDDD"))
        self.rect = Rect(x, y, 32, 32)

class Border(Entity):
    def __init__(self, x, y):
        Entity.__init__(self)
        self.image = Surface((32, 32))
        self.image.convert()
        self.image.fill(Color("#DDDDDD"))
        self.rect = Rect(x, y, 32, 32)

    def update(self):
        pass

if __name__ == "__Main__":
    display.update()
    Main ()

回溯(最后一次调用):
文件“C:\Users\Owner\Desktop\Python\BlankTemplate.py”,第 256 行,在 main()
文件“C:\Users\Owner\Desktop\Python\BlankTemplate.py”中,第 141 行,在 main player.update(up, down, left, right, running, Borders)
文件“C:\Users\Owner\Desktop\Python\BlankTemplate.py”,第 211 行,在更新 self.collide(self .xvel, 0, 平台)
文件“C:\Users\Owner\Desktop\Python\BlankTemplate.py”,第 220 行,在边界中的 p 冲突中:NameError:未定义全局名称“边界”

4

1 回答 1

3

你的代码是正确的。您的回溯与您的代码不匹配。

for p in platforms:是它应该在collide类的功能Player。在您发布的代码中,它有这个,在回溯中,它没有。

之所以不能说for p in Borders是因为Borders是在函数中局部定义的Main()。除非您将其全球化,否则您只能在该主要功能中访问它。但是您已将它传递给另一个函数,您应该这样做。

于 2013-09-26T00:23:56.100 回答