JavaScript实现U3D

各类三维引擎综合概述(OpenGL、DirectX、WebGL、UE4、U3D、ACIS、ParaSolid) 关于OpenGL、DirectX、OpenCV OpenCV OpenCV是 Open Source Computer Vision Library 主要是提供图像处理和视频处理的基础算法库,还涉及一些机器学习的算法。比如你想实现视频的降噪、运动物体的跟踪、目标(比如人脸)的识别这些都是CV的领域。它是可以运行在Linux、Window、和Mac OS操作系统上,它是轻量级而且很高效的。 OpenGL OpenGL是 Open Graphics Library 是个定义了一个跨编程语言、跨平台的编程接口规格 阅读详情

模块

define(function()
{
  function U3D(canvas)
  {
    var U = this;
    //全局时间对象
    U.Time = new TimeClass();
    //游戏时间控制器
    var gameTimer;
    //画布上下文
    var canvas2D = canvas.getContext("2d");
    //最长检测碰撞频率
    const CHECK_FRAME = 30;
    //当前频率计数器
    var gameFrame = 0;
    //碰撞检测列表
    var collisionList = [];
    //绘画游戏列表
    var drawList = [];

    //根据z值从小到大插入到绘画列表中
    function Z_IndexInset(o)
    {
      for(var i in drawList)
      {
        if(o.Z_INDEX < drawList[i].Z_INDEX)
        {
          drawList.splice(i,0,o);
          return;
        }
      }
      drawList.push(o);
    }

    //根据需要的更新频率从快到慢插入到碰撞检测列表中
    function CollisionInsert(c)
    {
      for(var i in collisionList)
      {
        if(c.CHECK_FREQUENCY < collisionList[i].CHECK_FREQUENCY)
        {
          collisionList.splice(i,0,c);
          return;
        }
      }
      collisionList.push(c);
    }

    //游戏暂停
    U.GamePause = function()
    {
      cancelAnimationFrame(gameTimer);
    }

    //游戏恢复
    U.GameUpdate = function()
    {
      if(gameFrame != CHECK_FRAME) { gameFrame++; } else { gameFrame = 0; }
      GameDraw();
      CollisionChecked();
      gameTimer = requestAnimationFrame(U.GameUpdate);
    }

    //绘制所有对象
    function GameDraw()
    {
      canvas2D.clearRect(0,0,canvas.width,canvas.height);
      for(var i in drawList)
      {
        drawList[i].Draw();
      }
    }

    //碰撞检测
    function CollisionChecked()
    {
      for(var i = 0;i<collisionList.length;i++)
      {
        if(gameFrame % collisionList[i].CHECK_FREQUENCY != 0){return;}
        if(i == collisionList.length - 1){break;}
        for(var j = i + 1;j < collisionList.length;j++)
        {
          for(var key in collisionList[i].collisionType)
          {
            if(collisionList[i].collisionType[key] == collisionList[j].collisionType)
            {
              //可在此处添加当物体拥有旋转角度时调用另一种判断方式
              ConllisionCheck(collisionList[i],collisionList[j]);
              break;
            }
          }
        }
      }
    }

    //不带旋转的方形碰撞检测
    function ConllisionCheck(col1,col2)
    {
      var x = Math.abs(col1.x - col2.x);
      var w = Math.abs((col1.width+col2.width)/2);
      var y = Math.abs(col1.y - col2.y);
      var h = Math.abs((col1.height+col2.height)/2);

      if(x < w && y < h)
      {
        col1.OnCollision2D(col2);
        col2.OnCollision2D(col1);
      }
    }

    //精灵类
    U.Sprite = function(x, y, width, height, url)
    {
      var self = this;
      self.x = x;
      self.y = y;
      self.width = width;
      self.height = height;
      var image = new Image();
      image.src = url;
      self.speed = 0;
      self.angle = 0;
      self.Z_INDEX = 0;
      //此物体的碰撞体名称
      self.collisionType = self.constructor.name;
      //此物体需要和哪些物体进行碰撞检测,如:["Cat","Dog"]
      self.collisionType = [];
      //此物体每几帧才进行一次碰撞检测
      self.CHECK_FREQUENCY = 1;
      //实例化时重写本字段定义物体碰撞后的执行代码。
      self.OnCollision2D = function(c) {};
      //动画帧,继承可按此格式重写重写
      self.artist =
      {
        //默认
        "default" : [{x:0,y:0,width:self.width,height:self.height}],
        //可在此添加更多的帧动画
      }
      //动画逻辑代码,继承时可按照此格式重写本字段
      self.animation =
      {
        //动画状态名称
        "default":
        {
          //本动画相关字段,可在此添加额外字段
          bool: true,
          Execute: function()
          {
            if (!self.animation["default"].bool) { return; }
            var inSelf = this;
            //动画具体执行代码
          }
        }
        //可在此添加额外动画
      }
      self.Draw = function()
      {
        canvas2D.save();
        self.animator.Execute();
        canvas2D.translate(self.x, self.y);
        canvas2D.rotate(self.angle);
        FrameExecute();
        canvas2D.drawImage(image,frame.x,frame.y,frame.width,frame.height,-self.width / 2, -self.height / 2, self.width, self.height);
        canvas2D.restore();
      }
      //帧动画相关
      var frames = self.artist["default"];
      var frame = frames[0];
      var frameTime = 100;
      var addFrame = 0;
      var frameIndex = 0;
      function FrameExecute()
      {
        if(frameTime == -1){return;}
        if(addFrame >= frameTime)
        {
          addFrame = 0;
          if(frameIndex == frames.length-1){ frameIndex = 0; }else{ frameIndex++; }
          frame = frames[frameIndex];
        }
        else
        {
          addFrame += U.Time.deltaTime * 1000;
        }
      }

      self.animator =
      {
        Execute: function()
        {
          for (var key in self.animation)
          {
            self.animation[key].Execute();
          }
        },
        //改变动画状态
        SetBool: function(behavior, bool)
        {
          self.animation[behavior].bool = bool;
        },
        //改变显示的帧动画
        ChangeArtist : function(name,time)
        {
          frames = self.artist[name];
          frame = frames[0];
          frameTime = time;
        }
      }
      //实例化时需要调用此方法将此物体加入到游戏中
      self.Add = function()
      {
        self.animator.ChangeArtist("default",-1);
        if(self.collisionType.length != 0)
        {
          CollisionInsert(self);
        }
        Z_IndexInset(self);
      }
      //在游戏中删除此物体
      self.Destroy = function()
      {
        for(var i in drawList)
        {
          if(drawList[i] === self)
          {
            drawList.splice(i,1);
            break;
          }
        }
        for(var i in collisionList)
        {
          if(collisionList[i] === self)
          {
            collisionList.splice(i,1);
            break;
          }
        }
      }
    }

    //时间类
    function TimeClass()
    {
      var init = true;
      var now = 0;
      var lastFpsTime = 0;
      var lastUpdateTime = 0;
      //每秒更新的FPS
      this.fps = 0;
      //时间增量
      this.deltaTime = 0;

      this.Update = function()
      {
        now = new Date().getTime();
        //初始化
        if (init)
        {
          init = false;
          lastFpsTime = now;
        }
        else
        {
          var offset = now - lastFpsTime;
          this.deltaTime = offset/1000;
          //每隔一秒返回一个新的FPS
          if (now - lastUpdateTime > 1000)
          {
            lastUpdateTime = now;
            this.fps = (1 / offset * 1000).toFixed(0);
          }
          lastFpsTime = now;
        }
      }
    }

    (function TimeUpdate()
    {
      U.Time.Update();
      requestAnimationFrame(TimeUpdate);
    })();
  }

  return U3D;
});

