0

コロナのサンプルコードからFishiesプロジェクトを分析していますが、その割り当てを理解できませんでした。

background = ( backgroundLandscape == background and backgroundPortrait ) or backgroundLandscape

完全なコードは次のとおりです。

-- Seed randomizer
local seed = os.time(); 
math.randomseed( seed )

display.setStatusBar( display.HiddenStatusBar )

-- Preload the sound file (theoretically, we should also dispose of it when we are completely done with it)
local soundID = audio.loadSound( "bubble_strong_wav.wav" ) 

 -- Background
 local halfW = display.viewableContentWidth / 2
 local halfH = display.viewableContentHeight / 2

 -- Create a table to store all the fish and register this table as the 
 -- "enterFrame" listener to animate all the fish.
 local bounceAnimation = {
container = display.newRect( 0, 0, display.viewableContentWidth, display.viewableContentHeight ),
reflectX = true,
 }

 local backgroundPortrait = display.newImage( "aquariumbackgroundIPhone.jpg", 0, 0 )
 local backgroundLandscape = display.newImage( "aquariumbackgroundIPhoneLandscape.jpg", -80, 80 )
 backgroundLandscape.isVisible = false
 local background = backgroundPortrait


 -- Handle changes in orientation for the background images
 local backgroundOrientation = function( event )
-- TODO: This requires some setup, i.e. the landscape needs to be centered
-- Need to add a centering operation.  For now, the position is hard coded
local delta = event.delta
if ( delta ~= 0 ) then
    local rotateParams = { rotation=-delta, time=500, delta=true }

    if ( delta == 90 or delta == -90 ) then
        local src = background

        -- toggle background to refer to correct dst
        background = ( backgroundLandscape == background and backgroundPortrait ) or       backgroundLandscape
        background.rotation = src.rotation
        transition.dissolve( src, background )
        transition.to( src, rotateParams )
    else
        assert( 180 == delta or -180 == delta )
    end

    transition.to( background, rotateParams )

    audio.play( soundID )           -- play preloaded sound file
end
 end

 -- Add a global listener
 Runtime:addEventListener( "orientation", backgroundOrientation )      
 -- 
 -- Fishies
 local numFish = 10
 local file1 = "fish.small.red.png"
 local file2 = "fish.small.blue.png"      
 --  
 -- Define touch listener for fish so that fish can behave like buttons.
 -- The listener will receive an 'event' argument containing a "target" property
 -- corresponding to the object that was the target of the interaction.
 -- This eliminates closure overhead (i.e. the need to reference non-local variables )
 local buttonListener = function( event )
if "ended" == event.phase then
    local group = event.target

    -- tap only triggers change from original to different color
    local topObject = group[1]

    if ( topObject.isVisible ) then
        local bottomObject = group[2]

        -- Dissolve to bottomObject (different color)
        transition.dissolve( topObject, bottomObject, 500 )

        -- Restore after some random delay
        transition.dissolve( bottomObject, topObject, 500, math.random( 3000, 10000 ) )
    end

    -- we handled it so return true to stop propagation
    return true
end
  end                                        
  -- 
  -- 


 -- 
 -- Add fish to the screen
 for i=1,numFish do
-- create group which will represent our fish, storing both images (file1 and file2)
local group = display.newGroup()

local fishOriginal = display.newImage( file1 )
group:insert( fishOriginal, true )  -- accessed in buttonListener as group[1]

local fishDifferent = display.newImage( file2 )
group:insert( fishDifferent, true ) -- accessed in buttonListener as group[2]
fishDifferent.isVisible = false -- make file2 invisible

-- move to random position in a 200x200 region in the middle of the screen
group:translate( halfW + math.random( -100, 100 ), halfH + math.random( -100, 100 ) )

-- connect buttonListener. touching the fish will cause it to change to file2's image
group:addEventListener( "touch", buttonListener )

-- assign each fish a random velocity
group.vx = math.random( 1, 5 )
group.vy = math.random( -2, 2 )

