不调用数组中的所有函数

我在我的 Lua 代码中使用了 Corona SDK,我试图从一个屏幕过渡到另一个屏幕,并显示隐藏的对象,alpha = 0,仅通过调整它们的 alpha 值等于 1 来实现。当我运行代码时,它仅对数组中的最后一个元素起作用,但对其余元素没有发生任何变化。我的代码如下。

Main:
--------------------------------------
 local function test2ScreenTransition()
    --获取 level1 和 Menu 文件以供使用
require "Menu"
require "level1"

    --创建一个菜单屏幕,第一个屏幕
local menu = Menu:new();
    --创建第 1 关卡屏幕,创建了隐藏的敌人
local lvl1 = level1;
lvl1.new();

    --当用户按下菜单上的 Play 按钮时,触发事件,转换到第 1 关卡
local onPlayButTouched = function(e)
            --隐藏菜单屏幕
    menu:hide();

            --这里是有问题的函数,应该调用此函数并将对象的 alpha 更改为 1
    lvl1.show();

end
local onMenuHidded = function(e)
    lvl1.isVisible = true;
end
Runtime:addEventListener ( "playButTouched", onPlayButTouched )
Runtime:addEventListener ( "menuHidden", onMenuHidded )

end

level1
------------------------------------------
--新的第 1 关卡表格
level1 = {};
--数组类变量,需要更改 alpha 值的对象
local array = {};

function level1.new()

end

--将对象填充到数组中
function level1.addEnemies()
local Enemy = require "Enemy"
local StartX = 50;
local StartY = 20;
local counter = 0;
for i=0, 17 do
        array[i] = Enemy;
        array[i].new({x=StartX,y=StartY});
        --print(i);
        if counter > 4 then
            StartX = 50;
            StartY = StartY+35;
            counter=0;
        else
            StartX =StartX+35;
            counter = counter+1;
        end
    end
end

--有问题的函数
function level1.show()
    for i = 0, 17 do
        array[i].show();
    end
end

level1.addEnemies();
return level1;

Enemy
---------------------------------
enemy = {};
--表格,包含对象的属性
local Obj = {};

function enemy.new(args)

Obj.x = args.x;
Obj.y = args.y;
Obj.spriteTexFile= "MYIMG.png";
Obj.sprite = display.newImage( Obj.spriteTexFile);
Obj.sprite:setReferencePoint ( display.TopLeftReferencePoint );
Obj.sprite.x = Obj.x;
Obj.sprite.y = Obj.y;
Obj.sprite.alpha = 0;
end

--有问题的函数
function enemy.show()
Obj.sprite.alpha = 1;
end

return enemy;

我注意到它每次处理相同的地址在表格中。我打印出了表格的数字并注意到地址是相同的,这就是为什么只有一个对象会发生变化。但我仍然不明白这是为什么。

点赞
用户33252
用户33252

只有一次代码执行

local Obj = {};

因此你只能制作一个 Enemy

将该行移动到顶部

function enemy.new(args)
  local Obj = {};
  Obj.x = args.x;
  Obj.y = args.y;
  Obj.spriteTexFile= "MYIMG.png";
  Obj.sprite = display.newImage( Obj.spriteTexFile);
  Obj.sprite:setReferencePoint ( display.TopLeftReferencePoint );
  Obj.sprite.x = Obj.x;
  Obj.sprite.y = Obj.y;
  Obj.sprite.alpha = 0;
  return Obj
end

并添加 return Obj,如上所示。

此外,不要使用

    array[i] = Enemy;
    array[i].new({x=StartX,y=StartY});

而要使用

    array[i] = Enemy.new({x=StartX,y=StartY});

否则,array[i] 被设置为类,而不是实例。

现在,在你的版本中

function enemy.show()
  Obj.sprite.alpha = 1;
end

你正在设置唯一的 Enemy 的透明度。 你需要将其更改为使用你想要更改的实例的参数。

看起来你正在尝试创建类和实例。 也许你应该读一下SimpleLuaClasses 这个网页。

在该方法的风格中,可以这样做:

enemy.__index = enemy

function enemy.new(args)
  local Obj = {};
  setmetatable(Obj,enemy) -- make Obj an instance of Enemy
  Obj.x = args.x;
  Obj.y = args.y;
  Obj.spriteTexFile= "MYIMG.png";
  Obj.sprite = display.newImage( Obj.spriteTexFile);
  Obj.sprite:setReferencePoint ( display.TopLeftReferencePoint );
  Obj.sprite.x = Obj.x;
  Obj.sprite.y = Obj.y;
  Obj.sprite.alpha = 0;
  return Obj
end

然后你可以将 show 方法放在其中,而不是 :

function enemy:show()
  self.sprite.alpha = 1;
end

调用方法时,请使用

array[i]:show(); -- note the `:` to pass the instance to the method
2013-05-04 03:07:02