使用示例

require(["U3D"],function(U3D)
{
  var canvas = document.getElementById("canvas");
  var U = new U3D(canvas);

  function Cat(x,y,width,height)
  {
    U.Sprite.call(this,x,y,width,height,"cat.png");
    var self = this;
    self.collisionType = ["Cat"];
    self.speed = 10;
    //重写动画逻辑
    self.animation =
    {
      "default":
      {
        bool: true,
        Execute: function()
        {
          if (!self.animation["default"].bool) { return; }
          var inSelf = this;

          self.x += U.Time.deltaTime * self.speed;
        }
      }
    }
    //重写动画帧
    self.artist =
    {
      "default" : [{x:0,y:0,width:35,height:35},{x:35,y:0,width:35,height:35},{x:70,y:0,width:35,height:35}]
    }
    self.OnCollision2D = function()
    {
      self.speed = -self.speed;
    }
    self.Add();
  }


  var a = new Cat(200,50,36,36);
  //开始游戏
  U.GameUpdate();

  window.addEventListener("click",function(){a.animator.ChangeArtist("default",300)});
})
Unity3d的Javascript入门教程 适合初学者,简单容易理解。包含了一些常见的问题与解决方案 立即下载

相关推荐

unity3d 一个特别牛的游戏例子

unity3d 一个特别牛的游戏例子

