`
aijuans9
  • 浏览: 12924 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

用仿ActionScript的语法来编写html5——第五篇,Graphics绘图

阅读更多

canvas本身就是一个Graphics,可以直接进行绘图
在actionscript里面,每个Sprite都有一个Graphics,Shape我先不考虑了,它更容易实现些,
在Html5中,绘图都是绘在同一个canvas上面的,所以我们现在需要考虑两个问题,
1,如何把每个Sprite里的Graphics在不同的时刻,画在同一个地方
2,因为我们现在在不停的刷新页面,所以如果我们用Graphics绘图,那么它也需要不断的刷新


那我现在依然先假设,每一个Sprite储存的Graphics,只保存一些绘图的命令,而这些绘图命令绘图的时候,全都绘在canvas上
那么按照假设,我需要一个保存这些绘图命令的数组或者类
我现在建一个LGraphics类,这个类里面应该包含绘图指令,和show方法

[javascript] view plaincopy
  1. function LGraphics(){  
  2.     var self = this;  
  3.     self.type = "LGraphics";  
  4.     self.color = "#000000";  
  5.     self.i = 0;  
  6.     self.alpha = 1;  
  7.     self.setList = new Array();  
  8.     self.showList = new Array();  
  9. }  
  10. LGraphics.prototype = {  
  11.     show:function (){  
  12.         var self = this;  
  13.         if(self.setList.length == 0)return;  
  14.         //绘图  
  15.     }  
  16. }  


我在绘图的时候,把绘图指令全部添加到setList里面,然后调用show方法,进行绘图
另外还有一个showList,用来保存绘图的区域,作用一会就知道了
下面来解决指令如何储存的问题
给LGraphics添加方法
[javascript] view plaincopy
  1. drawLine:function (thickness,lineColor,pointArray){  
  2.         var self = this;  
  3.         self.setList.push(function(){  
  4.             LGlobal.canvas.beginPath();  
  5.             LGlobal.canvas.moveTo(pointArray[0],pointArray[1]);  
  6.             LGlobal.canvas.lineTo(pointArray[2],pointArray[3]);  
  7.             LGlobal.canvas.lineWidth = thickness;  
  8.             LGlobal.canvas.strokeStyle = lineColor;  
  9.             LGlobal.canvas.closePath();  
  10.             LGlobal.canvas.stroke();  
  11.         });  
  12.     },  
  13.     drawRect:function (thickness,lineColor,pointArray,isfill,color){  
  14.         var self = this;  
  15.         self.setList.push(function(){  
  16.             LGlobal.canvas.beginPath();  
  17.             LGlobal.canvas.rect(pointArray[0],pointArray[1],pointArray[2],pointArray[3]);  
  18.             if(isfill){  
  19.                 LGlobal.canvas.fillStyle = color;  
  20.                 LGlobal.canvas.fill();  
  21.             }  
  22.             LGlobal.canvas.lineWidth = thickness;  
  23.             LGlobal.canvas.strokeStyle = lineColor;  
  24.             LGlobal.canvas.stroke();  
  25.         });  
  26.         self.showList.push({type:"rect",value:pointArray});  
  27.     },  
  28.     drawArc:function(thickness,lineColor,pointArray,isfill,color){  
  29.         var self = this;  
  30.         self.setList.push(function(){  
  31.             LGlobal.canvas.beginPath();  
  32.             LGlobal.canvas.arc(pointArray[0],pointArray[1],pointArray[2],pointArray[3],pointArray[4],pointArray[5]);  
  33.             if(isfill){  
  34.                 LGlobal.canvas.fillStyle = color;  
  35.                 LGlobal.canvas.fill();  
  36.             }  
  37.             LGlobal.canvas.lineWidth = thickness;  
  38.             LGlobal.canvas.strokeStyle = lineColor;  
  39.             LGlobal.canvas.stroke();  
  40.         });  
  41.         self.showList.push({type:"arc",value:pointArray});  
  42.     }  


三个方法分别是画一条线,一个矩形,一个圆
因为我储存的指令是function
所以,我绘图的时候,可以直接调用方法
所以,将show方法稍作修改
[javascript] view plaincopy
  1. show:function (){  
  2.     var self = this;  
  3.     if(self.setList.length == 0)return;  
  4.     var key;  
  5.     for(key in self.setList){  
  6.         self.setList[key]();  
  7.     }  
  8. }  


这样绘图类就完成了,完整类一会儿请看源代码


接着,在LSprite的构造器里面加上self.graphics = new LGraphics();就可以随时进行绘图了
代码如下
[javascript] view plaincopy
  1. backLayer = new LSprite();  
  2.     addChild(backLayer);  
  3.     //画一圆  
  4.     backLayer.graphics.drawRect(1,"black",[20, 20, 150, 20],true,"#cccccc");  
  5.     //画一个矩形  
  6.         backLayer.graphics.drawArc(2,"black",[100, 100, 50, 0,2*Math.PI,false],true,"#FF0000");  
  7.     //画一条线  
  8.     backLayer.graphics.drawLine(2,"#FF0000",[200, 20, 100, 50]);  


其实,还缺点东西,因为鼠标点击LSprite判断的时候,我只判断了LSprite里保存的bitmap等,如果LSprite里面绘了图,点击的时候,也应该响应鼠标事件的,所以需要判断点击的位置是否在绘制的区域
其实,也简单,给LGraphics添加一个ismouseon方法,来判断是否被点击就可以了
[javascript] view plaincopy
  1. ismouseon:function(event,cood){  
  2.         var self = this;  
  3.         var key;  
  4.         for(key in self.showList){  
  5.             if(self.showList[key].type == "rect"){  
  6.                 if(event.offsetX >= self.showList[key].value[0] + cood.x && event.offsetX <= self.showList[key].value[0] + cood.x + self.showList[key].value[2] &&   
  7.                     event.offsetY >= self.showList[key].value[1] + cood.y && event.offsetY <= self.showList[key].value[1] + cood.y + self.showList[key].value[3]){  
  8.                     return true;  
  9.                 }  
  10.             }else if(self.showList[key].type == "arc"){  
  11.                 var xl = self.showList[key].value[0] + cood.x - event.offsetX;  
  12.                 var yl = self.showList[key].value[1] + cood.y - event.offsetY;  
  13.                 return xl*xl+yl*yl <= self.showList[key].value[2]*self.showList[key].value[2];  
  14.             }  
  15.         }  
  16.           
  17.         return false;  
  18.     }  


showList里面保存着绘图的区域大小,现在派上用场了
[javascript] view plaincopy
  1. init(80,"mylegend",800,480,main);  
  2.   
  3.   
  4. var backLayer;  
  5. function main(){  
  6.     legendLoadOver();  
  7.       
  8.     backLayer = new LSprite();  
  9.     addChild(backLayer);  
  10.       
  11.     //画一圆  
  12.     backLayer.graphics.drawRect(1,"black",[20, 20, 150, 20],true,"#cccccc");  
  13.     //画一个矩形  
  14.         backLayer.graphics.drawArc(2,"black",[100, 100, 50, 0,2*Math.PI,false],true,"#FF0000");  
  15.     //画一条线  
  16.     backLayer.graphics.drawLine(2,"#FF0000",[200, 20, 100, 50]);  
  17.     //鼠标点击判断  
  18.     backLayer.addEventListener(LMouseEvent.MOUSE_DOWN, onmousedown);  
  19. }  
  20.   
  21.   
  22. function onmousedown(event){  
  23.     alert("isclick");  
  24. }  


看一下成果吧,看不到效果的请下载支持html5的浏览器
http://fsanguo.comoj.com/html5/jstoas04/index.html
点击上面的矩形和圆,看看鼠标事件准不准确
分享到:
评论

相关推荐

    ActionScript开发人员指南中文版

    第章:如何使用ActionScript示例 示例类型 在FlashProfessional中运行ActionScript示例 在FlashBuilder中运行ActionScript示例 在移动设备上运行ActionScript示例 第章:本地数据库中的SQL支持 支持的SQL语法 数据类型...

    ActionScript权威指南.pdf

    6. **图形与动画**:ActionScript提供了强大的图形绘制和动画制作功能,如使用Graphics类进行矢量绘图,以及时间轴控制和帧动画。 7. **音频和视频处理**:学习如何在Flash中播放、控制和操作音频和视频资源。 8. ...

    ActionScript实现画图

    在IT领域,ActionScript是一种基于ECMAScript的脚本语言,主要用于Adobe Flash Professional、Flash Player以及Adobe AIR等...对于初学者来说,这是一个很好的练习,有助于掌握ActionScript的基本语法和绘图API的使用。

    ActionScript3参考手册

    - **绘图API**:Graphics 类的使用。 - **动画制作**:Tween 类、TimeLine 类等。 7. **网络通信**: - **XMLHttpRequest**:发送HTTP请求、接收响应数据。 - **Socket编程**:TCP/IP 和 UDP 协议的支持。 - *...

    Flash ActionScript 3.0动画教程(中文高清)+源码

    5. **图形与绘图API**:介绍如何使用Graphics类进行动态绘图,创建复杂的形状和路径,以及填充和描边。 6. **显示对象**:涵盖DisplayObject类和其子类,如MovieClip、Sprite,以及它们的属性和方法,用于创建和...

    ActionScript 3.0 开发手册中文版 CHM格式

    手册会介绍如何使用Shape、BitmapData和Graphics类进行绘图,以及如何利用Tween类和Timeline动画来创建复杂的动态效果。 此外,手册还将覆盖网络编程,包括加载和发送数据(如使用URLLoader和XMLSocket类),以及...

    flash+actionscript学习的实例和教程

    5. **图形绘制**:使用Graphics API创建动态图形和矢量艺术。 6. **组件使用**:了解如何集成和自定义Flash组件,如按钮、文本框等。 7. **网络通信**:学习XML、JSON等数据格式的解析,以及与服务器的Socket通信。 ...

    flash8.0 ActionScript2.0 电子文档

    - **绘图API**:掌握Graphics类,进行动态绘图和填充。 - **帧动画**:了解如何使用ActionScript控制时间轴,实现基于脚本的动画效果。 6. **网络通信** - **加载外部资源**:利用URLLoader和XMLSocket类加载XML...

    源文件_ActionScript 3.0游戏编程

    学习如何创建和操作这些对象,以及使用Graphics类进行绘图,是构建游戏场景的基础。 4. **时间轴控制**:ActionScript 3.0提供了对时间轴的精确控制,可以暂停、播放、跳转到特定帧,这对于实现游戏动画和逻辑至关...

    FLASH ActionScript2.0 官方实例

    使用ActionScript,开发者可以利用Graphics类进行动态绘图,包括线条、形状、渐变等。这对于创建自定义的视觉效果非常有用。 9. **动作脚本与影片剪辑** MovieClip是ActionScript中常用的对象,可以包含多个帧和...

    ActionScript3.0语言和组件参考.chm

    7. **ActionScript与Flash Player API**:文档涵盖了ActionScript与Flash Player的内置功能,如绘图API(Graphics类)、音频和视频处理、本地存储(Local Shared Objects)以及网络通信(URLLoader和Socket)等。...

    ActionScript动画算法(中文版)

    文档会介绍如何用ActionScript模拟物体的平移、旋转、缩放以及弹性运动等,这包括使用缓动函数(easing functions)来创建平滑的过渡效果。 5. **动画框架**:对于复杂的动画序列,可以使用自定义动画框架来管理。...

    actionScript学习文档

    - **使用 ActionScript 创建 MovieClip 对象**:讲解如何使用 ActionScript 来创建 `MovieClip` 对象。 - **加载外部 SWF 文件**:指导如何加载外部的 SWF 文件。 以上内容涵盖了 ActionScript 学习文档的主要知识...

    《actionscript3.0游戏设计基础》随书赠送的代码

    3. **图形与绘图**:介绍如何使用Shape和Graphics类进行矢量绘图,创建游戏场景和角色图像。 4. **事件处理**:讲解事件监听器的使用,如何响应用户的输入,如点击、滚动和键盘按键。 5. **物理模拟**:可能包含...

    PROGRAMMING ACTIONSCRIPT 3.0

    - **Graphics类**:讲解了Graphics类的使用方法,以及如何利用该类来实现复杂的图形效果。 - **示例**:通过一个算法视觉生成器的例子,展示了如何利用绘图API来实现动态图形效果。 #### 第15章:滤镜应用 - **基本...

    ActionScript3.0中文版

    5. **图形与动画**:掌握绘图API,如使用Graphics类绘制形状,以及使用Tween类创建平滑的动画效果。 6. **ActionScript3.0类库**:熟悉Flash Player API,如NetConnection和SoundChannel用于网络通信和音频播放。 7....

    Actionscript.3.0.Animation

    4. **图形绘制**:ActionScript 3.0提供了强大的绘图API,包括Graphics类,允许开发者在舞台上动态绘制形状、线条、路径和渐变。这为创建复杂的图形动画提供了可能。 5. **事件处理**:AS3.0的事件驱动模型使得代码...

    Yahoo 开发中心ActionScript3.0类源代码

    5. **图形和动画**:ActionScript3.0提供了强大的图形绘制和动画功能,如使用Graphics类进行绘图,Tween类实现平滑动画。通过查看源代码,开发者可以学习如何创建复杂的视觉效果。 6. **框架和库的使用**:Yahoo的...

    ActionScript 画太极图案

    5. 再次使用`beginFill()`填充颜色,用`drawCircle()`方法在S形曲线两侧画出两个小圆。 6. 最后,将`Sprite`添加到舞台(stage)上,让太极图案可见。 在实际编码过程中,可能还需要考虑一些细节,如线条的宽度、...

    ActionScript3.0 编程

    7. **图形与绘图API**:了解Graphics类,学习如何动态绘制线条、形状、填充等,以及使用位图和滤镜。 8. **网络编程**:ActionScript 3.0支持XML、JSON等数据格式,可以进行HTTP请求和Socket通信,这对于创建与...

Global site tag (gtag.js) - Google Analytics