空中跳一跳

2023-10-27

欢迎来到程序小院

空中跳一跳

玩法:
跳一跳长按鼠标左键,松开鼠标进行跳跃,跳到下一个格子中,进行分数统计,三次生命机会,格子中也会有爱心出现,吃掉安心增加一次生命哦^^。

开始游戏icon-default.png?t=N7T8https://www.ormcc.com/play/gameStart/177

html

<div id="game"></div>

css

#game canvas {
    position: relative;
    margin: 0 auto;
}

js

var mainState = function(game){
  var group, player, effect, point;

  var moving; // 用于记录tween动画状态
  var holding;  // 用于记录鼠标按下状态
  var holdTime; // 用于记录鼠标按下时间

  this.pArr = [17,15,12,10,15,13,8,17]; // 各种类型平台宽度,与平台spritesheet各帧对应
  this.init = function(){

    moving = true;
    holding = false;
    holdTime = 0;

    this.lastX = 40;// 最后一次的距离、方向、平台类型
    this.lastY = 20;
    this.lastD = 1;
    this.lastP = 0;

    this.bonus = 0;
    this.playerStyle = this.game.playerStyle; // 角色样式,对应帧号
    this.items = {txt:[null,null,null],val:[0,3,3]}; // 游戏数据在一个对象中保存:[分数,生命,瞄准器]
  };
  this.create = function(){
    var back = this.game.add.sprite(0,0,"back");
    back.scale.set(this.game.width/160,this.game.height/280);
    // clouds
    for (var i=0; i<3; i++){
      var firstX = this.game.rnd.between(20,this.game.width-20);
      var firstTime = Math.floor((20000-3000*i)*(firstX+150)/(this.game.width+200));
      var cloud = this.game.add.sprite(firstX,this.game.height-250+50*i,"cloud",this.game.rnd.integerInRange(0,2));
      cloud.scale.set(1+0.5*i);
      cloud.alpha = 0.3;
      this.game.add.tween(cloud).to({x:-150},firstTime,"Linear",true).onComplete.add(function(obj,tw,twTime){
        obj.x = this.game.width+50;
        this.game.add.tween(obj).to({x:-150},twTime,"Linear",true,0,-1).onLoop.add(function(obj){
          obj.frame = this.game.rnd.integerInRange(0,2);
        },this);
      },this,0,20000-3000*i);
    }

    group = this.game.add.group();
    this.plate1 = group.create(this.world.centerX-this.lastX, this.world.centerY+this.lastY, "plate", 0);
    this.plate1.anchor.set(0.5,0.4);
    // 连环tween
    this.game.add.tween(this.plate1).from({y:this.plate1.y-50,alpha:0},200,"Linear",true).onComplete.add(function(){
      this.plate2 = group.create(this.world.centerX+this.lastX, this.world.centerY-this.lastY, "plate", 0);
      this.plate2.anchor.set(0.5,0.4);
      this.plate2.sendToBack();
      this.game.add.tween(this.plate2).from({y:this.plate2.y-50,alpha:0},200,"Linear",true).onComplete.add(function(){
        // 光效
        effect = group.create(0, 0, "button", 6); 
        effect.anchor.set(0.5);
        effect.visible = false; // 与平台共一个组,只用visible控制显示或隐藏,用kill的话会被拿去做平台

        // 瞄准器
        point = group.create(0, 0, "button", 7); 
        point.anchor.set(0.5);
        point.scale.set(0.5);
        point.visible = false; // 与平台共一个组,只用visible控制显示或隐藏,用kill的话会被拿去做平台

        player = group.create(this.world.centerX-this.lastX, this.world.centerY+this.lastY);
        // 身体
        player.b = player.addChild(this.game.add.sprite(0, 0, "player", this.playerStyle));
        player.b.anchor.set(0.5,0.875);
        player.b.animations.add("delay",[this.playerStyle],10,false);
        // 加分提示文本
        player.txt = player.addChild(this.game.add.text(0, -30, "",
        {fontSize:"16px", fill:"#fff"}));
        player.txt.anchor.set(0.5);

        this.game.add.tween(player).from({y:player.y-50,alpha:0},200,"Linear",true)
        .onComplete.add(function(){
          moving = false;
        },this);
      },this);
    },this);

    this.items.txt[0] = this.game.add.text(this.world.centerX, 80, "0", 
    {fontSize:"48px", fill:"#999"});  
    this.items.txt[0].anchor.set(0.5);
    this.game.add.sprite(10,10,"icon",0);
    this.game.add.sprite(75,10,"icon",1);
    this.items.txt[1] = this.game.add.text(35, 10, this.items.val[1], 
    {fontSize:"16px", fill:"#999"});
    this.items.txt[2] = this.game.add.text(100, 10, this.items.val[2], 
    {fontSize:"16px", fill:"#999"});

    this.game.input.onDown.add(function(){
      if(!moving && !holding){
        holding=true;
        holdTime=this.game.time.now;
        if(this.items.val[2]>0){
          point.x=player.x;
          point.y=player.y;
          point.visible = true;
        }
      }
    },this);
    this.game.input.onUp.add(this._jump,this);
  };
  this.update = function(){
    if(holding){ // 储力效果,简单的缩短
      var power = Math.min(Math.floor((this.game.time.now - holdTime) / 16), 250);
      // 计算力度,限制数值最大为250
      player.scale.y = 1 - (power>100 ? 0.3 : 0.3 * power / 100);
      if(this.items.val[2]>0){
        var tarX = this.world.centerX-this.lastX+this.lastD*power*2;
        var tarY = this.world.centerY+this.lastY-power;
        point.x=tarX;
        point.y=tarY;
      }
    }
  };
  this._setItem = function(id, v){
    this.items.val[id]+=v;
    this.items.txt[id].text = this.items.val[id];
  };
  this._jump = function(){
    if(!moving && holding){
      moving = true;
      holding = false;
      player.scale.y = 1;
      point.visible = false;
      var power = Math.min(Math.floor((this.game.time.now - holdTime) / 16), 250);
      // 计算力度,限制数值最大为250
      var jumpX = this.world.centerX-this.lastX+this.lastD*power*2;
      var jumpY = this.world.centerY+this.lastY-power;
      // *** 跳跃效果 ***
      var jumpTime = 300; // 跳跃动作时长
      // 外壳直线位移至目的地
      this.game.add.tween(player).to({x:jumpX, y:jumpY},jumpTime,"Linear",true)
      .onComplete.add(function(obj){
        if(this._checkScore()){
          obj.b.animations.play("delay",10).onComplete.addOnce(this._newPlate,this);
          // 这里用帧动画实现停顿效果(帧速10代表停顿十分之一秒)
        }else{
          obj.b.animations.play("delay",10).onComplete.addOnce(this._fall,this);
        }
      },this);
      // 身体只做跳跃动作即可
      player.b.y = -40; 
      player.b.angle = -this.lastD * 150;
      this.game.add.tween(player.b).to({angle:-this.lastD*90, 
      x:this.lastD*20, y:-80}, jumpTime/2, Phaser.Easing.Quadratic.Out, false)
      .to({angle:0,x:0,y:0},jumpTime/2,Phaser.Easing.Quadratic.In,true);
      // ******
    }
  };

源码icon-default.png?t=N7T8https://www.ormcc.com/

需要源码请关注添加好友哦^ ^

转载:欢迎来到本站,转载请注明文章出处https://ormcc.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

空中跳一跳 的相关文章

  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • 三个JS,给纹理添加镜面反射(光泽)

    我有一个纹理应用于 Three js 中的对象 我想为其添加一些镜面反射或光泽 我看到这样的例子 new THREE MeshPhongMaterial color 0x996633 specular 0x050505 shininess
  • 在有限的上下文中运行 JS 代码

    我正在尝试奔跑trusted 隔离 上下文中的 JS 代码 基本上想出了这个方法 function limitedEval src context return function with this return eval src call
  • 如何将值发布到输入框中?

    Intro I would like to get the current time after clicking at click and POST the value into input text box Note 假设包含引导样式表
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • 判断字符串是否包含有效的javascript代码

    我正在寻找一个C 返回的函数true如果字符串包含有效的 JavaScript 语法 例如 IsValidJavascript alert hello 会回来true but IsValidJavascript alertXXhelloZ
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • Javascript 作为对象键的函数与块中标记函数之间的语法冲突

    假设您有一个支持两者的浏览器带标签的函数声明 https developer mozilla org en US docs Web JavaScript Reference Statements label Labeled function
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 如何知道 .keyup() 是否是字符键(jQuery)

    如何知道 keyup 是否是字符键 jQuery input keyup function if key is a character such as a b A b c 5 3 2 etc not enter key or shift o
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • 为什么 call 比 apply 快那么多?

    我想知道是否有人知道why call比apply 在 Chrome 中 速度大约快 4 倍 在 Firefox 中快 30 倍 我什至可以制作自定义原型 apply2 在大多数情况下 运行速度是apply 这个想法取自角度 Function
  • 在反应中访问回调内的 event.target

    我有以下课程片段 constructor props super props this timeout null search e gt clearTimeout this timeout this timeout setTimeout f
  • 轮播滑动(未滑动)事件上的火灾事件,Bootstrap 3

    Bootstrap 2 似乎可以很好地处理幻灯片事件 请参阅这个问题 https stackoverflow com questions 9651466 how to attach slide slid events to the boot
  • javascript - 如何获取对象名称或关联数组索引名称?

    我有一个像这样的 JSON 对象 var list name1 element1 value1 name2 element1 value2 如何提取所有 nameX 字符串值 例如 假设我想将它们连接在一个字符串中输出 例如 name1 n
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这

随机推荐

  • Keil报错:cannot open source input file “core_cmInstr.h“ 解决办法

    文章目录 前言 参考资料 历史精选文章 前言 前几天在面包板社区申请了一块uFun开发板 昨天刚到手 在烧录Demo程序的时候遇到一个问题 就是Keil打开工程 编译 报很多错误cannot open source input file c
  • Angular 4.x Forms patchValue and setValue

    在 Angular 4 x 中有多种方式可以更新表单的值 对于使用响应式表单的场景 我们可以通过框架内部提供的 API 如 patchValue 和 setValue 方便地更新表单的值 这篇文章我们将介绍如何使用 patchValue 和
  • J-link烧录MCU镜像文件

    1 使用范围 本文档基于NXP M4芯片 介绍MCU镜像文件烧录流程以及在烧录过程中遇到的问题 2 烧录步骤2 1 资源准备 烧录前需准备MCU镜像文件 镜像文件一般由Keil工具 SylixOS IDE工具或者其他工具生成 本文档以Kei
  • 读写分离与分库分表,涉及sharding-JDBC、sharding-sphere、停机迁移和双写方案、分布式id

    一 读写分离 1 1 何为读写分离 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上 这样的话 就能够小幅提升写性能 大幅提升读性能 一主多从 也就是一台主数据库负责写 其他的从数据库负责读 主库和从库之间会进行数据同步 以保
  • ERP管理系统的权限控制实现--shiro

    1 Shiro基本原理分析 Authentication 身份认证 登录 验证用户是不是拥有相应的身份 Authorization 授权 即权限验证 验证某个已认证的用户是否拥有某个权限 即判断用户是否能做事情 常见的如 验证某个用户是否拥
  • 用Java Socket开发小型服务器,支持上千个并发

    Java Socket 套接字 socket 为两台计算机之间的通信提供了一种机制 在James Gosling注意到Java 语言之前 套接字就早已赫赫有名 该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字 1 客户机 服务器
  • 质因数分解

    找出最小的质数 与它相乘的就是最大的质数 include
  • Django中基于FBV和CBV的免除或开启csrf验证

    一 全局crsf验证开启 但希望某函数或方法豁免验证 1 基于FBV免除某个函数csrf验证的步骤 1 1 在settings的中间件 添加csrf验证全局验证 默认都已经添加 1 2 导入 django views decorators
  • Qt信号槽的几种写法

    信号槽是Qt的核心部分 它使得对象之间的的通信变得很简单 Qt通过connect来连接信号与槽 当信号被发出时 槽函数立刻被执行 connect函数有五个重载 重载1 QMetaObject Connection connect const
  • Linux修改密码

    Linux修改密码用 passwd 命令 用root用户运行passwd passwd user name可以设置或修改任何用户的密码 普通用户运行passwd只能修改它自己的密码 root localhost passwd 修改root用
  • 疫情数据提取

    基于正则表达式提取新冠疫情数据 这篇博客主要基于新冠数据进行每日新增病例与累计病例的统计 开发环境 Pycharm 2019 1 1 python 3 7 一 数据集介绍 数据集中的数据是从2019年12月31到2019年2月28日的新闻数
  • Module parse failed: Unexpected character ‘ ‘ (1:0) You may need an appropriate loader to handle thi

    Module parse failed Unexpected character 1 0 You may need an appropriate loader to handle this file type Source code omi
  • bcrypt.js实现对登录注册中密码的加密存储和验证

    大部分的项目中都存在登录注册这个模块 除了常规的操作之外 比较重要的一点 我们需要对用户的密码进行加密之后再存储 除了考虑数据库被黑掉的情况 作为一个程序员来说 职业操守也要求我们要做密码的加密 这属于用户的隐私 不加密的话 几乎所有的技术
  • CVPR 2022 部分行人重识别

    转载自CVPR 2022 行人 车辆重识别 相关论文和代码 更新中 知乎 Person Re identification 1 Learning with Twin Noisy Labels for Visible Infrared Per
  • k8s 滚动发布Deployment

    简介 1 k8s1 master IP地址 172 31 100 20 2 何为滚动发布Rolling update 一种高级发布策略 按批次依次替换老版本 逐步升级到新版本 发布过 程中 应用不中断 用户体验平滑 发布版本v1到v2 有问
  • 国产MCU哪家强?

    自从去年下半年8寸晶圆开始短缺 STM32单片机的价格开始疯长 有些型号甚至翻了十几倍 于是国内很多MCU厂家开始抓住机会 相继推出高性能 低价格的MCU对标ST 为了方便用户快速完成方案转换 很多厂家选择与ST硬件兼容的方案 一些厂商甚至
  • DOS文件格式 与 UNIX文件格式 转换

    这里阐述两种方法 1 使用VIM的方法 在vim下 使用如下命令 set fileformat unix 就可转换成 unix 文件格式 也可使用其缩写形式命令 set ff unix 直接输入命令 set fileformat 或 set
  • 知识蒸馏 综述 Knowledge Distillation: A Survey

    Knowledge Distillation A Survey 本文译自Knowledge Distillation A Survey 论文地址 https arxiv org abs 2006 05525 有翻译不周之处 敬请指正 1 I
  • 获取Java线程转储的常用方法

    文章目录 1 线程转储简介 2 使用JDK自带的工具 2 1 jstack 工具 2 2 Java Mission Control 2 3 jvisualvm 2 4 jcmd 2 5 jconsole 2 6 小结 3 使用Linux命令
  • 空中跳一跳

    欢迎来到程序小院 空中跳一跳 玩法 跳一跳长按鼠标左键 松开鼠标进行跳跃 跳到下一个格子中 进行分数统计 三次生命机会 格子中也会有爱心出现 吃掉安心增加一次生命哦 开始游戏https www ormcc com play gameStar