This commit is contained in:
2026-01-19 23:44:32 -06:00
commit 11bd5aa72b
64 changed files with 13433 additions and 0 deletions

223
src/blocks/motion.js Normal file
View File

@@ -0,0 +1,223 @@
import * as Blockly from "blockly";
import * as BlocklyJS from "blockly/javascript";
Blockly.Blocks["move_steps"] = {
init: function () {
this.appendValueInput("STEPS").setCheck("Number").appendField("step");
this.appendDummyInput().appendField("times");
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["change_position"] = {
init: function () {
this.appendValueInput("AMOUNT")
.setCheck("Number")
.appendField("change")
.appendField(
new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
]),
"MENU"
)
.appendField("by");
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["set_position"] = {
init: function () {
this.appendValueInput("AMOUNT")
.setCheck("Number")
.appendField("set")
.appendField(
new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
]),
"MENU"
)
.appendField("to");
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["goto_position"] = {
init: function () {
this.appendValueInput("x").setCheck("Number").appendField("go to x");
this.appendValueInput("y").setCheck("Number").appendField("y");
this.setInputsInline(true);
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["get_position"] = {
init: function () {
this.appendDummyInput().appendField(
new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
]),
"MENU"
);
this.setOutput(true, "Number");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["angle_turn"] = {
init: function () {
this.appendValueInput("AMOUNT")
.setCheck("Number")
.appendField("turn")
.appendField(
new Blockly.FieldDropdown([
[
{
src: "icons/right.svg",
height: 30,
width: 30,
alt: "A circular arrow rotating to the right",
},
"right",
],
[
{
src: "icons/left.svg",
height: 30,
width: 30,
alt: "A circular arrow rotating to the left",
},
"left",
],
]),
"DIRECTION"
);
this.appendDummyInput().appendField("degrees");
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["angle_set"] = {
init: function () {
this.appendValueInput("AMOUNT")
.setCheck("Number")
.appendField("set angle to");
this.appendDummyInput().appendField("degrees");
this.setInputsInline(true);
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["point_towards"] = {
init: function () {
this.appendValueInput("x")
.setCheck("Number")
.appendField("point towards x");
this.appendValueInput("y").setCheck("Number").appendField("y");
this.setInputsInline(true);
this.setPreviousStatement(true, "default");
this.setNextStatement(true, "default");
this.setStyle("motion_blocks");
},
};
Blockly.Blocks["get_angle"] = {
init: function () {
this.appendDummyInput().appendField("angle");
this.setOutput(true, "Number");
this.setStyle("motion_blocks");
},
};
BlocklyJS.javascriptGenerator.forBlock["move_steps"] = function (
block,
generator
) {
const steps =
generator.valueToCode(block, "STEPS", BlocklyJS.Order.ATOMIC) || 0;
return `moveSteps(${steps});\n`;
};
BlocklyJS.javascriptGenerator.forBlock["change_position"] = function (
block,
generator
) {
const amount =
generator.valueToCode(block, "AMOUNT", BlocklyJS.Order.ATOMIC) || 0;
const menu = block.getFieldValue("MENU");
if (menu === "y") return `sprite["${menu}"] -= ${amount};\n`;
else return `sprite["${menu}"] += ${amount};\n`;
};
BlocklyJS.javascriptGenerator.forBlock["set_position"] = function (
block,
generator
) {
const amount =
generator.valueToCode(block, "AMOUNT", BlocklyJS.Order.ATOMIC) || 0;
const menu = block.getFieldValue("MENU");
if (menu === "y") return `sprite["${menu}"] = -${amount};\n`;
else return `sprite["${menu}"] = ${amount};\n`;
};
BlocklyJS.javascriptGenerator.forBlock["goto_position"] = function (
block,
generator
) {
const x = generator.valueToCode(block, "x", BlocklyJS.Order.ATOMIC) || 0;
const y = generator.valueToCode(block, "y", BlocklyJS.Order.ATOMIC) || 0;
return `sprite.x = ${x};\nsprite.y = -${y};\n`;
};
BlocklyJS.javascriptGenerator.forBlock["point_towards"] = function (
block,
generator
) {
const x = generator.valueToCode(block, "x", BlocklyJS.Order.ATOMIC) || 0;
const y = generator.valueToCode(block, "y", BlocklyJS.Order.ATOMIC) || 0;
return `pointsTowards(${x}, ${y});\n`;
};
BlocklyJS.javascriptGenerator.forBlock["get_position"] = function (block) {
const menu = block.getFieldValue("MENU");
return [`sprite["${menu}"]`, BlocklyJS.Order.NONE];
};
BlocklyJS.javascriptGenerator.forBlock["angle_turn"] = function (
block,
generator
) {
const direction = block.getFieldValue("DIRECTION");
let amount =
generator.valueToCode(block, "AMOUNT", BlocklyJS.Order.ATOMIC) || 0;
if (direction === "left") amount = `-(${amount})`;
return `setAngle(${amount}, true);\n`;
};
BlocklyJS.javascriptGenerator.forBlock["angle_set"] = function (
block,
generator
) {
const amount =
generator.valueToCode(block, "AMOUNT", BlocklyJS.Order.ATOMIC) || 0;
return `setAngle(${amount}, false);\n`;
};
BlocklyJS.javascriptGenerator.forBlock["get_angle"] = () => [
"sprite.angle",
BlocklyJS.Order.NONE,
];