canvas本身就是一个Graphics,可以直接进行绘图
在actionscript里面,每个Sprite都有一个Graphics,Shape我先不考虑了,它更容易实现些,
在Html5中,绘图都是绘在同一个canvas上面的,所以我们现在需要考虑两个问题,
1,如何把每个Sprite里的Graphics在不同的时刻,画在同一个地方
2,因为我们现在在不停的刷新页面,所以如果我们用Graphics绘图,那么它也需要不断的刷新
那我现在依然先假设,每一个Sprite储存的Graphics,只保存一些绘图的命令,而这些绘图命令绘图的时候,全都绘在canvas上
那么按照假设,我需要一个保存这些绘图命令的数组或者类
我现在建一个LGraphics类,这个类里面应该包含绘图指令,和show方法
- function LGraphics(){
- var self = this;
- self.type = "LGraphics";
- self.color = "#000000";
- self.i = 0;
- self.alpha = 1;
- self.setList = new Array();
- self.showList = new Array();
- }
- LGraphics.prototype = {
- show:function (){
- var self = this;
- if(self.setList.length == 0)return;
-
- }
- }
我在绘图的时候,把绘图指令全部添加到setList里面,然后调用show方法,进行绘图另外还有一个showList,用来保存绘图的区域,作用一会就知道了下面来解决指令如何储存的问题给LGraphics添加方法
- drawLine:function (thickness,lineColor,pointArray){
- var self = this;
- self.setList.push(function(){
- LGlobal.canvas.beginPath();
- LGlobal.canvas.moveTo(pointArray[0],pointArray[1]);
- LGlobal.canvas.lineTo(pointArray[2],pointArray[3]);
- LGlobal.canvas.lineWidth = thickness;
- LGlobal.canvas.strokeStyle = lineColor;
- LGlobal.canvas.closePath();
- LGlobal.canvas.stroke();
- });
- },
- drawRect:function (thickness,lineColor,pointArray,isfill,color){
- var self = this;
- self.setList.push(function(){
- LGlobal.canvas.beginPath();
- LGlobal.canvas.rect(pointArray[0],pointArray[1],pointArray[2],pointArray[3]);
- if(isfill){
- LGlobal.canvas.fillStyle = color;
- LGlobal.canvas.fill();
- }
- LGlobal.canvas.lineWidth = thickness;
- LGlobal.canvas.strokeStyle = lineColor;
- LGlobal.canvas.stroke();
- });
- self.showList.push({type:"rect",value:pointArray});
- },
- drawArc:function(thickness,lineColor,pointArray,isfill,color){
- var self = this;
- self.setList.push(function(){
- LGlobal.canvas.beginPath();
- LGlobal.canvas.arc(pointArray[0],pointArray[1],pointArray[2],pointArray[3],pointArray[4],pointArray[5]);
- if(isfill){
- LGlobal.canvas.fillStyle = color;
- LGlobal.canvas.fill();
- }
- LGlobal.canvas.lineWidth = thickness;
- LGlobal.canvas.strokeStyle = lineColor;
- LGlobal.canvas.stroke();
- });
- self.showList.push({type:"arc",value:pointArray});
- }
三个方法分别是画一条线,一个矩形,一个圆因为我储存的指令是function所以,我绘图的时候,可以直接调用方法所以,将show方法稍作修改
- show:function (){
- var self = this;
- if(self.setList.length == 0)return;
- var key;
- for(key in self.setList){
- self.setList[key]();
- }
- }
这样绘图类就完成了,完整类一会儿请看源代码接着,在LSprite的构造器里面加上self.graphics = new LGraphics();就可以随时进行绘图了代码如下
- backLayer = new LSprite();
- addChild(backLayer);
-
- backLayer.graphics.drawRect(1,"black",[20, 20, 150, 20],true,"#cccccc");
-
- backLayer.graphics.drawArc(2,"black",[100, 100, 50, 0,2*Math.PI,false],true,"#FF0000");
-
- backLayer.graphics.drawLine(2,"#FF0000",[200, 20, 100, 50]);
其实,还缺点东西,因为鼠标点击LSprite判断的时候,我只判断了LSprite里保存的bitmap等,如果LSprite里面绘了图,点击的时候,也应该响应鼠标事件的,所以需要判断点击的位置是否在绘制的区域其实,也简单,给LGraphics添加一个ismouseon方法,来判断是否被点击就可以了
- ismouseon:function(event,cood){
- var self = this;
- var key;
- for(key in self.showList){
- if(self.showList[key].type == "rect"){
- if(event.offsetX >= self.showList[key].value[0] + cood.x && event.offsetX <= self.showList[key].value[0] + cood.x + self.showList[key].value[2] &&
- event.offsetY >= self.showList[key].value[1] + cood.y && event.offsetY <= self.showList[key].value[1] + cood.y + self.showList[key].value[3]){
- return true;
- }
- }else if(self.showList[key].type == "arc"){
- var xl = self.showList[key].value[0] + cood.x - event.offsetX;
- var yl = self.showList[key].value[1] + cood.y - event.offsetY;
- return xl*xl+yl*yl <= self.showList[key].value[2]*self.showList[key].value[2];
- }
- }
-
- return false;
- }
showList里面保存着绘图的区域大小,现在派上用场了
- init(80,"mylegend",800,480,main);
-
-
- var backLayer;
- function main(){
- legendLoadOver();
-
- backLayer = new LSprite();
- addChild(backLayer);
-
-
- backLayer.graphics.drawRect(1,"black",[20, 20, 150, 20],true,"#cccccc");
-
- backLayer.graphics.drawArc(2,"black",[100, 100, 50, 0,2*Math.PI,false],true,"#FF0000");
-
- backLayer.graphics.drawLine(2,"#FF0000",[200, 20, 100, 50]);
-
- backLayer.addEventListener(LMouseEvent.MOUSE_DOWN, onmousedown);
- }
-
-
- function onmousedown(event){
- alert("isclick");
- }
看一下成果吧,看不到效果的请下载支持html5的浏览器http://fsanguo.comoj.com/html5/jstoas04/index.html点击上面的矩形和圆,看看鼠标事件准不准确
分享到:
相关推荐
第章:如何使用ActionScript示例 示例类型 在FlashProfessional中运行ActionScript示例 在FlashBuilder中运行ActionScript示例 在移动设备上运行ActionScript示例 第章:本地数据库中的SQL支持 支持的SQL语法 数据类型...
6. **图形与动画**:ActionScript提供了强大的图形绘制和动画制作功能,如使用Graphics类进行矢量绘图,以及时间轴控制和帧动画。 7. **音频和视频处理**:学习如何在Flash中播放、控制和操作音频和视频资源。 8. ...
在IT领域,ActionScript是一种基于ECMAScript的脚本语言,主要用于Adobe Flash Professional、Flash Player以及Adobe AIR等...对于初学者来说,这是一个很好的练习,有助于掌握ActionScript的基本语法和绘图API的使用。
- **绘图API**:Graphics 类的使用。 - **动画制作**:Tween 类、TimeLine 类等。 7. **网络通信**: - **XMLHttpRequest**:发送HTTP请求、接收响应数据。 - **Socket编程**:TCP/IP 和 UDP 协议的支持。 - *...
5. **图形与绘图API**:介绍如何使用Graphics类进行动态绘图,创建复杂的形状和路径,以及填充和描边。 6. **显示对象**:涵盖DisplayObject类和其子类,如MovieClip、Sprite,以及它们的属性和方法,用于创建和...
手册会介绍如何使用Shape、BitmapData和Graphics类进行绘图,以及如何利用Tween类和Timeline动画来创建复杂的动态效果。 此外,手册还将覆盖网络编程,包括加载和发送数据(如使用URLLoader和XMLSocket类),以及...
5. **图形绘制**:使用Graphics API创建动态图形和矢量艺术。 6. **组件使用**:了解如何集成和自定义Flash组件,如按钮、文本框等。 7. **网络通信**:学习XML、JSON等数据格式的解析,以及与服务器的Socket通信。 ...
- **绘图API**:掌握Graphics类,进行动态绘图和填充。 - **帧动画**:了解如何使用ActionScript控制时间轴,实现基于脚本的动画效果。 6. **网络通信** - **加载外部资源**:利用URLLoader和XMLSocket类加载XML...
学习如何创建和操作这些对象,以及使用Graphics类进行绘图,是构建游戏场景的基础。 4. **时间轴控制**:ActionScript 3.0提供了对时间轴的精确控制,可以暂停、播放、跳转到特定帧,这对于实现游戏动画和逻辑至关...
使用ActionScript,开发者可以利用Graphics类进行动态绘图,包括线条、形状、渐变等。这对于创建自定义的视觉效果非常有用。 9. **动作脚本与影片剪辑** MovieClip是ActionScript中常用的对象,可以包含多个帧和...
7. **ActionScript与Flash Player API**:文档涵盖了ActionScript与Flash Player的内置功能,如绘图API(Graphics类)、音频和视频处理、本地存储(Local Shared Objects)以及网络通信(URLLoader和Socket)等。...
文档会介绍如何用ActionScript模拟物体的平移、旋转、缩放以及弹性运动等,这包括使用缓动函数(easing functions)来创建平滑的过渡效果。 5. **动画框架**:对于复杂的动画序列,可以使用自定义动画框架来管理。...
- **使用 ActionScript 创建 MovieClip 对象**:讲解如何使用 ActionScript 来创建 `MovieClip` 对象。 - **加载外部 SWF 文件**:指导如何加载外部的 SWF 文件。 以上内容涵盖了 ActionScript 学习文档的主要知识...
3. **图形与绘图**:介绍如何使用Shape和Graphics类进行矢量绘图,创建游戏场景和角色图像。 4. **事件处理**:讲解事件监听器的使用,如何响应用户的输入,如点击、滚动和键盘按键。 5. **物理模拟**:可能包含...
- **Graphics类**:讲解了Graphics类的使用方法,以及如何利用该类来实现复杂的图形效果。 - **示例**:通过一个算法视觉生成器的例子,展示了如何利用绘图API来实现动态图形效果。 #### 第15章:滤镜应用 - **基本...
5. **图形与动画**:掌握绘图API,如使用Graphics类绘制形状,以及使用Tween类创建平滑的动画效果。 6. **ActionScript3.0类库**:熟悉Flash Player API,如NetConnection和SoundChannel用于网络通信和音频播放。 7....
4. **图形绘制**:ActionScript 3.0提供了强大的绘图API,包括Graphics类,允许开发者在舞台上动态绘制形状、线条、路径和渐变。这为创建复杂的图形动画提供了可能。 5. **事件处理**:AS3.0的事件驱动模型使得代码...
5. **图形和动画**:ActionScript3.0提供了强大的图形绘制和动画功能,如使用Graphics类进行绘图,Tween类实现平滑动画。通过查看源代码,开发者可以学习如何创建复杂的视觉效果。 6. **框架和库的使用**:Yahoo的...
5. 再次使用`beginFill()`填充颜色,用`drawCircle()`方法在S形曲线两侧画出两个小圆。 6. 最后,将`Sprite`添加到舞台(stage)上,让太极图案可见。 在实际编码过程中,可能还需要考虑一些细节,如线条的宽度、...
7. **图形与绘图API**:了解Graphics类,学习如何动态绘制线条、形状、填充等,以及使用位图和滤镜。 8. **网络编程**:ActionScript 3.0支持XML、JSON等数据格式,可以进行HTTP请求和Socket通信,这对于创建与...