uniapp Vuex 状态管理模式基本使用

一、uniapp 引入定义挂载Vuex 1、在根目录下建立store目录创建index.js文件 代码如下 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ //相当于data state:{ loginStatus:false }, //相当于computed getters:{ reverseLoginStatus(state){

节节竹的博客 3653

如何通过常规测井曲线识别砂岩、泥岩、碳酸盐岩和煤层

常规测井曲线通过不同岩性的物理性质差异识别砂岩、泥岩、碳酸盐岩和煤层。砂岩表现为低自然伽马(GR)、中等密度(RHOB)和声波时差(DT);泥岩以高GR、高中子(NPHI)和高DT为特征;碳酸盐岩显示低GR、高RHOB和低DT;煤层则具有极低RHOB、极高NPHI和DT的独特组合。综合GR与三孔隙度曲线(RHOB、NPHI、DT)可有效区分岩性,其中密度测井对煤层识别最可靠。电阻率(RT)曲线辅助判断流体性质,但需结合其他参数综合分析。

love code, love life. 2593

Unity3D入门之JavaScript

刚刚接触Unity3D游戏引擎,这里做点学习笔记。下面是我建立的简单场景,左侧的Hierarchy(层次)视图里显示了场景中所有游戏对象,这些基本对象可以从Create下拉菜单里创建。当你点击某个对象,比如立方体Cube时,在右侧Inspector(监视)中可以看到Cube对象的详细信息,比如它的位置信息、表面材质信息,然后可以在其中修改。下方的Project视图中的Assets(资源)里显示了游

秋风扶柳笛的专栏 2万+

学习stm32H7之路开始(STM32H7系列1) 前期准备,HAL库框架

2020.01.07 几个重要的参考网址 1.电子工程世界网 http://tags.eeworld.com.cn/tags/STM32H7 链接: link. 2.转:https://blog.youkuaiyun.com/simon223/article/list/2?t=1 链接: link. ———————————————— 版权声明:本文为优快云博主「Simon223」的原创文章,遵循 CC 4....

kengkengkeng963的博客 3410

Wireshark、Fiddler、Charles 三款抓包工具的本质差异与选型指南

抓包工具是网络调试与接口分析的基础能力,其核心在于理解OSI模型分层原理——不同工具工作在不同协议层级,解决不同维度问题。Wireshark面向网络层(L2/L3),可捕获原始数据帧与TCP握手细节,适用于DNS异常、丢包重传等底层问题定位;Fiddler和Charles则工作在应用层(L7),作为HTTP(S)代理实现HTTPS解密、请求改写与弱网模拟,是API调试与移动端测试的首选。技术价值体现在:精准匹配问题域(如证书固定需Fiddler脚本绕过,iOS调试依赖Charles证书信任链),避免‘用显微

weixin_28831341的博客 253

Unity3D技术入门之JavaScript

