i have read the Example: A screen shake effect using setOffset in the document . it is great .
but how if just want to shake some sprites only (for example , a group of sprites only ) ?
is that any hints ?
thx !
1 Like
Here is a working example and demonstration of shaking groups of sprites.
import 'CoreLibs/timer'
local SPRITE_SIZE <const> = 32
local SPRITE_SPACING <const> = SPRITE_SIZE + 10
local SPRITE_GROUP_COUNT <const> = 5
local SPRITES_PER_GROUP <const> = 5
local SHAKE_INTERVAL <const> = 3000
local MOVEMENT_INTERVAL <const> = 20
local spriteImage <const> = playdate.graphics.image.new(SPRITE_SIZE, SPRITE_SIZE, playdate.graphics.kColorBlack)
local spriteGroups <const> = {}
for i = 1, SPRITE_GROUP_COUNT do
local sprites <const> = {}
for j = 1, SPRITES_PER_GROUP do
local sprite <const> = playdate.graphics.sprite.new(spriteImage)
sprite.referenceX = i * SPRITE_SPACING
sprite.referenceY = j * SPRITE_SPACING
sprite:moveTo(sprite.referenceX, sprite.referenceY)
sprite:add()
table.insert(sprites, sprite)
end
table.insert(spriteGroups, sprites)
end
function playdate.update()
playdate.graphics.sprite.update()
playdate.timer.updateTimers()
end
local function shakeSprites(sprites)
return playdate.timer.keyRepeatTimerWithDelay(
MOVEMENT_INTERVAL,
MOVEMENT_INTERVAL,
function()
local rx <const> = (2 * math.random()) - 1
local ry <const> = (2 * math.random()) - 1
for i = 1, #sprites do
local sprite <const> = sprites[i]
sprite:moveTo(
sprite.referenceX + rx,
sprite.referenceY + ry
)
end
end
)
end
playdate.timer.keyRepeatTimerWithDelay(
SHAKE_INTERVAL,
SHAKE_INTERVAL,
function()
local timer <const> = shakeSprites(spriteGroups[math.random(#spriteGroups)])
playdate.timer.new(SHAKE_INTERVAL, timer.remove, timer)
end
)
2 Likes