steamworks.getAchievementImageInfo()

类型 函数
返回值 ImageInfo
修订 2024.3703 版
关键词 steam、steamworks、achievements、getAchievementImageInfo
另请参见 steamworks.newImageRect()
steamworks.newTexture()
steamworks.*

概述

返回一个 ImageInfo 对象。它提供有关一个成就图像的信息,例如其像素宽度、像素高度和唯一的图像句柄。该对象的 imageHandle 属性对于通过 steamworks.newImageRect()steamworks.newTexture() 函数加载图像是必需的。

返回的 ImageInfo 对象总是会引用与该成就的当前锁定或解锁状态匹配的图像。例如,如果成就当前处于锁定状态,则返回的 ImageInfo 对象将引用锁定的成就图像。如果成就解锁,则返回的 ImageInfo 对象将引用解锁的成就图像。

疑难解答

在以下情况下,此函数通常会返回 nil

此外,此函数在以下情况下 始终 返回 nil

语法

steamworks.getAchievementImageInfo( achievementName )
achievementName (必需)

字符串 在 Steamworks 网站上,这是在API 名称进度状态列下成就集的唯一名称。

示例

local steamworks = require( "plugin.steamworks" )

-- Creates a new display object which will automatically be "filled" with an achievement image
-- Image will be associated with the given unique achievement name
-- Image will automatically change when achievement changes from locked to unlocked
local function newSteamAchievementImage( achievementName )

    -- Create a rectangle which we'll later fill with the achievement image
    -- Note that Steam expects you to upload 64x64 pixel achievement images
    local defaultAchievementPixelSize = 64
    local achievementImage = display.newRect(
            display.contentCenterX, display.contentCenterY,
            defaultAchievementPixelSize * display.contentScaleX,
            defaultAchievementPixelSize * display.contentScaleY )
    if ( achievementImage == nil ) then
        return nil
    end

    -- Updates the achievement display object's "fill" to show the newest image
    local function updateAchievementTexture()
        -- Attempt to fetch info about the achievement's image
        -- Note that this function is likely to return nil on app startup
        local imageInfo = steamworks.getAchievementImageInfo( achievementName )
        if ( imageInfo == nil ) then
            return
        end

        -- Load the achievement image into a new texture resource object
        local newTexture = steamworks.newTexture( imageInfo.imageHandle )
        if ( newTexture == nil ) then
            return
        end

        -- Update the display object to show the achievement image
        achievementImage.fill =
        {
            type = "image",
            filename = newTexture.filename,
            baseDir = newTexture.baseDir
        }

        -- Release the texture reference created above
        newTexture:releaseSelf()
    end

    -- Attempt to update the display object with Steam's current image, if available
    -- If not currently available, this function call will trigger Steam to download it
    -- In this case, it dispatches an "achievementImageUpdate" event to be received below
    updateAchievementTexture()

    -- Set up a listener to be called when an achievement's image/status has changed
    local function onAchievementUpdated( event )
        if ( event.achievementName == achievementName ) then
            updateAchievementTexture()
        end
    end
    steamworks.addEventListener( "achievementImageUpdate", onAchievementUpdated )
    steamworks.addEventListener( "achievementInfoUpdate", onAchievementUpdated )

    -- Set up a listener to be called when the achievement display object is being removed
    local function onFinalizing( event )
        -- Remove event listeners which were added above
        steamworks.removeEventListener( "achievementImageUpdate", onAchievementUpdated )
        steamworks.removeEventListener( "achievementInfoUpdate", onAchievementUpdated )
    end
    achievementImage:addEventListener( "finalize", onFinalizing )

    -- Return the achievement display object created above
    return achievementImage
end

-- Lock all achievements and reset all user stats on startup
-- Note that this is for testing purposes (don't do this in a published game!)
steamworks.resetUserProgress()

-- Display image of "Achievement 1"
local achievement1 = newSteamAchievementImage( "Achievement 1" )
if ( achievement1 ) then
    achievement1.x = display.contentWidth * 0.25
    achievement1.y = display.contentCenterY
    -- Add functionality to unlock achievement upon click
    function achievement1:tap( event )
        steamworks.setAchievementUnlocked( "Achievement 1" )
    end
    achievement1:addEventListener( "tap" )
end

-- Display image of "Achievement 2"
local achievement2 = newSteamAchievementImage( "Achievement 2" )
if ( achievement2 ) then
    achievement2.x = display.contentWidth * 0.75
    achievement2.y = display.contentCenterY
    -- Add functionality to unlock achievement upon click
    function achievement2:tap( event )
        steamworks.setAchievementUnlocked( "Achievement 2" )
    end
    achievement2:addEventListener( "tap" )
end