刚刚接触unity3D游戏引擎,这里做点学习笔记。下面是我建立的简单场景,左侧的Hierarchy(层次)视图里显示了场景中所有游戏对象,这些基本对象可以从Create下拉菜单里创建。        当你点击某个对象,比如立方体Cube时,在右侧Inspector(监视)中可以看到Cube对象的详细信息,比如它的位置信息、表面材质信息,然后可以在其中修改。下方的Project视图中的As

QST_Apple的专栏 706

论文超详细精读|万字:2s-AGCN

1. 提出了一种新的双流自适应图卷积网络(2S-AGCN)用于基于骨架的动作识别。**模型中的图的拓扑既可以统一地学习,也可以通过BP算法以端到端的方式单独学习。** 2. 提出了一种同时对**一阶和二阶信息(骨架的长度与方向)建模的双流框架**,在识别精度上有了显著的提高。 它将骨架数据的图结构参数化,并嵌入到网络中,与模型共同学习和更新。 3. 文章主要创新点有两个,一个是双流网络,另外一个是自适应。

IanYue的博客 6384

3D可视化项目,选择unity3D还是three.js,是时候挑明了。

Unity3D是一款跨平台的游戏引擎,可以用于开发2D和3D游戏。它提供了一个可视化的开发环境,包含了强大的编辑器和工具,使开发者可以方便地创建游戏场景、添加物体、设置物理效果、编写脚本等。Unity3D支持多种平台,包括PC、移动设备、主机等,可以发布到不同的平台上。Three.js是一个基于WebGL的JavaScript库,用于创建3D图形和动画。它提供了一系列易于使用的API,可以在网页上实现各种3D效果,包括渲染3D模型、创建光影效果、添加动画等。

贝格前端工场的博客 5538

DIY压电陶瓷传感器信号放大:从拆解到JFET电路实战(附示波器实测数据)

本文详细介绍了如何利用废旧设备拆解的压电陶瓷片,结合JFET(结型场效应管)高输入阻抗特性,DIY搭建高灵敏度振动传感器放大电路。从元件拆解、参数实测到JFET共源极放大器实战搭建与调试,提供了完整的步骤、示波器实测数据及优化方案,帮助电子爱好者实现低功耗振动检测应用。

weixin_29195615的博客 389

哈工大集合论与图论(下)慕课MOOC答案

答案选自2023哈工大集合论与图论慕课,慕课的题重复率很高并且具有极高的相似性,选答案时要格外注意对比选项,能力有限答案不一定面面俱到,整理不易读者且用且珍惜。

qq_34168477的博客 2903

jQuery

