# Cat Laser Pointer Game with Auto-Move for iOS

> By Lawrence Arya, Founder & CEO of VP0. Published 2026-06-18. 8 min read.
> Source: https://vp0.com/blogs/cat-laser-pointer-game-auto-move-ui-ios

How to build a cat laser pointer game on iOS, from SpriteKit auto-move with prey-like randomness to catch rewards, haptics, and honest safety guards.

**TL;DR.** A cat laser pointer game shows a moving dot on screen for a cat to chase, with an auto-move mode that drives the dot along randomized paths so the human can put the phone down. On iOS the natural build is SpriteKit: a glowing sprite moved by actions along eased, randomized paths, with bursts and pauses that mimic prey, plus haptics and sound for the human. SwiftUI's Canvas and TimelineView can do a simpler version. Run it at the device's full refresh rate, keep brightness and motion cat-friendly, and add safety guards like a session timer. The screen and controls are fastest to start from a free VP0 design with Claude Code or Cursor.

A cat laser pointer game puts a small moving dot on the screen for a cat to chase, with an auto-move mode that drives the dot along randomized paths so the person can set the phone down and let the cat play. On iOS the natural build is SpriteKit: a glowing sprite moved by actions along eased, randomized paths, with the darts and pauses that read as prey, plus haptics and sound aimed at the human. SwiftUI's `Canvas` and `TimelineView` can do a lighter version. Run it at the device's full refresh rate, keep brightness and motion comfortable, and add guards like a session timer. The screen and controls are fastest to start from a free [VP0](/explore) design with Claude Code or Cursor.

## What makes the dot believable to a cat

Cats respond to prey motion, not smooth loops. A believable dot darts, stops abruptly, changes direction, and sometimes freezes as if hiding, then bolts again. A dot that glides in steady circles bores a cat within seconds, while erratic, unpredictable movement with pauses holds attention. Keep the dot small, give it a soft glow so it stands out against any wallpaper, and vary speed constantly.

The motion model is the whole game. Get the rhythm of dart, pause, and direction change right and even a simple red circle works; get it wrong and no amount of visual polish helps.

## SpriteKit or SwiftUI for the moving dot

For anything with randomized auto-move and a satisfying feel, SpriteKit is the better fit. It is built for sprites moving along sequenced actions with easing, which is exactly the prey motion you want.

| Approach | Best for | Motion control | Effort |
| --- | --- | --- | --- |
| SpriteKit | Auto-move with prey-like randomness | Full, action-based | Medium |
| SwiftUI Canvas plus TimelineView | A simple animated dot | Manual per frame | Low |
| Lottie | A fixed designed animation | Plays the file | Low |

