2017-03-14 1 views
0

오브젝트 모듈 내에 리스너 기능을 넣을 수 있습니까?오브젝트 내의 Corona SDK 리스너 기능

표시 객체를 구현하는 Cloud 클래스가 있습니다. 현재 클래스는 이미지 만 만듭니다. 나 자신의 청취자 이벤트를 담당하고 싶기 때문에, 내가 스폰하는 객체마다 addEventListener를 계속 호출 할 필요가 없습니다.

여러 가지 변형을 시도했으며, 항상 청취자 기능을 nil로 지정했습니다. 또한 addEventListener 함수가 main에서 호출되도록 분리하려고했습니다.

개체의 수신기 기능이 지원되지 않는다는 느낌이 들기 시작했습니다. 아마 내가 잘못된 접근법을 취하고 있을까요? 나는 가능한 것을 요구하고 있는가? 그리고 그렇다면, 내가 뭘 잘못하고 있니?

-- 
-- Cloud.lua 
-- 

local Cloud = {} 
local mtaCloud = { __index = cloud } -- metatable 

local display = require "display" 

-- DOESN'T WORK 
function Cloud.scroll(event) 
    img.y = img.y - img.scrollSpeed 
    if (img.y + img.contentWidth) < 0 then 
    img.x = 0 
    img:translate(math.random(1,_W), 1800 ) 
    end 
end 

function Cloud.New(strImage, intHeight, intWidth, intScrollSpeed) 

    local image = display.newImageRect(strImage, intWidth, intHeight) 
    image.anchorX = 0; image.anchorY = 0.5; 
    image.x = _W/2; image.y = _H/2; 
    image.scrollSpeed = 10 
    image.enterFrame = scroll 
    Runtime:addEventListener("enterFrame", scroll) 

    local newCloud = { 

    img = image 

    } 

return setmetatable(newCloud, mtaCloud) 

end 

return Cloud 

-- main.lua (simplified) 
local cloud = require "object.cloud" 

function scene:create(event) 
    local group = self.view 
    cloud = cloud.New("img/cloud.png", 230, 140) 
    group:insert(cloud.img) 
end 

답변

0

예, 당신이 Chapter 16 of Programming in Lua에서 논의 된 일반적인 객체 지향 프로그래밍 의미에서 개체를 의미하는 경우, 객체에 리스너를 설정할 수 있습니다. self 참고 문헌을 제대로 작성해야합니다. 이 대답에서 작동하는 구현을 포함했습니다. 당신은 DisplayObject의에서이 작업을 수행 할 수 있습니다 경우

는 잘 모르겠어요,하지만 당신이 당신의 예에서 뭘하고 있었는지되지 않습니다 중 하나 (한 DisplayObject은 테이블 newCloud 어떤 생성자 Cloud.New()에 의해 반환하지 image 이는).

여기에는 확실하게 작동하는 한 가지 방법이 있습니다. 귀하의 Cloud.lua는 다음과 같이해야한다 (나는 시험이 처음 구현에 ShapeObjects을 사용한 적이을, 당신은 당신의 이미지 자산을 사용하여 변경할 것) :

-- Cloud.lua 

local Cloud = {} 

function Cloud:scroll() 

    self.img.x = self.img.x + self.scrollSpeed 
    if self.img.x >= display.contentWidth + self.img.contentWidth then 
     self.img.x = - self.img.contentWidth 
    end 

end 

function Cloud:enterFrame(event) 
    self:scroll() 
end 

function Cloud:new(intHeight, intWidth, intScrollSpeed) 

    local aCloud = {} 

    local img = display.newRect(0, 0, intWidth, intHeight) 
    img:setFillColor(1) 

    aCloud.img = img 
    aCloud.scrollSpeed = intScrollSpeed 
    aCloud.id = id 

    setmetatable(aCloud, self) 
    self.__index = self 

    Runtime:addEventListener("enterFrame", aCloud) 

    return aCloud 

end 

return Cloud 

주목하라 setmetatableCloud:new() 기능에self.__index = self. 이것이 핵심입니다. 나는 "점 표기법"에 대한 문법 설탕입니다 함수 정의에서 "콜론 표기"(예. Cloud:new(...))를 사용했습니다

은 당신이 사용하는 함수의 첫 번째 인수는 self (예. Cloud.new(self, ...))입니다.

또한 개체 (테이블) 수신기 (함수 아님)를 사용하고 있습니다. 각 enterFrame 이벤트에서 런타임은 enterFrame() 함수를 호출합니다 (지정된 테이블에서 찾을 수 있음). 도움이

local cloud = require("objects.Cloud") 

local maxScrollRate = 4 
local cloud1 = cloud:new(100, 50, 1 + math.random(maxScrollRate) ) 
cloud1.img.x = 200 
cloud1.img.y = 200 
sceneGroup:insert(cloud1.img) 

local cloud2 = cloud:new(100, 50, 1 + math.random(maxScrollRate)) 
cloud2.img.x = 100 
cloud2.img.y = 400 
sceneGroup:insert(cloud2.img) 

희망 "Cloud.lua"라는 이름의 파일을 가정

scene에서 프로젝트 하위 디렉토리 "객체"에서 찾을 수 있습니다, 당신은 같은 것을 할 것입니다.