少儿编程教学环境开发之代码实战篇​mp.weixin.qq.com

之前架构选型篇许诺要上自己原型demo的界面图,先把这个许诺给实现了,首先声明,这只是技术原型demo,比起http://code.org的产品来讲简陋很多:

首先对代码的整体架构做一下说明,首先我们采用的是Vue SPA框架为整个站点的前端框架,这样编辑器界面和游戏窗口界面各自被封装成Component。

下面先上右侧BlocklyEditor Component的的代码,代码解读就直接放到代码注释中了

<template><div><div id="blocklyDiv" style="position: absolute"></div><!--上面的blockDvi主要是容器插槽用来放置编辑器--><xml  id="toolbox" style="display: none"><block type="string_length"></block><block type="controls_if"></block><block type="logic_compare"></block><block type="controls_repeat_ext"></block><block type="math_number"><field name="NUM">123</field></block><block type="math_arithmetic"></block><block type="text"></block><block type="text_print"></block></xml><!--上面的xml主要是定制block工具栏列表--></div>
</template><script>import Blockly from 'blockly'//下面这个代码块用来定制string_length block的形状Blockly.Blocks['string_length'] = {init: function() {this.jsonInit({"message0": '%1',"args0": [{"type": "field_image","src": "/assets/logo.png","width": 100,"height": 50,"alt": "*"}],"nextStatement": "Action","fillPattern":"#","colour": 160,"tooltip": "Returns number of letters in the provided text.","helpUrl": "http://www.w3schools.com/jsref/jsref_length_string.asp"});}};//下面这个代码块用来定制string_length block的行为函数// eslint-disable-next-line    Blockly.JavaScript['string_length'] = function(block) {// String or array length.//var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',//    Blockly.JavaScript.ORDER_FUNCTION_CALL) || '''';var argument0= "begin"return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER];};export default {name: "BlocklyEditor",mounted() {//在component的这个生命周期事件上初始化整个编辑器this.$nextTick(function () {var blocklyArea = document.getElementById("app");var blocklyDiv = document.getElementById('blocklyDiv');//往blocklyDiv容器插槽中插入blockly编辑器var demoWorkspace = Blockly.inject(blocklyDiv,{media: '/assets/blockly_media/',trashcan:true,grid:{spacing: 20,length: 20,colour: '#ccc',snap: true},toolbox: document.getElementById('toolbox')});//定义编辑器响应resize事件的函数,里面逻辑顺便完成了编辑器的形状设置// eslint-disable-next-linevar onresize = function(e) {// Compute the absolute coordinates and dimensions of blocklyArea.var element = blocklyDiv;// eslint-disable-next-linevar x = 0;var y = 0;do {x += element.offsetLeft;y += element.offsetTop;element = element.offsetParent;} while (element);// Position blocklyDiv over blocklyArea.blocklyDiv.style.left = 436 + 'px';blocklyDiv.style.top = y + 'px';blocklyDiv.style.width = blocklyArea.offsetWidth -470 + 'px';blocklyDiv.style.height = blocklyArea.offsetHeight-125 + 'px';Blockly.svgResize(demoWorkspace);};window.addEventListener('resize', onresize, false);onresize();Blockly.svgResize(demoWorkspace);})}}
</script>

下面上左侧phaser.js游戏窗口的的代码

<template><div><!--下面这个div是游戏界面的插槽容器--><div id="phaser-wraper"></div><div><button type="button" class="btn btn-primary">运行 <i class="fas fa-play"></i></button></div></div>
</template><script>import Phaser from "phaser"var playervar platforms//这个函数中完成游戏资源的预加载function preload ()
{//this.load.setBaseURL('Phaser 3 Examples');//this.load.image('logo', 'assets/sprites/phaser3-logo.png');//this.load.image('red', 'assets/particles/red.png');this.load.setBaseURL('/');this.load.image('sky', 'assets/sky.png');this.load.image('ground', 'assets/platform.png');this.load.multiatlas('citizen', 'assets/side_walk.json', 'assets');this.load.multiatlas('front', 'assets/front.json', 'assets');}//这个函数完成游戏场景的初始化function create ()
{var that = this;this.add.image(200, 200, 'sky');platforms = this.physics.add.staticGroup();platforms.create(200, 400, 'ground').setScale(1).refreshBody();player = this.physics.add.sprite(215, 215, 'citizen', '0_Citizen_Walk_003.png');player.setBounce(0.2);player.setCollideWorldBounds(true);this.anims.create({key: 'turn',frames: that.anims.generateFrameNames('front', {start: 1, end: 1, zeroPad: 2,prefix: '0_Citizen_Walk_0', suffix: '.png'}),frameRate: 20});this.anims.create({key: 'down',frames: that.anims.generateFrameNames('front', {start: 1, end: 28, zeroPad: 2,prefix: '0_Citizen_Walk_0', suffix: '.png'}),frameRate: 20});this.anims.create({key: 'left',frames: that.anims.generateFrameNames('citizen', {start: 1, end: 28, zeroPad: 2,prefix: '0_Citizen_Walk_0', suffix: '.png'}),frameRate: 10,repeat: -1});this.anims.create({key: 'right',frames: that.anims.generateFrameNames('citizen', {start: 1, end: 28, zeroPad: 2,prefix: '0_Citizen_Walk_0', suffix: '.png'}),frameRate: 10,repeat: -1});this.physics.add.collider(player, platforms);}//这个函数完成游戏中事件行为函数的编写,完成游戏的操作交互功能// eslint-disable-next-linefunction update(time, delta) {var cursors = this.input.keyboard.createCursorKeys();if (cursors.left.isDown){player.setVelocityX(-160);player.anims.play('left', true);player.setFlipX(false)}else if (cursors.right.isDown){player.setVelocityX(160);player.anims.play('right', true);player.setFlipX(true)}else if (cursors.down.isDown){player.setVelocityY(160);player.anims.play('down', true);player.setFlipX(false)}else if (cursors.up.isDown){player.setVelocityY(-160);player.anims.play('down', true);player.setFlipX(false)}else{player.setVelocityX(0);player.setVelocityY(0);player.anims.play('turn');}//player.update(delta)}export default {name: "Phaser",mounted() {//在vue组件的这个生命周期中完成整体游戏场景的初始化和加载this.$nextTick(function () {var config = {type: Phaser.AUTO,parent:"phaser-wraper",width: 400,height: 400,physics: {default: 'arcade',arcade: {gravity: { y: 0 }}},scene: {preload: preload,create: create,update: update,}};// eslint-disable-next-linevar game = new Phaser.Game(config);})}}
</script>

架构选型篇之后许诺的代码实战篇憋了好久了都没放出来,主要是代码注解一直懒得搞,让大家久等了。

代码编程教学_少儿编程教学环境开发之代码实战篇相关推荐

  1. python俄罗斯方块代码34行_少儿编程分享:码趣君教你用Python编写俄罗斯方块(四)...

    接下来要进入操作部分了 坚持才能获得最后的成就感噢 用移动变量处理用户输入 216. elif (event.key == K_LEFT or event.key == K_a): 217. movi ...

  2. 优的python少儿编程课_少儿编程课堂|python – 用游戏学编程

    学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...

  3. python俄罗斯方块编程思路_少儿编程分享:手把手教你用Python编写俄罗斯方块(十)...

    www.codingmarch.com 游戏分享:手把手教你用 Python 编写 俄罗斯方块(十) 2017.12.28 这是俄罗斯方块的最后一章了 经历了这么多游戏 编写了这么多代码 你的心中是否 ...

  4. python几岁开始学比较好_少儿编程到底几岁开始学合适?

    在回答这个问题之前,首先需要明确,学编程到底学的是什么:1. 适用于解决任何问题的"编程思维" (分解思维就是它的核心理念之一) 2. 各种编程语言(Python.C++等) 3. ...

  5. python在线编程免费课程-少儿编程网-Scratch_Python_教程_免费儿童编程学习平台

    大家好,我是爱编程的小熊,上一节我们学习了图形的旋转,这节,我们继续学习图形旋转及其变化的轨迹,进而绘制出更加绚丽的图案.编程描述:这一节 我们将在上几节所学的基础内容,并加上色彩和渐变填充的效果,画 ...

  6. 机器人编程与python语言的区别_少儿编程和机器人编程的区别有哪些?

    少儿编程和机器人编程是目前市面上较为流行的少儿编程培训课程,对孩子逻辑思维的培养非常有益,随着家长对孩子教育的重视,如今少儿编程和机器人编程受到了广大家长的关注,究竟少儿编程和机器人编程的区别有哪些呢 ...

  7. 单片机python编程入门_用Python让单片机“行动”起来——MicroPython实战入门篇

    MicroPython以微控制器作为目标,从而使得Python可以用来控制硬件.说到MicroPython,也许有人会感到陌生.而说到和它密切相关的Python,是否会恍然大悟呢?Python属于解释 ...

  8. 人工智能编程教学系统少儿编程机器人编程学习平台

    智能编程是通过系统智能教学的模式帮助学生快速学习编程系统的学习方式    1.思励智能编程是让游戏,情景动画,积木构件的形式呈现.旨在孩子九大能力的培养:观察力,想象力,创造力,逻辑思维力,问题解决, ...

  9. 编程之类的文案_少儿编程宣传推广文案

    我们是一家趣味编程头脑训练营,以小学生为训练对象,主要是以解决家长对孩子的学习教育问题为依据,让孩子能够主动参与学习,激发孩子的学习兴趣,培养孩子探索未知的兴趣和勇气.特征集一句少儿编程宣传推广文案, ...

最新文章

  1. linux下的shell运算(加、减、乘、除)
  2. 全志A33-ARM开发板通过NFS与Ubuntu共享文件
  3. Andriod开发 --插件安装、环境配置、问题集锦
  4. Keil | 解决Keil双击工程名无法打开.map的问题
  5. Vue.js 2.x笔记:指令(4)
  6. 自动驾驶 从入门到精通 学习资料汇总 Week1~Week7
  7. rose服务器系统,Rose HA for windows
  8. RDPWrap1.6.2让windows家庭版Home实现远程桌面
  9. c语言国二题库及答案2017,全国计算机二级《C语言》考试题库与答案
  10. 最伟大的IT人物10强
  11. rabbitmq新增用户
  12. android通讯录开发二 数据表各字段含义
  13. #clickid#CID#全新小程序链路CID/clickid解决方案,合规、完美防阿里封禁
  14. Linux系统下安装Adobe Flash Player插件的方法
  15. Qt+mpv制作windows/linux 下的动态壁纸软件(含源码)
  16. android手机整体规模,2021年Android手机市场规模
  17. C语言中什么叫做左值?右值?
  18. 弹指间计算机协会 2021“千里码”程序设计竞赛 题面
  19. 高空抛物检测方案设计(使用SOM进行轨迹分类)
  20. 4. Python--Scipy库(下/13-17)

热门文章

  1. IBM 推出 Bluemix :Swift 将支持服务器端开发
  2. 在Django中使用PostgreSQL数据库
  3. 拋棄虛擬機,微軟實驗讓我們在線做(二)
  4. 企业网络运行中,您是否遇到如下问题?——Vecloud
  5. MPLS 成为连接到云的绝佳方法的4个原因
  6. PHP 判断数据类型
  7. MATLAB找不到遗传算法工具箱,用不了gatool命令的解决方案
  8. 2018年6月2号(线段树(2))
  9. 2017/11/3模拟赛
  10. 二十一.HTTP属性管理