html5 游戏 动画设计,HTML5 Canvas 动画实例

2023-10-27

原标题:HTML5 Canvas 动画实例

在开发在线游戏时,绘制动画是非常重要的。本节介绍一个使用 Canvas API 实现的动画实例——游戏人物的跑步动画。

动画的概念及原理

1.动画

动画是通过一幅幅静止的,内容不同的画面(即帧)快速播放使人们在视觉上产生运动的感觉。这是利用了人类眼睛的视觉暂留原理。利用人的这种生理特性可制作出具有高度想象力和表现力的动画影片。

2.原理

人们在看画面时,画面会在大脑视觉神经中停留大约 1/24 秒,如果每秒更替 24 个画面或更多,那么前一个画面还没在人脑中消失之前,下一个画面进入人脑,人们就会觉得画面动起来了,它的基本原理与电影、电视一样,都是视觉原理。

在计算机上要实现动画效果,除了绘图外,还需要解决下面两个问题:

(1)定期绘图,也就是每隔一段时间就调用绘图函数进行绘图。动画是通过多次绘图实现的,一次绘图只能实现静态图像。

可以使用 setInterval()方法设置一个定时器,语法如下:

setInterval(函数名,时间间隔)

时间间隔的单位是毫秒(ms),每经过指定的时间间隔系统都会自动调用指定的函数完成绘画。

(2)清除先前绘制的所有图形。物体已经移动开来,可原来的位置上还保留先前绘制的图形,这样当然不行。解决这个问题最简单的方法是使用 clearRect(x, y, width, height)方法清除画布中指定区域的内容。

图 5-13 是一个方向(一般都是 4 个方向)的跑步动作序列图。假如想获取一个姿态的位图,可利用 Canvas 的上下文 2D 对象的 drawImage(image, sourceX, sourceY, sourceWidth,sourceHeight,destX, destY, destWidth, destHeight)将源位图上某个区域(sourceX, sourceY,sourceWidth, sourceHeight)拷贝到目标区域的(destX, destY)坐标点处,显示大小为(宽destWidth, 高 destHeight)。

5c89a21a956fc6b903e7aeb207ad8b90.png

【例 5-14】 实现从跑步动作序列 Snap1.jpg 文件中截取的第 3 个动作(帧)。 分析:在 Snap1.jpg 文件中,每个人物动作的大小为 60 像素×80 像素,所以截取源位 图的 sourceX=120,sourceY=0,sourceWidth=60, sourceHeight=80 就是第 3 个动作(帧)。

您的浏览器不支持 canvas。

< type="text/java">

function draw()

{

var canvas=document.getElementById("myCanvas"); //获取网页中的 canvas 对象

var context = canvas.getContext("2d"); //获取 canvas 对象的上下文

var imageObj = new Image(); //创建图像对象

imageObj.src = "Snap1.jpg";

imageObj. = function(){

//从原图(120, 0)位置开始截取中间一块宽 60*高 80 的区域,原大小显示在屏幕(0,0)处

ctx.drawImage(imageObj, 120, 0, 60, 80, 0, 0, 60, 80);

};

}

window.addEventListener("load", draw, true);

>

浏览例 5-14 的结果如图 5-14 所示,在页面上仅仅显示第 3 个动作。

190d859e17d9734a79412b48b1278f9c.png

游戏人物的跑步动画

【例 5-15】 实现游戏人物的跑步动画。 首先定义一个 Canvas 元素,画布的长和宽都是 300,代码如下:

HTML5 Canvas 实现游戏人物的跑步动画

在 Java 代码中定义一个 Image 对象,用于显示 Snap1.jpg。然后定义一个 init() 函数,初始化 Image 对象,并设置定时器,代码如下:

< type="text/java">

var imageObj = new Image();

var x =300;

var n =0; //计数器

108 HTML5 网页游戏设计从基础到开发

function init(){

imageObj.src = 'Snap1.jpg';

imageObj. = function(){ //图片加载成功

setInterval(draw,100); //定时器,每 0.1 秒执行一次 draw()函数

};

//此处省略 draw()函数的代码

window.addEventListener("load", init, true);

>

使用了定时器,每隔 100 毫秒就会在 Snap1.jpg 图片截取一张 60 像素×80 像素大小的 小图并绘制出来,且每次向左移 15 像素,直到最左端时重新从右侧开始,不停循环,就可 见游戏人物在屏幕上不停地奔跑。 下面分析 draw()函数的实现。例 5-14 中仅仅显示人物的第三个动作,而为了实现动画 需要 clearRect(x, y, width, height)不断清除先前绘制的动作图形,再绘制后续的动作。所以 需要一个计数器 n,记录当前绘制到第几动作(帧)了。

function draw()

{

var canvas=document.getElementById("myCanvas"); //获取网页中的 canvas

对象

var ctx = canvas.getContext("2d"); //获取 canvas 对象的上下文

ctx.clearRect(0,0,300,300); //清除 canvas 画布

//从原图(60*n)位置开始截取中间一块宽 60*高 80 的区域,显示在屏幕(x,0)处

ctx.drawImage(imageObj, 60*n, 0, 60, 80, x, 0, 60, 80);

if(n>=8){

n=0;

}else{

n++;

}

if(x>=0){

x=x-30; //前移 30 像素

}else{

x=300; //回到右侧

}

}

浏览例 5-15 的结果是一个游戏人物不停重复地从右侧跑到左侧的动画。返回搜狐,查看更多

扫码,全网低折扣购书

责任编辑:

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

html5 游戏 动画设计,HTML5 Canvas 动画实例 的相关文章

  • C# 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...

    本文将使用一个gitHub开源的组件技术来读写西门子plc数据 使用的是基于以太网的TCP IP实现 不需要额外的组件 读取操作只要放到后台线程就不会卡死线程 本组件支持超级方便的高性能读写操作 官方地址 http www hslcommu
  • 关于java.servlet.*缺失问题

    上图使用的tomcat版本为10 0 23 此问题目前出现在Tomcat10系列 而 Javax servlet 标红 不存在 的原因是因为包名改了 Tomcat 10 用以下的 import import jakarta servlet
  • ESP12f/E(8266)以及STM32串口自动烧录电路

    在使用CH340C芯片进行自动烧录时 经常会用到RTS和DTR两个联络输出信号 电脑烧录程序控制芯片这两个引脚的高低电平 从而控制主控芯片IO0和reset引脚进行自动烧录并复位 这两个信号都是低电平有效 STM32 这里需要注意的是使用的
  • jpa报错:check the manual that corresponds to your MySQL server version for the right

    原因一 check the manual that corresponds to your MySQL server version for the right 因为表字段中使用了关键字 private String describe 解决
  • 查看tensor的形状,行列大小

    torch size是tuple 元组的子类 因此他支持元组所有的操作 如x size 0 import pandas as pd import numpy as np import torch x torch rand 5 3 print
  • 基于内容的课程推荐系统

    引言 基于Coursera课程数据集 将课程名称向量化 计算与目标课程标题向量最相似的课程向量 实现基于内容的课程推荐 代码实现 准备实验环境与数据 import numpy as np import pandas as pd from s
  • SHELL学习笔记----IF条件判断,判断条件

    前言 无论什么编程语言都离不开条件判断 SHELL也不例外 if list then do something here elif list then do another thing here else do something else
  • docker容器服务无法访问题解决

    问题现象 前不久通过docker启动的容器服务均无法访问 开始以为容器坏了 也不着急使用就没当回事 最近这几天需要部署监控服务 容器启动后浏览器访问一直提示网络连接错误 并且在启动容器时有以下提示 WARNING IPv4 forwardi
  • Java基础--- 抽象方法和类 Abstract Methods and Class

    Java基础 抽象方法和类 Abstract Methods and Class 抽象方法 Abstract Method 抽象类 Abstract Class 关于抽象类不能被实列化 使用new operator 抽象方法 Abstrac
  • 计算机是学前端开发好还是后端开发好?

    学前端还是学后端 这是个好问题 很多人问 在我看来 它可能是个伪命题 既然题主问的是前后端 那我默认你问的是网站开发的问题 这是我们很长一段时间里对于网站开发工程师的分工 那么我们来看传统意义上 前后端是如何分工的 后端工程师负责渲染出基础
  • sql server 存储过程中输入参数需要用in而失效的问题解决方案

    在存储过程中使用IN函数 传入多个参数时 会有问题 因为输入参数 1 2 3 是一个数据 而不是一个集合 导致sql失效 三种解决方案 1 建立函数分割输入参数里面的 create FUNCTION dbo Split2 RowData v
  • mac下编译protobuf c++

    由于protobuf官网的文档是英文版的 并且并没有比较详细的说明 可能说得很清楚了 只是我这种英文渣看不懂 学习起来着实费了一翻功夫 在此 记录一下学习过程 希望尽量详细 一 编译过程需要的工具 1 protobuf源码 下载地址 htt
  • 【HTML+CSS】之CSS布局

    常用布局方式 table 表格布局 float 浮动 margin inline block 布局 flexbox布局 1 flexbox 布局
  • WebDav的几种应用方法

    windows系统将阿里云盘挂载成本地磁盘使用 1 获取阿里云盘的登录token 2 使用脚本程序运行起来webdav aliyundriver的jar包 3 使用RaiDrive软件将阿里云盘挂载成本地磁盘 4 需要注意的是 token的
  • 分布式存储Ceph中的逻辑结构Pool和PG

    Ceph中的逻辑对象有Object Pool PG 本文简单介绍相关的概念以及之间的关系 PG状态变化过程等 1 Ceph集群中的逻辑结构 1 1 Object Object是Ceph的最小存储单元 大小可以自己定义通常为2M或4M 每个O
  • 某网站登录接口password参数还原

    本次分析的网站 aHR0cHM6Ly9tLmN0eXVuLmNuL3dhcC9tYWluL2F1dGgvbG9naW4 cmVkaXJlY3Q9JTJGbXk 1 抓包 本次需要分析的是 password 参数 所以 在控制台全局搜索 pa
  • 12000+套Midjourney描述词!有了它真的可以为所欲为!

    今天给各位来个猛的 更新一些最新最全的Midjourney关键词 方便大家在AI绘画中使用 有了这些关键词你可直接复制粘贴拿过来稍加修改就可以用了 当然这些关键词不仅仅只适合Midjourney这个平台 其他AI类绘画工具同样适用 Midj
  • 引用传递的参数类型,加不加ref是不同的

    教科书上说引用传递的参数引用时 加不加ref都可以 都会改变参数原来的值 值传递参数引用时如果想要改变原来的值 必须加ref 以前遇到的大部分情况确实是如此 引用传递类型比如ArrayList DataTable到另一个方法中 并在该方法中
  • 关于腾讯云短信sms接口自定义API写法 PHPdemo

    腾讯云短信 Short Message Service SMS 接口自定义API写法 PHPdemo 问题1 调试时 参数必须是真实的 这样才能一次到位 比如我 故意短信签名 填个错的 这样不扣量 提示个 FailedOperation S

随机推荐

  • IDEA快捷键

    Ctrl Shift Enter 语句完成 否定完成 输入表达式时 键 Ctrl E 最近的文件 Ctrl Shift E 最近更改的文件 Shift Click 可以关闭文件 Ctrl OR 可以跑到大括号的开头与结尾 Ctrl F12
  • Yii Framework 开发教程(1) 第一个应用Hello World

    Yii Framework 教程可以参见官方中文文档 那么为什么还要写这个开发教程呢 本教程目的是通过不同的视角 主要是通过开发Windows应用C C 程序员的角度 帮助Windows 桌面应用或ASP Net程序员较快的掌握PHP Yi
  • C++用 _findfirst 和 _findnext 查找文件

    一 这两个函数均在io h里面 二 首先了解一下一个文件结构体 struct finddata t unsigned attrib time t time create time t time access time t time writ
  • ipv6地址为什么显示两个_基本IPv6故障排除命令/ IPv6 Rosetta Stone 2019

    这篇文章旨在概述Windows Linux和macOS这三个主要操作系统的基本IPv6故障排除方法和命令 对于这些操作系统 仅适用于某些特定任务 它包括 IPv6 Rosetta Stone 的更新版本 这是我经常向IPv6初学者介绍的网站
  • 怎么用计算机上的打印设备打印,电脑中怎么添加打印机设备

    电脑中怎么添加打印机设备 电脑中怎么添加打印机设备呢 下面小编介绍一下 具体如下 1 打开电脑 点击 控制面板 图标 2 在如图页面 找到 硬件和声音 点击打开 3 然后点击 设备和打印机 选项 4 打开后 点击上方的 添加打印机 5 最后
  • 递归解题思维

    目录 开篇 用递归解题的意义 递归思维与数学归纳法 递归解题的类型 递归结题步骤 递归例题 1 求N阶乘 2 找出数组中的最小值 3 字符串翻转 小结 开篇 网上关于如何用递归解决问题方法的文章很多了 看了一些 我也来谈谈我的看法 很多文章
  • elementui 更换主题色

    定义CSS变量 由var 函数来获取值 设定值 root background color FF0000 获取值 div background color var background color JS获取变量 const element
  • c语言进行菜单制作

    include stdlib h include
  • Lecture11: (增强)拉格朗日松弛技术

    目录 1 理论背景 2 数学分析 3 LR计算案例 3 1 分解 3 2 算法 4 ALR计算案例 4 1 主要思想 4 2 ADMM 当你的问题中包含复杂约束时 你可能需要该方法 本节目标 阐述拉格朗日松弛 增强拉格朗日松弛和交替方向乘子
  • Ubuntu22.04安装Git及配置

    Git安装配置 apt get install git 安装Git git version 安装成功后显示版本 git version 2 34 1 git config global user name name 配置用户名 git co
  • Scrapy之CsvItemExporter生成的CSV文件乱码解决

    环境信息 Python 3 6 5 Scrapy 2 2 导出文件逻辑 self file open Users chenjunfeng02 Downloads enrolldata csv wb self exporter CsvItem
  • 【电脑蓝屏】—— inaccessible boot device

    文章目录 一 问题描述 二 问题出现场景及原因分析 1 重装系统后出现该蓝屏情况 三 问题解决方法 附件 一 问题描述 蓝屏提示 inaccessible boot device 二 问题出现场景及原因分析 1 重装系统后出现该蓝屏情况 设
  • 【matlab深度学习工具箱】classificationLayer参数详解

    classificationLayer 文章目录 classificationLayer 语法 描述 例子 创建分类图层 创建加权分类图层 输入参数 名称 值参数 Name 图层名称 默认 字符向量 字符串标量 ClassWeights 加
  • 多元回归预测

    文章目录 效果一览 文章概述 部分源码 参考资料 效果一览 文章概述 多元回归预测 Matlab基于粒子群算法 PSO 优化径向基神经网络 PSO RBF 的数据回归预测 多变量输入模 评价指标包括 MAE RMSE和R2等 代码质量极高
  • 眼底图像血管分割学习笔记

    一 图像处理 训练集的图片格式为tif 其中相应的分割标签格式 为gif 一开始想着这些图片是不是都要先转换成 jpg或者 png 在查阅了一些资料后其实还是不太清楚 然后在看别人的代码时 发现没有处理 所以就先这样弄着 出现的问题 cla
  • Centos7 上的sqlite3安装及升级

    一 wget升级 yum install y wget 二 sqlite3安装 sudo yum install sqlite devel 查看sqlite3的版本 sqlite3 version 三 sqlite3升级 下载源码 wget
  • 试试这两个方法,做视频二次剪辑并不难,新手一天可以收入200

    很多新手看到别人每天做短视频一个月有过万 几万的收益 看到别人能赚钱 觉得自己可能赚不到这么多 赚个7 8千应该没问题 于是开始自己学着也做起了短视频自媒体 每天埋头苦干 但每天的收益却很低 只有几块 几十 有的甚至更少 跟自己想象的完全不
  • 部署Promethuse监控Hadoop节点

    部署Promethuse监控Hadoop节点 目标 安装 将hadoop的jmx信息采集到指定端口 配置prometheus 其他说明 目标 Hadoop本身是对相当数量的指标 metrics 进行实时监控的 但是Hadoop本身并不提供方
  • Java多线程详解及示例

    Java多线程详解 摘要 本文将深入探讨Java多线程编程的重要性和使用方法 介绍多线程概念 讨论多线程的优势 并提供实际示例 此外 还将探讨多线程编程中的常见问题以及如何避免这些问题 通过本文 您将获得对Java多线程编程的全面理解和实践
  • html5 游戏 动画设计,HTML5 Canvas 动画实例

    原标题 HTML5 Canvas 动画实例 在开发在线游戏时 绘制动画是非常重要的 本节介绍一个使用 Canvas API 实现的动画实例 游戏人物的跑步动画 动画的概念及原理 1 动画 动画是通过一幅幅静止的 内容不同的画面 即帧 快速播