How to shake some sprites only?

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

playdate.graphics.sprite:setIgnoresDrawOffset

1 Like

Here is a working example and demonstration of shaking groups of sprites.

shaky_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