1

我正在设计一个游戏,需要将脚本变量从米转换为像素。我的转换系数是 30;30 像素到 1 米。我有三个级别的代码:我的游戏引擎、游戏级别和我的脚本。

游戏引擎从基类创建一个新的游戏关卡“curmap”。游戏中的每一帧,引擎都会调用 curmap.animate,它会返回一个列表,其中列出了游戏中每个对象在何处被 blit'ed。关卡遍历关卡中的每个对象,并在每个对象上调用 animate。

我的问题

我遇到的问题是,在 Level-animate 方法中,player-animate 方法正在返回对 player-class-variables 的直接引用。Level-animate 中的两行注释仅用于更改返回值,但它们正在修改玩家变量。我无法在测试课上重现这一点,所以我完全不知所措。

如何在不更改播放器脚本的情况下取消注释这两个内联乘法语句?

游戏引擎:

# fps is an instance of pygame.time.clock()
# events is a modified list of pygame.event.get()

for item in curmap.animate(fps.tick()/1000, events):
    screen.blit(curmap.assets['textures'][item[0]],item[1],item[2])

等级:

def animate(self, timedelta, events):
    returns = []
    for item in self.objects:
        ret = item.animate(timedelta, events)

        #ret[1][0] *= 30
        #ret[1][1] *= 30

        returns.append(ret)
    return returns

播放器脚本:

def animate(self, timedelta, input):
    # Process Inputs
    for item in input['keydown']:
        self.keydown.append(item)
    for item in input['keyup']:
        self.keydown.remove(item)

    # Change Velocity and Position
    if "left" in self.keydown:
        self.velocity[0] = 5
    elif 'right' in self.keydown:
        self.velocity[0] = -5
    else: self.velocity[0] = 0
    print(self.position, self.velocity)
    self.position[0] += self.velocity[0]*timedelta
    self.position[1] += self.velocity[1]*timedelta


    # Change Sprite
    self.time += timedelta
    if self.time > self.altertime:
        self.current = (self.current+1)%2
        self.time -= self.altertime

    return [self.image, self.position, self.sprite[self.current] + self.dimensions]
4

1 回答 1

2

你没有说self.position你的方法到底是什么Player.animate,但如果它是一个包含数值的简单列表,只需复制这个列表:

return [self.image, self.position[:], self.sprite[self.current] + self.dimensions]

您正在返回 list Player.position,当您在 中更改它(更改列表中的值)时Level.animate,您实际上是在更改Player.position,因为您正在处理同一个列表。

于 2013-01-28T08:14:50.277 回答