被遗忘的enchantjs +新的1C-Bitrix =激励客户的游戏

图片

在线商店中的股票可能会有所不同,但是如何使它们对于客户而言看起来很有趣始终是一个问题,我们试图将具有常规客户统计信息的普通股转变成Dendy风格的游戏。

在这里,我们将讨论如何在浏览器的小型游戏中形象化营销动机来吸引客户。

阶段1.从构想到了解需要什么


晴朗的一天(夏季开始之前),营销部门提出了这个想法,以组织一次激励活动,以批发方式分发客户。 与往常一样,根据源数据,我们得到以下信息:

  1. 一些客户编号
  2. 客户指标
    • 客户在一定时间内购买的总金额是多少
    • 在这段时间内,客户获得了哪些品牌?
    • 客户如何“诚实”且负责任地履行我们对产品供应商的责任
    • 客户根据与我们的合作有什么“特殊”的价格条件?
  3. 某些动机工具集。
    • 我们可以为客户的合作和表现提供的“礼物”清单
    • 他当前报价的“改进者”
    • 向“最...最...最负责任和最活跃的客户”颁发“超级奖”。

  4. 客户集中点是具有在线订购系统的个人帐户,我们可以在其中提供某些内容并报告重要的内容。
  5. 会计程序(“黄色”)-每个客户标识符及其指标都有常规信息。

有了这样的数据集,您可以在旅途中使用个人帐户进行组织:

  1. 标语+“购买并获得此”
  2. 或带有客户参数的表格,您每天可以在其中上传会计程序中的数据
  3. 由于该网站位于1C-Bitrix上,如果满足某些条件(取决于客户的标识符),您可以制定复杂的“篮子规则”以享受一定折扣,或者在API中显示自己的逻辑并显示一些统计信息。

我们做了所有这一切,并且正在这样做以通知我们的客户。 但是在这种情况下,我想尝试其他方法-创建游戏-指标将以抽象数量可视化。

第二阶段。所以,我们制作了游戏,现在TK听起来像这样


我们的主题是备件,并且在很大程度上-汽车零件的批发销售,据此,确定了以下游戏逻辑结构:

  1. 在聚光灯下-汽车应沿其行驶的轨道
  2. 路线从某处开始并在某处结束(开始和结束),即该路线具有以km为单位的给定长度。
  3. 开始是指标的参考点-“通过的方式”
  4. 终点线是到达的终点,我们可以为客户提供特殊特权或非常有价值的奖励。
  5. 轨道上应该有停车点(这可能是障碍,是决定的停止点)。
  6. 决策点(检查点)-应该给客户一个“小礼物”,然后返回到“小礼物”的开始或拒绝,然后继续。
  7. 障碍-应更改一些指标。
  8. 燃油将用于驱动汽车。
  9. 加油是一种抽象,客户遵守销售条款+完成任务/任务可获得的升。
  10. 每100公里的油耗。 在汽车中-这也是一种抽象,取决于客户的“诚实”和“责任”指标,并遵守其对我们作为供应商的义务。
  11. 燃油消耗应在一定等级范围内且在合理范围内。

在“伟大而强大”的帮助下,将工作分解为小子任务并了解实现工具的选择是一项艰巨的任务。 为了不创建用于组织汽车运动机制的“两轮”车辆,做出了选择使用JavaScript框架的选择。

我们为自己确定的游戏框架要求如下:

  1. 2D地图
  2. 地图精灵
  3. 事件模型
  4. “快速入门”
  5. 该文件

总共审查并测试了3-5个著名的解决方案(包括鲜为人知的PointJS)。 考虑到所有这些,确实是创建游戏的绝佳引擎,但是您需要一些简单的东西,因此选择了enchantjs。

Enchantjs是一个简单的引擎,具有用于创建简单2D游戏的必要工具集。

第三阶段。技术设计


在充分利用Enchantjs之后,是时候概述一个小型应用程序结构了。

