mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2025-08-28 22:30:40 -04:00
Implement glide (#154)
This commit is contained in:
parent
bbea1af5a3
commit
91cdec1547
1 changed files with 37 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
|||
var Cast = require('../util/cast');
|
||||
var MathUtil = require('../util/math-util');
|
||||
var Timer = require('../util/timer');
|
||||
|
||||
function Scratch3MotionBlocks(runtime) {
|
||||
/**
|
||||
|
@ -20,6 +21,7 @@ Scratch3MotionBlocks.prototype.getPrimitives = function() {
|
|||
'motion_turnright': this.turnRight,
|
||||
'motion_turnleft': this.turnLeft,
|
||||
'motion_pointindirection': this.pointInDirection,
|
||||
'motion_glidesecstoxy': this.glide,
|
||||
'motion_changexby': this.changeX,
|
||||
'motion_setx': this.setX,
|
||||
'motion_changeyby': this.changeY,
|
||||
|
@ -59,6 +61,41 @@ Scratch3MotionBlocks.prototype.pointInDirection = function (args, util) {
|
|||
util.target.setDirection(direction);
|
||||
};
|
||||
|
||||
Scratch3MotionBlocks.prototype.glide = function (args, util) {
|
||||
if (!util.stackFrame.timer) {
|
||||
// First time: save data for future use.
|
||||
util.stackFrame.timer = new Timer();
|
||||
util.stackFrame.timer.start();
|
||||
util.stackFrame.duration = Cast.toNumber(args.SECS);
|
||||
util.stackFrame.startX = util.target.x;
|
||||
util.stackFrame.startY = util.target.y;
|
||||
util.stackFrame.endX = Cast.toNumber(args.X);
|
||||
util.stackFrame.endY = Cast.toNumber(args.Y);
|
||||
if (util.stackFrame.duration <= 0) {
|
||||
// Duration too short to glide.
|
||||
util.target.setXY(util.stackFrame.endX, util.stackFrame.endY);
|
||||
return;
|
||||
}
|
||||
util.yieldFrame();
|
||||
} else {
|
||||
var timeElapsed = util.stackFrame.timer.timeElapsed();
|
||||
if (timeElapsed < util.stackFrame.duration * 1000) {
|
||||
// In progress: move to intermediate position.
|
||||
var frac = timeElapsed / (util.stackFrame.duration * 1000);
|
||||
var dx = frac * (util.stackFrame.endX - util.stackFrame.startX);
|
||||
var dy = frac * (util.stackFrame.endY - util.stackFrame.startY);
|
||||
util.target.setXY(
|
||||
util.stackFrame.startX + dx,
|
||||
util.stackFrame.startY + dy
|
||||
);
|
||||
util.yieldFrame();
|
||||
} else {
|
||||
// Finished: move to final position.
|
||||
util.target.setXY(util.stackFrame.endX, util.stackFrame.endY);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Scratch3MotionBlocks.prototype.changeX = function (args, util) {
|
||||
var dx = Cast.toNumber(args.DX);
|
||||
util.target.setXY(util.target.x + dx, util.target.y);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue