在游戏中发挥HTML5 Canvas的潜能

HTML5 Canvas 从入门到动画:把浏览器的画布玩明白 HTML5 带来的新特性里,Canvas 可能是最「不像 Web」的那一个。我们习惯了用 div、span、section 拼页面,习惯了 DOM 树、CSS 盒模型、BFC 这些概念。但 Canvas 完全不按这套逻辑出牌——它只有一个标签<canvas>,剩下的全靠 JS 一笔一笔画出来。没有 DOM 节点,没有样式表,你拿到的是一块像素级的画布,想画什么,代码说了算。这听起来很原始,但恰恰是这种「原始」给了它极大的发挥空间。 阅读详情

在游戏中发挥HTML5 Canvas的潜能


目前, 支持HTML 5的浏览器和Windows 8 Metro成为了游戏开发的候选方案。

利用canvas(画布)可以实现硬件加速,你可以在上面绘制游戏的内容,通过一些技巧可以达到每分钟60帧的渲染速度。

在游戏中,fluidity(流畅性)这一概念非常重要,因为好的流畅性能带给玩家更好的体验。

这篇文章的主旨在于教你一些技巧,让你可以最大程度地发挥HTML5 canvas的潜能。

我将通过一个例子来表达我要讲的内容。这个例子是2D tunnel effect(2D隧道效应),它是我为Coding4Fun 会议写的(我参加了在法国举办的TechDays 2012)。

(http://video.fr.msn.com/watch/video/techdays-2012-session-technique-coding4fun/zqy7cm8l).

早在80年代,当我还是一个年轻的demomaker的时候曾受到一些Commodore AMIGA代码的启发,从而写了这个2D tunnel effect。

经过不断地改进,现在它仅使用了canvas和Javascript(最初的代码是基于68000汇编的):

完整的代码可以从这里获得:http://www.catuhe.com/msdn/canvas/tunnel.zip

这篇文章的目的不是讲解该程序的开发过程,而是让你通过优化已有的代码来达到一个实时性的效果。

使用off-screen canvas(离屏画布)来读取图片数据

我想讲的第一点是怎样使用canvas来读取图片数据。实际上,任何一个游戏都需要图形来显示游戏界面和背景。canvas有一个非常有用的画图方法:drawImage 。这个功能可以用来绘制游戏界面,通过它你可以定义起始和目的区域。

但是有时候光使用它是不够的,比如你想要在源图像上实现一些特效,或者源图像不是一个简单的位图而是一个复杂的资源(如地图)。

在这些情况下,你需要访问到图片的内部数据。但是Image标签无法读到这些数据,这时候就该canvas上场了。

事实上,每当你需要从图片中读取内容的时候,你都可以使用off-screen canvas。也就是说,当你导入一张图片的时候,你只需要将它渲染到canvas中(而不是DOM里),然后你就可以通过读取canvas的像素点来获得源图片的内容了(这个过程非常简单)。

有关部分的代码如下(2D tunnel effect中用来读取隧道的纹理数据的):

var loadTexture = function (name, then) {

    var texture = new Image();

    var textureData;

    var textureWidth;

    var textureHeight;

    var result = {};

    // on load

    texture.addEventListener(‘load’, function () {

        var textureCanvas = document.createElement(‘canvas’); // off-screen canvas

        // Setting the canvas to right size

        textureCanvas.width = this.width; //<– “this” is the image

        textureCanvas.height = this.height;

        result.width = this.width;

        result.height = this.height;

        var textureContext = textureCanvas.getContext(’2d’);

        textureContext.drawImage(this, 0, 0);

        result.data = textureContext.getImageData(0, 0, this.width, this.height).data;

        then();

    }, false);

    // Loading

    texture.src = name;

    return result;

};

为了使用这些代码,你还要保证隧道纹理图片的导入是异步的,因此你需要传递then参数,代码如下:

// Texture

var texture = loadTexture(“soft.png”, function () {

    // Launching the render

    QueueNewFrame();

});

使用硬件缩放功能

现代浏览器和Windows8都支持硬件加速的canvas,这意味着,你可以使用GPU来调整canvas里面内容的尺寸。

在2D tunnel effect里,该算法要求处理canvas的每一个像素点,因此一个1024×768的canvas就得处理786432个像素点,并且为了达到流畅性的要求,每分钟得处理60次,也就是说每分钟要处理47185920个像素点!

很显然,任何可以减少像素处理总数的方法都能带来极大的性能提升。

又一次轮到canvas上场了!下面的代码展示了怎样使用硬件加速来调整canvas的内部有效区域使之等于DOM对象的外部尺寸:

// Setting hardware scaling

canvas.width = 300;

canvas.style.width = window.innerWidth + ‘px’;

canvas.height = 200;

canvas.style.height = window.innerHeight + ‘px’;

请注意DOM对象的尺寸(canvas.style.width、canvas.style.height)和canvas有效区域的尺寸(canvas.width、canvas.height)之间的差别。

当这两个尺寸不同的时候,硬件会自动调整有效区域的大小,这是一件很棒的事:我们可以绘制低分辨率的图形,然后通过GPU的调整使之符合DOM对象的大小(实现一个漂亮免费的模糊滤镜效果)。

在这种情况下,本来只有300×200 的图像会被GPU扩展到跟你的窗口一样大。

所有的现代浏览器都支持该功能,因此你可以放心的使用。

优化rendering loop

制作游戏的时候,需要一个rendering loop用来绘制所有的组件(如背景,界面,分数等等)。这个loop是代码的核心,因此必须充分优化从而保证游戏的快速和流畅。

RequestAnimationFrame

HTML5一个有趣的功能是使用window.requestAnimationFrame. 代替window.setInterval 来创建定时器,从而实现每(1000/16) 毫秒渲染一次(以达到60fps),你可以通过requestAnimationFrame将该任务交给浏览器。调用这个方法表明你想要尽快的更新有关的图形。

浏览器会将你的请求放入内部渲染计划,并使之与其本身的渲染及动画代码(CSS, transitions等等)同步。这个方法另一个有趣的地方在于如果窗口不显示(minimized, fully occluded等等),你的代码就不会被调用。

这能改善性能,因为浏览器可以优化并发渲染从而提高动画的流畅性(如你的渲染周期太长的话浏览器会将它与其本身的渲染及动画周期同步)。

代码很清晰(别忘了window前缀):

var intervalID = -1;

var QueueNewFrame = function () {

    if (window.requestAnimationFrame)

        window.requestAnimationFrame(renderingLoop);

    else if (window.msRequestAnimationFrame)

        window.msRequestAnimationFrame(renderingLoop);

    else if (window.webkitRequestAnimationFrame)

        window.webkitRequestAnimationFrame(renderingLoop);

    else if (window.mozRequestAnimationFrame)

        window.mozRequestAnimationFrame(renderingLoop);

    else if (window.oRequestAnimationFrame)

        window.oRequestAnimationFrame(renderingLoop);

    else {

        QueueNewFrame = function () {

        };

        intervalID = window.setInterval(renderingLoop, 16.7);

    }

};

你只需要在rendering loop的结尾调用这个函数并在接下来的代码段里进行注册即可:

var renderingLoop = function () {

    …

    QueueNewFrame();

};

访问DOM(Document Object Model)

为了优化rendering loop,你必须遵循这条黄金准则:DO NOT ACCESS THE DOM(不要访问DOM)。即使现代浏览器在这方面做了优化,读取DOM对象属性还是太慢了。

例如,在我的代码里,我使用了Internet Explorer 10 profiler(IE10的提供的分析器,按F12快捷键打开),显示的结果如下:

 

如图所示,访问canvas的宽度和高度会花费大量的时间!

原始代码如下:

var renderingLoop = function () {

    for (var y = -canvas.height / 2; y < canvas.height / 2; y++) {

        for (var x = -canvas.width / 2; x < canvas.width / 2; x++) {

            …

        }

    }

};

你可以通过两个变量来预先获取canvas.width 和 canvas.height,然后在后面用变量来代替这些属性值:

var renderingLoop = function () {

    var index = 0;

    for (var y = -canvasHeight / 2; y < canvasHeight / 2; y++) {

        for (var x = -canvasWidth / 2; x < canvasWidth / 2; x++) {

            …

        }

    }

};

是不是非常简单?虽然有时候很难注意到这些细节,但是请相信我这绝对是件值得的事。

预先计算

通过分析器得知,Math.atan2函数比较慢。事实上,该操作并不需要在运行时计算,你可以在JavaScript里面加一些代码预先计算出结果。

 

一般来说,预先计算一些较为费时的代码是一种好方法。这里,在运行rendering loop之前,我已经计算好了Math.atan2:

// precompute arctangent

var atans = [];

var index = 0;

for (var y = -canvasHeight / 2; y < canvasHeight / 2; y++) {

    for (var x = -canvasWidth / 2; x < canvasWidth / 2; x++) {

        atans[index++] = Math.atan2(y, x) / Math.PI;

    }

}

atans数组的使用明显的提高了性能。

避免使用Math.round, Math.floor 以及 parseInt

最后一点是parseInt的使用:

 

当你使用canvas时,你需要使用一些整数坐标。实际上,所有的计算都采用的浮点数,你需要将它们转换成整形。

JavaScript 提供了 Math.round, Math.floor 甚至 parseInt 来转换数值。但是这个方法做了一些额外的工作(比如检测数据是不是有效的数值,parseInt 甚至先将参数转换成了字符串!)。在我的rendering loop里面,我需要一个更快的转换方法。

在我的旧的汇编代码里面,我使用了一个小技巧:将数据右移0位。这会将浮点数从浮点寄存器移到整数寄存器,并且是通过硬件转换的。右移0位不会改变数据的值,但是会以整数形式返回。

原始代码如下:

u = parseInt((u < 0) ? texture.width + (u % texture.width) : (u >= texture.width) ? u % texture.width : u);

以下是改进后的代码:

u = ((u < 0) ? texture.width + (u % texture.width) : (u >= texture.width) ? u % texture.width : u)>> 0;

当然该方法要求你的数据是合法的数值。

最终结果

实现了上述优化之后得到的结果如下:

 

你可以看到做了这些基本的功能优化之后的表现。

原始的隧道渲染(没做任何优化):

做完上述优化之后:

下表展示了每项优化对帧速率的影响(在我的机器上):

 

更进一步

记住这些关键技巧,你就可以为现代浏览器或Windows8制作实时、快速、流畅的游戏了。

 

英文链接:Unleash The Power of HTML5′s Canvas For Gaming



原文链接:http://www.webapptrend.com/2012/05/2605.html

HTML5 Canvas:深入解析其功能与应用 HTML5 Canvas 是一个画布,允许您使用 JavaScript 在网页上绘制图形、图像、动画等。它是一个矩形区域,您可以使用 JavaScript API 在该区域内绘制各种图形。HTML5 Canvas 是一个功能强大的工具,可以帮助您在网页上实现各种图形绘制、图像处理和动画效果。通过本文的介绍,相信您已经对 HTML5 Canvas 有了一定的了解。在实际应用中,您可以根据需求选择合适的绘图方法,发挥 Canvas 的潜力。 阅读详情

相关推荐

html5 canvas创建弹性碰撞动画

文章有点长但是对于想学习html5 canvas的人来说看完这篇文章是非常值得的。            在线演示地址:为了让百度快些收录,地址放在评论1楼      在这边我们将用到物理学上的速度,加速度,物理边界,碰撞定理,弹性碰撞(非弹性碰撞),动量守恒。       看到这么多是不是很有压力,下面就一一介绍并且最终结果我们将用这些技术制作一个简单的类似行星碰撞的画面(学了这些可以发挥

touchandy 2334

Canvas 从 0 到 1 -- 开发 2D 游戏《保卫家园》-- 【上篇】

Canvas 是 HTML5 提供的一种新的标签形式 - 画布标签通过名字就不难理解这个标签的意思,就和一张白纸一样,我们想呈现什么样的画面都可以(前提你需要一根画笔 – JavaScript)Canvas 是一个矩形画布,可以使用 JavaScript 在画布上进行作画,控制每一个像素,也就是说他本身不具备绘画功能,是需要 JavaScript 来进行作画的,Canvas 非常的丰富多彩,拥有多种的绘制路径,矩形,图形,字符,图像等等方法,使得 Web 网页更加的美丽。...

世界和我们都不该止步于此 3192

HTML5 Canvas迷宫逃生游戏实战项目代码

迷宫生成算法的核心在于如何随机地切割迷宫的墙壁,同时保持迷宫的连通性。在迷宫生成的过程中,可以将迷宫看作由格子组成的一个二维数组,其中“0”代表墙壁,“1”代表通路。大多数迷宫生成算法遵循以下步骤:初始化迷宫,全为墙壁。确定一个入口点,并将其打通。随机选择一个方向,并打通墙壁,延伸出一条通路。在新的通路末端,随机选择一个方向继续打通。重复步骤3和4,直到达到迷宫的出口位置。

weixin_34268462的博客 1103

dom提高分辨率转canvas

dom 内容转成canvas图片 依赖库为html2canvas.js 由于手机的高分辨率,实际dom像素值会很小,解除的图会发虚。 下面的代码演示了如果将当前撑满手机屏幕的dom元素放大2倍的分辨率(ipad为1.2倍)截出图片。 // source dom var $div = $('#shareImage'); // target canvas var canvas = d

jdk137的专栏 2113

HTML5 Canvas核心技术:图形绘制、动画实现与游戏开发实战

下面是一个通用的正多边形绘制函数:i < sides;} else {// 绘制六边形扩展一下,可实现五角星:i++) {ctx.fill();在2D游戏中,利用可高效绘制无限滚动地图或地形区块。callback();// 循环偏移render() {ctx.save();// 使用示例gameLoop();});

weixin_33298352的博客 1407

HTML5实现俄罗斯方块游戏教程

在构建一个基于 HTML5 Canvas 的游戏时,我们需要一种方式来表示游戏中的方块,这通常涉及到它们的形状和大小。方块形状可以通过使用二维数组来定义,其中每个元素代表方块的一部分。我们可以称这些数组为“模式”或者“块形状”。例如,一个简单的1x2长条块形状可以表示为如下二维数组:[1, 1], // 表示第一个方块部分,占据两行一列的位置其中,每个数字1代表一个方块单元格,而0表示空白。更复杂的形状,比如一个“T”形状,可以定义如下:[0, 1, 0], // 第一行为空。

weixin_42360733的博客 1249

(转)DirectX不是全部!3D游戏图形技术解析

泡泡网显卡频道2月19日 近年来3D图形技术的发展势头非常迅猛,软件方面游戏的画面和逼真度有了长足进步,硬件方面显卡的更新换代越来越频繁。但始终存在这样一个现象,无论显卡的性能翻多少倍,游戏玩家们总感觉还是不够强大,GPU庞大的运算能力到底被谁吃掉了呢?     答案很简单,游戏为了提高画面质量、更加接近于真实世界,使用了诸多先进的图形技术,特效的“滥用”大幅提升了游戏画面水平,但也抵消掉了G...

weixin_34259159的博客 413

深入理解HTML5游戏开发:小猪飞飞案例解析

本文还有配套的精品资源,点击获取 简介:HTML5游戏源码为开发者提供了创建Web互动游戏的核心组件。本项目"小猪飞飞"演示了如何利用HTML5的离线存储、canvas、SVG、音频元素、Web Workers、WebGL、事件处理、服务器环境及CSS3等功能,无需安装插件即可在浏览器中运行。通过分析此源码,开发者能深入学习HTML5游戏开发的关键技术和实践方法。 ...

weixin_35756130的博客 1771

Html5-画布(canvas)操作之-像素操作

Html5中的像素操作 | createImageData(), getImageData(), putImageData(), ImageData, CanvasPixelArray canvas/...

Wangxinlei_King的博客 520

HTML5 Canvas粒子发射动画特效实战

HTML5 Canvas是一块可编程的矩形区域,允许使用JavaScript和HTML的<canvas>元素绘制图形。开发者可以利用它创建动态的图形,图像处理,甚至游戏和交互式动画。它的出现填补了HTML页面上静态内容的局限,带来了前所未有的动态视觉体验。在上述HTML元素中,<canvas>标签定义了一块200x150像素的画布,通过JavaScript可以在此画布上进行图形绘制。定义粒子对象的属性和方法是创建粒子系统的基础。以下是粒子对象的一个简单示例:this.x = x;

weixin_28721743的博客 1160

ArcGIS Pro 拓扑编辑实战:从‘地图拓扑’到‘共享编辑’,手把手教你批量修改要素

本文详细介绍了ArcGIS Pro中的拓扑编辑功能,从地图拓扑配置到共享编辑技巧,手把手教你如何批量修改要素。通过实战案例展示拓扑编辑在城市规划、地籍管理等场景中的应用,显著提升编辑效率并减少拓扑错误,是现代GIS技术的重要生产力工具。

weixin_30500473的博客 505

HTML5之canvas绘图

canvas>是 HTML5 引入的一个强大元素,允许直接在网页上进行矢量图形和位图图像的绘制,为网页提供了一个动态图形渲染的平台。这一特性极大丰富了网页的表现力,特别是在数据可视化、游戏开发、交互式图表和动画制作等领域发挥着关键作用。查看浏览器支持率canvas 是一种强大的 HTML5 技术,用于在网页上绘制图形和图像,支持绘制基本形状、处理图像、实现动画效果以及响应用户事件,广泛应用于游戏开发、数据可视化和交互式应用中。

a123456234的博客 1458

開機自動進入UEFI Interactive Shell無法正常開機怎麼辦?

BIOS/UEFI,啟動後進入UEFI Interactive Shell大多數人都告訴你沒有安裝系統去裝系統吧,但你明明昨天還在運行系統?今天就這樣?有沒有解決辦法?

sheaahhoi1的博客 7742

Canvas详解

一、canvas 简介 1.1 什么是 canvas?(了解) 是 HTML5 提供的一种新标签 <canvas></canvas> 英 ['kænvəs] 美 ['kænvəs] 帆布 画布 Canvas 是一个矩形区域的画布,可以用 JavaScript 在上面绘画。控制其每一个像素。 canvas 标签使用 JavaScript 在网页上绘制图像,本身不具备绘图功能。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 HTML5 之前的 web 页

发果叁 4万+

28、基于图像快速序列视觉呈现(RSVP)的脑机接口特征提取与分类算法综述

本文综述了基于图像快速序列视觉呈现(RSVP)的脑机接口(BCI)中的特征提取与分类算法。RSVP技术通过快速连续呈现图像序列,结合脑电图(EEG)信号分析,实现对目标图像的识别和标记。文章详细介绍了RSVP实验的设计、EEG数据的采集与预处理,并探讨了低信噪比、维度灾难、重叠epoch和不平衡数据集等挑战。针对特征提取,讨论了有监督空间滤波方法(如CSP、xDAWN、LDA波束形成器)的原理和应用。在分类策略部分,涵盖了线性分类技术(如LDA、BLR、LR、SVM)和非线性分类方法(如MLP、CNN)。文

hh234的博客 337

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1391

沉浸式翻译网页翻译不工作?3 分钟自助修复完整指南

沉浸式翻译(Immersive Translate)是一款支持网页、PDF、字幕、输入框与悬停翻译的沉浸式双语翻译扩展。遇到网页停在英文、图标点了没反应、PDF 翻译空白或译文排版错乱?本文按 4 个故障场景给出逐步排查方法,全程约 3 分钟即可完成。 [![沉浸式翻译扩展登录横幅:登录解锁新手任务,免费体验 Pro 模型](https://raw.gitcode.com/GitHub_Tren

gitblog_01014的博客 590

fast-lio系列改进版本

2.回环检测的优化结果,更新到FAST-LIO2的当前帧位姿中,幷进行ikdtree的重构,进而更新submap。其它的效果还不清楚,实测lio部分稳定性很好。用fast-lio_slam就很稳定。融合了fast-lio2和sc-pgo,两部分分开运行,SC-PGO从FAST-LIO2节点获取里程计和激光雷达点云主题。的作者kim在FAST-LIO2的基础上,添加SC-PGO模块,通过加入ScanContext全局描述子,进行回环修正,SC-PGO模块与FAST-LIO2解耦,非常方便,很优秀的工作。

z1872385的博客 3189

解锁HTML5 Canvas:动画开发从入门到实战

本文系统介绍了HTML5 Canvas动画开发技术,从基础入门到实战应用,全面解析了动画制作的核心原理与实现方法。文章首先讲解了Canvas元素的创建、绘图上下文获取及基本绘图方法,随后深入探讨了基于帧的动画原理、requestAnimationFrame的使用技巧以及图形变换技术。通过移动小球和烟花特效两个案例,详细演示了从简单到复杂的动画实现过程。最后提供了性能优化策略和常见问题解决方案,帮助开发者提升动画流畅度和兼容性。

大雨淅淅的博客 1495

数据挖掘实战-基于情感分析+网络语义分析+LDA主题分析对大唐不夜城用户评论进行文本分析

本研究基于去哪儿网和携程网的1888条大唐不夜城游客评论数据,运用Python进行文本分析。通过情感分析发现游客评价以积极为主(占比约70%),中性占20%,消极占10%。采用ROSTCM6软件进行社会网络语义分析,识别不同情绪下的高频词汇。使用LDA主题模型将评论划分为3个主题(夜景、表演、美食),并分析主题强度随时间变化趋势。实验包含数据采集、预处理、情感分析、语义网络分析和LDA建模等完整流程,为景区管理优化提供数据支持。源代码涵盖爬虫、数据处理和可视化分析的全套实现。

m0_64336780的博客 1万+

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

距离场在运动规划中则常用于地图建模和轨迹梯度优化。本文图解欧氏距离场EDT的算法原理,并基于双线性插值给出欧氏梯度场的公式推导,并给出ROS C++和Python的算法实现加深理解

FRIGIDWINTER的博客 4648

Konva.js游戏开发终极指南:用Canvas构建HTML5游戏

想要快速构建交互式HTML5游戏?Konva.js正是你需要的强大工具!🎮 这个轻量级的JavaScript框架让Canvas开发变得简单直观,无论是桌面端还是移动端游戏都能轻松应对。 ## 为什么选择Konva.js进行游戏开发? Konva.js为HTML5 Canvas提供了完整的2D绘图和交互解决方案。它支持精灵动画、碰撞检测、拖放操作等游戏开发核心功能。通过分层渲染机制,你可以高效

gitblog_00116的博客 443

通信算法之283:大疆DJI云哨系统-DJI DroneID物理层协议-解速率匹配及Turbo译码

3. 完整云哨接收机,接收灵敏度。交流: 1279682290 ,2. Turbo译码模块。1. 解速率匹配模块。

leegang12的专栏 868

HTML5 Canvas与WebGL:创建惊艳视觉效果的5个秘诀

HTML5 Canvas与WebGL是现代网页开发中创建惊艳视觉效果的强大工具。无论是制作互动游戏、数据可视化还是动态图形,这两项技术都能帮助开发者实现高质量的视觉体验。本文将分享5个实用秘诀,帮助你快速掌握Canvas与WebGL的核心技巧,打造令人印象深刻的网页视觉效果。 ## 1. 掌握Canvas基础:从简单图形到复杂动画 Canvas是HTML5提供的绘图API,允许开发者通过Jav

gitblog_00303的博客 899

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

8大核心要点:我们能用HTML5 Canvas做什么?

摘要:HTML5的Canvas元素称得上HTML5的核心技术所在。而作为一个依靠JavaScript绘制华丽图像的元素,Canvas究竟能够运用在哪些方面的开发?国外开发者Ohad Eder-Pressman为我们给出了8个精彩的答案。 最近在国外问答网站Quora上,许多开发者对于HTML5 Canvas元素的实用性进行了一系列探讨。Canvas非常灵活,能够很好地融合JavaScri

zzzkk2009的专栏 1081

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 使用HTML5的Canvas和raycasting创建一个伪3D游戏(part1)
下一篇: HTML 5 Video 的未来
wolfman79
博客等级 码龄24年 25粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值