-要保存的表和数据(谈论MySQL)

  1. 玩家当前数据(影响游戏当前参数的数据)汇总表。 此表的一部分在游戏过程中进行了修改,部分是从会计程序中进行了修改。
  2. 汽油升的变化。 这些是客户可以填写其虚拟汽车的抽象。 此数据应仅来自会计程序。
  3. 里程变化的历史。 客户开车去的地方,汽油用尽的地方,他去了检查站。
  4. 油耗发生变化。 例如,今天一位顾客消费了9升的汽车。 100公里,明天有客户要评论,他的汽车消耗量增加到11升。 每100公里。
  5. 1C-Bitrix中的Infoblock,市场营销专家将为客户输入任务(先做……然后在这里……用照片或链接确认,您会得到糖果或减少的消费)
  6. 具有完成的客户分配的表。
  7. 检查点表(需要在游戏地图上绘制带有标志的精灵)
  8. 我们可以在检查站提供给客户的礼物表。
  9. 收集的检查点表。 (客户到达检查站,选择了礼物,然后我们写下了)
  10. 汽油消耗/到来的历史。 即,在驾驶时有费用,在给罐加油时有燃料到达。 需要此数据来通知客户端。

-组件1C-Bitrix
  1. 通用组件模板
  2. 在游戏中处理用户请求
  3. 处理发生在游戏场上的事件
  4. 处理用户在游戏管理界面中执行的动作

-模块1C-Bitrix
  1. 所有必需表的ORM
  2. 一些服务操作
  3. 代理商

-与会计软件共享的API
处理有关游戏计费程序数据的请求。
处理有关在玩家会计软件上提供数据的请求。

阶段4.游戏场景的实现


在实现中,我将给出一个仅涉及enchantjs和游戏场景的示例。

首先,我们需要为游戏创建一个场景并形成一个地图。

该地图是由一个数组数组构建的,其中每个嵌套的数组都表征了来自地图材质原始精灵的单元格编号。

地图中将用于构建游戏场景的部分

地图精灵源
图片

enchant();//   var game = new Game(800,700);//     800   700 game.fps = 28; //   game.scale = 1; //  // (, ) game.preload('red_car.gif'); game.preload('airport.gif'); game.preload('flag.gif'); //  game.onload = function() { var scene=new SceneGame();//   game.pushScene(scene); }; game.start(); 

获得了用于创建游戏场景和启动游戏的基本语法。

最重要的是,我们在HTML页面上绘制了一个矩形,可以在其上操纵精灵。

我必须马上说,在实施游戏时,我不得不放弃附魔事件模型和所有动作都作为fps的一部分在fps值的影响下发生的概念。

