Difference between revisions of "How to move a sprite with directional inputs"

From MiniScript Wiki
Jump to navigation Jump to search
Line 14: Line 14:
 
yield
 
yield
 
end while</ms>
 
end while</ms>
 +
 +
One possible drawback to the example above is that the sprite can move faster diagonally than when moving straight left/right/up/down.  To avoid that, you can normalize the total inputs when their length is greater than 1, as shown below.
 +
 +
<ms>sp = new Sprite
 +
sp.image = file.loadImage("/sys/pics/Wumpus.png")
 +
display(4).sprites.push sp
 +
speed = 10  // pixels per frame
 +
while true
 +
dx = key.axis("Horizontal")
 +
dy = key.axis("Vertical")
 +
dlen = sqrt(dx * dx + dy * dy)
 +
if dlen > 1 then
 +
dx = dx / dlen
 +
dy = dy / dlen
 +
end if
 +
sp.x = sp.x + dx * speed
 +
sp.y = sp.y + dy * speed
 +
yield
 +
end while</ms>
 +
  
 
[[Category:Mini Micro]] [[Category:How To]]
 
[[Category:Mini Micro]] [[Category:How To]]

Revision as of 17:33, 10 April 2020

Directional (horizontal and vertical) inputs in Mini Micro are best detected using the key.axis method. This will respond to arrow keys, WASD, and any connected gamepad/joystick. This gives the player maximum flexibility in controlling their character.

key.axis returns a value from -1 to 1, with 0 being when no input is given. So, you can simply multiply this by the maximum amount you want to move the sprite, and add it to the sprite's x or y position.

Example

sp = new Sprite
sp.image = file.loadImage("/sys/pics/Wumpus.png")
display(4).sprites.push sp
speed = 10  // pixels per frame
while true
	sp.x = sp.x + key.axis("Horizontal") * speed
	sp.y = sp.y + key.axis("Vertical") * speed
	yield
end while

One possible drawback to the example above is that the sprite can move faster diagonally than when moving straight left/right/up/down. To avoid that, you can normalize the total inputs when their length is greater than 1, as shown below.

sp = new Sprite
sp.image = file.loadImage("/sys/pics/Wumpus.png")
display(4).sprites.push sp
speed = 10  // pixels per frame
while true
	dx = key.axis("Horizontal")
	dy = key.axis("Vertical")
	dlen = sqrt(dx * dx + dy * dy)
	if dlen > 1 then
		dx = dx / dlen
		dy = dy / dlen
	end if
	sp.x = sp.x + dx * speed
	sp.y = sp.y + dy * speed
	yield
end while