[SpriteKit](https://developer.apple.com/documentation/spritekit) gives you `SKAction` sequences, easing, and randomness with little code, which is what auto-move needs. SwiftUI's [Canvas with TimelineView](https://developer.apple.com/documentation/swiftui/canvas) handles a simpler dot if you would rather stay in SwiftUI and compute position per frame. Lottie only fits if the movement is a fixed, pre-authored animation, which defeats the point of randomized play.

## Building auto-move: randomized prey paths

Auto-move is a loop of random short moves with varied easing and the occasional pause. Pick a random nearby point, move there over a random short duration with ease-in-out, sometimes wait, then repeat.

```swift
func dart(_ dot: SKNode, in size: CGSize) {
    let p = CGPoint(x: .random(in: 40...size.width - 40),
                    y: .random(in: 80...size.height - 80))
    let move = SKAction.move(to: p, duration: .random(in: 0.25...0.9))
    move.timingMode = .easeInEaseOut
    let pause = SKAction.wait(forDuration: .random(in: 0...0.6))
    dot.run(.sequence([move, pause])) { dart(dot, in: size) }
}
```

Bias the randomness toward short, sharp moves with frequent direction changes, and let pauses vary so the rhythm never becomes predictable. The [wheel of fortune spinner](/blogs/wheel-of-fortune-spinner-ui-template-ios/) shows the same eased, physics-flavored motion tuning you will reuse for the dot.

## Manual mode and the human's experience

Manual mode lets a person drag the dot, which is half the fun, so support both. When a cat catches the dot, reward it with a quick scale-and-glow and a haptic the human feels through the phone. [Core Haptics](https://developer.apple.com/documentation/corehaptics) makes that tactile feedback crisp, and the [custom haptic patterns](/blogs/haptic-engine-custom-patterns-react-native/) approach helps you tune a catch buzz that feels distinct from a miss. A small catch counter gives the human a reason to keep playing.

## Running it smoothly

A laggy dot breaks the illusion, so target the device's full refresh rate. On ProMotion displays that is up to 120 frames per second, and SpriteKit drives the render loop for you; for a SwiftUI version, [CADisplayLink](https://developer.apple.com/documentation/quartzcore/cadisplaylink) ties updates to the screen refresh. Keep the scene light, one sprite and a glow, so frames stay even on older phones, and test on a real device since motion smoothness is what sells the prey effect.

## Safety and honesty

The on-screen dot is simulated light, not a real laser, so it cannot harm anyone's eyes, but a few honest design choices matter. Veterinary guidance notes that pure laser play can frustrate a cat that never gets to catch anything, so end sessions with a catch reward and consider a prompt to follow up with a physical toy or treat. Add a session timer so the game does not run for an hour, dim the dot for low-light play, and never market it as a replacement for real interactive play. It is a fun supplement, framed honestly.

## Common mistakes

The motion errors dominate. Smooth, looping movement bores cats; the fix is short darts with abrupt stops and pauses. Letting the dot reach the exact screen edge makes it vanish under the bezel, so inset the play area. No pauses makes the motion read as mechanical rather than alive. On the technical side, a heavy scene drops frames and ruins the effect, and a full-brightness dot at night is harsh, so respect the time of day. Build the catch reward early, since a game with no payoff frustrates both the cat and the person watching.

## Building the screen fast

The motion logic is your work; the screen, start and stop controls, mode toggle, catch counter, and timer, is a known layout worth starting from a design. [VP0](/explore) is a free, $0 iOS design library where each screen has a hidden source page an AI builder reads from a pasted link:

```text
Build this iOS game screen in SwiftUI hosting a SpriteKit scene.
Read the layout and tokens from this VP0 source page: <pasted VP0 link>.
Add controls: start/stop, an auto-move vs manual toggle, a catch counter, and a
session timer. I will implement the SpriteKit dot and its randomized darting.
Add a haptic on catch and a dim-at-night option.
```

You get the screen and controls from the design and focus on the SpriteKit dot and its motion.

## What to choose

For a cat laser game, use SpriteKit for the dot and an auto-move loop of short, eased, randomized darts with varied pauses, the motion that actually holds a cat's attention. Use SwiftUI Canvas with TimelineView only for a simpler dot, and skip Lottie since fixed animation defeats randomized play. Add manual drag, a catch reward with Core Haptics, a session timer, and a dim-at-night option, and run at the display's full refresh rate. Keep the framing honest as a supplement to real play. Start the screen and controls from a free VP0 design, generate them with Claude Code or Cursor, and tune the darting rhythm on a real device, because the prey feel depends on smooth, full-rate motion the simulator does not reproduce.

## Frequently asked questions

### How do I make a cat laser pointer game with auto-move on iOS?

Use SpriteKit: render a small glowing dot and drive it with a loop of short, eased SKAction moves to random points, with varied durations and occasional pauses so it moves like prey. Add a manual drag mode, a catch reward with haptics, and a session timer. Start the screen and controls from a free VP0 design with Claude Code or Cursor and implement the SpriteKit dot yourself.

### Should I use SpriteKit or SwiftUI for the moving dot?

Use SpriteKit for the auto-move version, since SKAction sequences give you eased, randomized motion with little code, which is exactly what believable prey movement needs. SwiftUI's Canvas with TimelineView is fine for a simpler dot you position per frame. Avoid Lottie, because a fixed pre-authored animation cannot deliver the randomness that keeps a cat engaged.

### How do I make the dot move like real prey?

Bias the motion toward short, sharp darts with abrupt stops, frequent direction changes, and irregular pauses, rather than smooth loops that bore a cat quickly. Keep the dot small with a soft glow, inset the play area so it never disappears under the bezel, and vary speed and pause length constantly so the rhythm stays unpredictable.

### Is a laser game on a screen safe for cats?

The on-screen dot is simulated light, not a real laser, so it cannot harm eyes. The honest concern is behavioral: pure laser play can frustrate a cat that never catches anything, so end sessions with a catch reward and a nudge toward a physical toy, add a session timer, and treat the game as a supplement to real interactive play rather than a replacement.

### Can VP0 give me a free template for the game screen?

Yes. VP0 is a free iOS design library where each screen has an AI-readable source page, so you can copy the link and have Claude Code or Cursor build the start and stop controls, mode toggle, catch counter, and timer in SwiftUI hosting a SpriteKit scene. You implement the dot and its motion; the design gives you the screen around it.

## Frequently asked questions

### How do I make a cat laser pointer game with auto-move on iOS?

Use SpriteKit: render a small glowing dot and drive it with a loop of short, eased SKAction moves to random points, with varied durations and occasional pauses so it moves like prey. Add a manual drag mode, a catch reward with haptics, and a session timer. Start the screen and controls from a free VP0 design with Claude Code or Cursor and implement the SpriteKit dot yourself.

### Should I use SpriteKit or SwiftUI for the moving dot?

Use SpriteKit for the auto-move version, since SKAction sequences give you eased, randomized motion with little code, which is exactly what believable prey movement needs. SwiftUI's Canvas with TimelineView is fine for a simpler dot you position per frame. Avoid Lottie, because a fixed pre-authored animation cannot deliver the randomness that keeps a cat engaged.

### How do I make the dot move like real prey?

Bias the motion toward short, sharp darts with abrupt stops, frequent direction changes, and irregular pauses, rather than smooth loops that bore a cat quickly. Keep the dot small with a soft glow, inset the play area so it never disappears under the bezel, and vary speed and pause length constantly so the rhythm stays unpredictable.

### Is a laser game on a screen safe for cats?

The on-screen dot is simulated light, not a real laser, so it cannot harm eyes. The honest concern is behavioral: pure laser play can frustrate a cat that never catches anything, so end sessions with a catch reward and a nudge toward a physical toy, add a session timer, and treat the game as a supplement to real interactive play rather than a replacement.

### Can VP0 give me a free template for the game screen?

Yes. VP0 is a free iOS design library where each screen has an AI-readable source page, so you can copy the link and have Claude Code or Cursor build the start and stop controls, mode toggle, catch counter, and timer in SwiftUI hosting a SpriteKit scene. You implement the dot and its motion; the design gives you the screen around it.

---
*Published on the [VP0 Journal](https://vp0.com/blogs). Free to read, index and cite with attribution.*