介绍 jQuery就是辅助 JavaScript 开发的 js 类库。 使用 <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script> $(function () { // 表示页面加载完成 之后,相当 window.onload = function...

UnityAlvin 366

5 分钟上手 Kimi Work:安装、配置、跑通第一个任务

这篇文章提供了Kimi Work的快速入门指南,帮助用户在5分钟内完成从安装到运行第一个任务的全过程。主要内容包括: 安装步骤: macOS用户下载.dmg文件并拖入Applications Windows用户下载.exe安装包,需注意中文路径问题 初始设置: 使用现有Kimi账号登录 检查任务配额和文件访问权限 首个任务推荐: 建议从简单的本地文件整理开始(如按类型分类桌面文件) 详细说明了任务执行流程和审批机制 常见问题: 计划生成卡顿的解决方法 文件无变化的排查步骤 进阶建议: 提供难度递增的后续任务

sg_knight的专栏 2786

WebGL和U3D交互

test                 function test(arg)   {      alert(arg);   }            var gameInstance = UnityLoader.instantiate("gameContainer", "Build/Test.json", {onProgress: UnityProgress});    

rbagglo的专栏 2516

Unity3D实现自定义河流路径或泥石流路径

此工具是一个插件,插件很好用,可以根据地形编辑河流的走向以及宽度,也可以发挥想象编辑成其他的效果,比如泥石流效果,岩浆效果,小溪,或者大江或者大河等等博客将会介绍可以编辑河流的工具的使用。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。提示:以下是本篇文章正文内容,下面案例可供参考本次总结的就是工具的使用, 有需要会继续增加功能不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

心疼你的一切博客 5268

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Unity3D使用经验总结 优点篇

一、可定制的IDE环境U3D这种ALL IN ONE的设计思路,我在一个叫神咒的代码中见到过。 集所有编辑器于一身。 虽然神咒的编辑器不能自由扩展,但由于是公司内部的引擎,所以,它的使用,也很方便。 比如,在场景中突然想要对一个模型的材质进行编辑,则选中此模型,右键,弹出材质编辑器即可。 U3D的组件式思路,将这种关系变得更加紧密。 你都感觉不到自己在使...

weixin_34406061的博客 1519

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

网页js传值给unity3d

Unity3D发布成web形式后,可以通过 GetUnity().SendMessage("gameobj","function_name",value); 给u3d传递参数。不过,要注意的是在web中要等u3d加载完传值才能成功,所以要通过以下js程序以2秒时间循判断GetUnity()是否为空。 1: <script defer="defer"> 2...

weixin_34242819的博客 809

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Unity3D笔记 愤怒的小鸟<五> 小鸟动画+Unity3D如何设置断点调式

  前言:实现小鸟的动画,之前吐槽过js写U3D,就改成了C#来写,没想到遇到问题了。 实现的效果 using UnityEngine; using System.Collections; /// <summary> /// 2D动画组件 /// </summary> public class aniSprite : MonoBe...

weixin_30684743的博客 132

成为资深开发的学习内容

学习目标: 1 webapack 的使用,比如打包代码,自动化编译 2 npm各种第三方库,常用的库:protobuf jszip uglify-js md5 3 战斗逻辑 4 U3D知识 6 websocket协议 7 屏幕适配 8 异步语法糖await aysnc的使用 10 学习python脚本 11 发包 安卓包 ios 包 ...

奇士的博客 491

vue与u3d互调

vue与u3d互调

收集、分享 850

接下来的安排+U3D界面初探

这周的会议上根据当前剩余任务量以及成员的具体情况进行了再分配,撸主也终于不得不开始码代码的生活(该来的还是来了),这篇博客简单记录下会议结果、接下来的安排,以及熟悉U3D引擎。 会议确定的游戏流程大致如下: 启动游戏—>登陆界面—>以滚动文字和图片的方式讲述故事背景—>加载界面—>进入新手引导系统并得到音符兽图鉴—>打开摄像头扫描卡牌以确定自己的音符兽  接下来进入主界面,游戏正式开始 其中

chaoszelo的博客 599

u3d消消乐移植Laya心得总结

如何实现携程 async testAwaite() { console.log(‘2’); let r=new Promise(resolve => setTimeout(resolve, 1000)); console.log®; window["My__awaiter"](r); console.log('ok'); } 注意!微信开发者工具需要增强编译,否则报错

723

u3d-棋牌项目开发技术基础

对于u3d项目技术基础必要的有java 基础,

lx554968634的专栏 1734

unity学习、unity培训、unity企业培训、U3D资源、U3D培训视频U3D教程、U3D常见问题、U3D项目源码

unity3d 计时器 博客分类: 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。       //Time类包含了一个重要的类变量deltaTime,它表示距上一次调用Update或FixedUpdate所用的时间。

dingdingdingjian的专栏 904

关于U3D的最新版本的更新问题

我读研的时候学的是计算机图形学,开发了一段时间U3D之后,2014年封笔后 五年后, 我又掀起了学习U3D的工作。。。。。。 风水轮流转,原来的代码解析的时候出现一些编译错误 大神改了无数版本,但是稍微改改代码运行了起来 我的shader写作能力已远远落后 悲哀呀 悲哀,csdn的博客写起来真费劲了,,,,, ...

woaipaoche的专栏 694
上一篇: GitHub使用流程
下一篇: 杂项
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值