类型 函数 返回值 ImageInfo 修订 2024.3703 版 关键词 steam、steamworks、achievements、getAchievementImageInfo 另请参见 steamworks.newImageRect() steamworks.newTexture() steamworks.*
返回一个 ImageInfo 对象。它提供有关一个成就图像的信息,例如其像素宽度、像素高度和唯一的图像句柄。该对象的 imageHandle 属性对于通过 steamworks.newImageRect() 和 steamworks.newTexture() 函数加载图像是必需的。
返回的 ImageInfo 对象总是会引用与该成就的当前锁定或解锁状态匹配的图像。例如,如果成就当前处于锁定状态,则返回的 ImageInfo 对象将引用锁定的成就图像。如果成就解锁,则返回的 ImageInfo 对象将引用解锁的成就图像。
在以下情况下,此函数通常会返回 nil
此外,此函数在以下情况下 始终 返回 nil
指定了无效的成就名称。
steamworks.isLoggedOn 属性为 false,表示应用程序当前未连接到 Steam 客户端。
图像尚未从 Steam 下载。在这种情况下,下载后将分发 achievementImageUpdate 事件。
steamworks.getAchievementImageInfo( achievementName )
字符串。 在 Steamworks 网站上,这是在
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