定义游戏的主要场景,绘制地图,放置标志并将机器设置为起点。

 /** *     * @type {Scene} */ var SceneGame=Class.create(Scene,{ initialize:function(){ Scene.apply(this); game = Game.instance; var label=new Label('   ');//    var map = new Map(32,32);//  map.gif    1-   var car =new Car();//   var points_list=[]; //      //             for(var point_km in app_user.check_point){ var flag_position=curent_odometr_to_coordinat(point_km);//  ,      x  y -      . var red_flag=new Redflag();//  1-   red_flag.x=flag_position.x;// 1-   x red_flag.y=flag_position.y;// 1-   y red_flag.rotation=0;//     points_list.push(red_flag); delete red_flag; } this.red_flag=red_flag; this.car=car; map.image = game.assets['map.gif'];//    //  ,      map.gif var baseMap = [ [24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24], [ 4, 1, 1, 1, 5, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 4, 1, 1, 1, 1, 5, 24, 24, 24, 24], [12, 24, 24, 24, 0, 24, 51, 47, 5, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 12, 24, 24, 24, 24], [12, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 12, 24, 24, 24, 24], [12, 24, 24, 24, 0, 24, 24, 25, 0, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 12, 24, 24, 24, 24], [12, 24, 24, 24, 0, 24, 24, 25, 0, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 12, 24, 24, 24, 24], [12, 24, 24, 24, 0, 24, 24, 25, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 8, 1, 1, 1, 5, 47, 22, 44, 4, 1, 1, 1, 5, 0, 24, 24, 24, 24, 11, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 0, 0, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 0, 0, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 24, 0, 24, 24, 24, 0, 0, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 24, 8, 1, 1, 1, 9, 24, 24, 24, 12, 0, 24, 24, 24, 24, 8, 1, 1, 1, 8], [12, 24, 24, 24, 24, 24, 24, 4, 9, 57, 57, 24, 24, 24, 12, 24, 12, 8, 1, 1, 1, 1, 5, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 0, 49, 24, 24, 24, 24, 24, 12, 24, 12, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 0, 59, 50, 50, 50, 24, 24, 12, 24, 12, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 8, 1, 1, 1, 1, 5, 24, 12, 24, 12, 24, 24, 24, 24, 24, 0, 24, 24, 24, 24], [12, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 8, 1, 9, 24, 12, 51, 51, 51, 51, 24, 0, 24, 24, 24, 24], [11, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 8, 1, 1, 1, 1, 1, 9, 24, 24, 24, 24] ]; } map.loadData(baseMap); this.addChild(map);//    this.addChild(car); for(var index_flag in points_list){//   -  this.addChild(points_list[index_flag]); } }); 

地图图片
图片

结果,我们得到一个带有地图的场景,上面有一条道路。 在屏幕截图中,未显示标志,并且未在起点(左下角)安装汽车。

enchantjs中的每个sprite对象至少始终包含有关坐标系统中的位置以及sprite旋转角度的信息。

地图草图
图片

即 为了在绘制的地图上进行汽车的移动,需要:

  1. 描述到达轨道弯道时其在太空中的动作
  2. 根据子画面的旋转角度来描述汽车的动作和运动方向。

也就是说,如果旋转角度为0,并且由于汽车的精灵从下往上开始,那么我们将沿着Y轴移动到坐标轴的零。接下来,我们将遇到1号轨道的弯曲,并且必须将汽车的精灵旋转90度。 此外,知道我们位于90度角后,我们沿着X轴移动,直到第2条轨道的弯曲,等等。

因此,我们教车沿绘制的坐标系移动。

为了使汽车与道路的交互作用达到我们熟悉的值-以行驶的公里数为单位,有必要编写一个附加功能,以公里数为单位。 从0到3000,并返回路段上该点的坐标。

对于汽车运动,我们使用setInterval在汽车运动时增加x或y值

 //  var start=setInterval(function(){ var position=car.getElementMap(car.x,car.y); position.map_num=map.checkTile(car.x,car.y); var move_result=car.move_car(position); //      var fuel_one_km=fuel_consumption(app_user.fuel_road);//  1 app_storage.fuel -=fuel_one_km; app_storage.fuel=parseFloat((app_storage.fuel).toFixed(2)); if(app_storage.fuel<=0){ //   clearInterval(start); console.log(' !'); //   ,       } var check_point_km=check_car_checkpoint(app_storage.km) //  if(typeof check_point_km.point_km!=='undefined') { console.log('!'); //   ,       } if(position.car_x>780) { clearInterval(start); } },app_conf().game.move_car_fps); 

地图,打字机,旗帜
图片

在移动过程中,游戏场景中会发生以下事件:

  1. 打旗
  2. 燃油端
  3. 到达终点线

到达这些事件后,将创建事件,并在1C-Bitrix组件的控制脚本中对其进行处理。

更多...更多


完成游戏系统的以下步骤是:

  1. 创建带有控制按钮的界面
  2. 对比赛现场事件的反应
  3. 根据用户动作更改游戏参数
  4. 在后端检查车辆参数

结果就是在LC中玩这样的游戏

屏幕LK
图片

还有一个视频

Source: https://habr.com/ru/post/zh-CN454210/


All Articles