Skip to content

Commit

Permalink
Merge pull request #43473 from code-dot-org/nov8-fix-behavior-bug
Browse files Browse the repository at this point in the history
[Poetry] Guard against deleted sprite in behavior funcs
  • Loading branch information
ajpal committed Nov 9, 2021
2 parents ef522ae + cf25030 commit 7387139
Showing 1 changed file with 68 additions and 13 deletions.
81 changes: 68 additions & 13 deletions apps/src/p5lab/poetry/commands/behaviors.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,77 @@
import * as utils from './utils';

function getSprite(spriteArg) {
const sprites = this.getSpriteArray(spriteArg);
if (sprites.length === 0) {
// This happens if the sprite was deleted within the same frame, so we
// should just no-op
return;
} else if (sprites.length > 1) {
// This shouldn't happen because we call behaviors by sprite id so there
// should only be one sprite.
console.warn('Multiple sprites for behavior');
return;
} else {
return sprites[0];
}
}

// These functions are duplicated from https://levelbuilder-studio.code.org/functions
// In Sprite Lab, behaviors are defined using blockly so that students can edit
// the behavior functions. In Poetry, we just need the function definitions, we don't
// need them to be editable by students.
export const commands = {
fluttering(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.y += utils.randomInt(-1, 1);
},

growing(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.setScale(sprite.getScale() + 1 / 100);
},

jittering(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.setScale(sprite.getScale() + utils.randomInt(-1, 1) / 100);
},

moving_north_and_looping(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.y -= sprite.speed;
if (sprite.y < -50) {
sprite.y = 450;
}
},

moving_south_and_looping(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.y += sprite.speed;
if (sprite.y > 450) {
sprite.y = -50;
}
},

moving_east_and_looping(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.mirrorX(1);

sprite.x += sprite.speed;
Expand All @@ -47,7 +81,10 @@ export const commands = {
},

moving_west_and_looping(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.mirrorX(-1);

sprite.x -= sprite.speed;
Expand All @@ -57,26 +94,38 @@ export const commands = {
},

shrinking(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.setScale(sprite.getScale() - 1 / 100);
},

spinning_left(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.rotation -= 6;
},

spinning_right(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
sprite.rotation += 6;
},

swimming_left_and_right(spriteArg) {
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
if (!this.p5.edges) {
this.p5.createEdgeSprites();
}

const sprite = this.getSpriteArray(spriteArg)[0];
if (sprite.direction === 0) {
sprite.mirrorX(1);
} else if (sprite.direction === 180) {
Expand All @@ -93,11 +142,14 @@ export const commands = {
},

wandering(spriteArg) {
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
if (!this.p5.edges) {
this.p5.createEdgeSprites();
}

const sprite = this.getSpriteArray(spriteArg)[0];
if (utils.randomInt(0, 100) < 20) {
sprite.direction = (sprite.direction + utils.randomInt(-25, 25)) % 360;
}
Expand All @@ -118,7 +170,10 @@ export const commands = {
},

wobbling(spriteArg) {
const sprite = this.getSpriteArray(spriteArg)[0];
const sprite = getSprite.call(this, spriteArg);
if (!sprite) {
return;
}
if (utils.randomInt(0, 100) < 50) {
sprite.rotation = utils.randomInt(-1, 1);
}
Expand Down

0 comments on commit 7387139

Please sign in to comment.