-- add fish to animation group so that it will bounce
bounceAnimation[ #bounceAnimation + 1 ] = group
 end                                                       
 -- 
 -- Function to animate all the fish
 function bounceAnimation:enterFrame( event )
local container = self.container
container:setFillColor( 0, 0, 0, 0)     -- make invisible
local containerBounds = container.contentBounds
local xMin = containerBounds.xMin
local xMax = containerBounds.xMax
local yMin = containerBounds.yMin
local yMax = containerBounds.yMax

local orientation = self.currentOrientation
local isLandscape = "landscapeLeft" == orientation or "landscapeRight" == orientation

local reflectX = nil ~= self.reflectX
local reflectY = nil ~= self.reflectY

-- the fish groups are stored in integer arrays, so iterate through all the 
-- integer arrays
for i,v in ipairs( self ) do
    local object = v  -- the display object to animate, e.g. the fish group
    local vx = object.vx
    local vy = object.vy

    if ( isLandscape ) then
        if ( "landscapeLeft" == orientation ) then
            local vxOld = vx
            vx = -vy
            vy = -vxOld
        elseif ( "landscapeRight" == orientation ) then
            local vxOld = vx
            vx = vy
            vy = vxOld
        end
    elseif ( "portraitUpsideDown" == orientation ) then
        vx = -vx
        vy = -vy
    end

    -- TODO: for now, time is measured in frames instead of seconds...
    local dx = vx
    local dy = vy

    local bounds = object.contentBounds

    local flipX = false
    local flipY = false

    if (bounds.xMax + dx) > xMax then
        flipX = true
        dx = xMax - bounds.xMax
    elseif (bounds.xMin + dx) < xMin then
        flipX = true
        dx = xMin - bounds.xMin
    end

    if (bounds.yMax + dy) > yMax then
        flipY = true
        dy = yMax - bounds.yMax
    elseif (bounds.yMin + dy) < yMin then
        flipY = true
        dy = yMin - bounds.yMin
    end

    if ( isLandscape ) then flipX,flipY = flipY,flipX end
    if ( flipX ) then
        object.vx = -object.vx
        if ( reflectX ) then object:scale( -1, 1 ) end
    end
    if ( flipY ) then
        object.vy = -object.vy
        if ( reflectY ) then object:scale( 1, -1 ) end
    end

    object:translate( dx, dy )
end
 end

 -- Handle orientation of the fish
 function bounceAnimation:orientation( event )
print( "bounceAnimation" )
for k,v in pairs( event ) do
    print( "   " .. tostring( k ) .. "(" .. tostring( v ) .. ")" )
end

if ( event.delta ~= 0 ) then
    local rotateParameters = { rotation = -event.delta, time=500, delta=true }

    Runtime:removeEventListener( "enterFrame", self )
    self.currentOrientation = event.type

    for i,object in ipairs( self ) do
        transition.to( object, rotateParameters )
    end

    local function resume(event)
        Runtime:addEventListener( "enterFrame", self )
    end

    timer.performWithDelay( 500, resume )
end
 end

 Runtime:addEventListener( "enterFrame", bounceAnimation );
 Runtime:addEventListener( "orientation", bounceAnimation )


 -- This function is never called, 
 -- but shows how we would unload the sound if we wanted to
 function unloadSound()
audio.dispose(soundID)
soundID = nil
 end
4

2 に答える 2

5

Luaは、andsとorsに関しては少し奇妙な振る舞いをします。

式は、falseと見なされる場合にa and b評価され(のみ、falseと見なされ、0を含む他のすべての値はtrueと見なされます)、trueと見なされる場合、式はに評価されます。aanilfalseab

式は、 ifがtrueと見なされ、ifがfalseと見なされるとa or b評価されます。aaba

注:どちらの場合も、式がaその値に評価された場合、の値は評価bされません。これは短絡論理と呼ばれます。andifaがfalseの場合、はandtrueになる可能性がないため、を評価するために計算時間を無駄にする意味はありませんb。同様に、aがtrueの場合、はfalseになる可能性がないa or bため、評価する意味はありbません。or

構文cond and valiftrue or valiffalse(または演算子の優先順位による同等のもの(cond and valiftrue) or valiffalse)は、他の言語の三項ifステートメントと同等ですが、注意点が1つあります。falseとvaliftrue評価してはなりません。その場合、式全体は常にに評価されvaliffalseます。(試してみて、それを推論してください。これが、この構成を把握するための最良の方法です。)

于 2012-06-21T08:45:36.243 に答える
1

詳細を投稿しようとしていましたが、@JPvdMerweがそれを見つけました。

正確には、

background = ( backgroundLandscape == background and backgroundPortrait ) or backgroundLandscape

に変換されます

if backgroundLandscape == background then 
    background = backgroundPortrait
else 
    background = backgroundLandscape
end

編集

@JPvdMerweが指摘したように、この場合、backgroundPortraitがfalseの場合、

background = backgroundLandscape

常に実行されます。

于 2012-06-21T08:49:54.607 に答える