DragonBones插件创建并控制多个动作的骨骼动画

打开文件DragonBones_Tutorial_Mult
【菜科解读】
接下来你将了解到运用DragonBones创建包含多个动作的骨骼动画,并在程序中通过键盘交互控制动作。
打开文件DragonBones_Tutorial_MultiBehavior.fla,双击库里的动画元件Dragon,你可以看到此动画中有四个动作:stand,walk,jump和fail。
每个动作的起始帧上添加了对应的帧标签,这也是DragonBones识别不同动作的标识。
打开骨骼动画编辑面板,你会看到在Behavior List里面会有多个动作,选择某个动作就可以为对应动作设置动画帧数、缓动,设置此动作的某个骨骼的细节参数等。
请留意Behavior编辑里的Blending Times选项。
这个选项是表明的其他动作切换到当前动作需要的过渡时间。
例如这里设置的跳跃动作的Blending Times为0.13,那么其他动作切换到跳跃需要0.13秒,DragonBones框架会自动为你添加其中的过渡帧,让各种动作之间切换变得自然。
当然,你可以在动画预览窗口中看到各种动画的切换效果。
Dragon Bones插件 v2.3 官方最新版:http://www.cr173.com/soft/68403.html
调整完毕各个动作的细节后,点击“Export”按钮导出骨骼动画数据。
打开DBStarlingMultiBehavior.as文件,代码如下。
此示例是在Starling框架中通过键盘控制骨骼动画运动。
package{import dragonBones.Armature;import dragonBones.animation.WorldClock;import dragonBones.factorys.StarlingFactory;import flash.ui.Keyboard;import starling.display.Sprite;import starling.events.EnterFrameEvent;import starling.events.KeyboardEvent;import starling.text.TextField;import flash.events.Event;public class DBStarlingMultiBehavior extends Sprite{[Embed(source = "../assets/Dragon2.png", mimeType = "application/octet-stream")]public static const ResourcesData:Class;private var factory:StarlingFactory;private var armature:Armature;private var armatureClip:Sprite;private var isLeft:Boolean;private var isRight:Boolean;private var isJumping:Boolean;private var moveDir:int=0;private var speedX:Number = 0;private var speedY:Number = 0;private var textField:TextFieldpublic function DBStarlingMultiBehavior(){factory = new StarlingFactory();factory.addEventListener(Event.COMPLETE, textureCompleteHandler);factory.parseData(new ResourcesData());}private function textureCompleteHandler(e:Event):void{armature = factory.buildArmature("Dragon");armatureClip = armature.display as Sprite;armatureClip.x = 400;armatureClip.y = 550;addChild(armatureClip);WorldClock.clock.add(armature);updateBehavior()addEventListener(EnterFrameEvent.ENTER_FRAME, onEnterFrameHandler);stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyEventHandler);stage.addEventListener(KeyboardEvent.KEY_UP, onKeyEventHandler);textField=new TextField(400,30,"A-move left,D-move right,W-jump","Verdana",16,0,true)textField.x=60;textField.y=2;addChild(textField);}private function onKeyEventHandler(e:KeyboardEvent):void{switch (e.keyCode){case Keyboard.A :case Keyboard.LEFT :isLeft=e.type == KeyboardEvent.KEY_DOWN;break;case Keyboard.D :case Keyboard.RIGHT :isRight=e.type == KeyboardEvent.KEY_DOWN;break;case Keyboard.W :case Keyboard.UP :jump();break;}var dir:int;if (isLeft && isRight) {dir=moveDir;return;}else if (isLeft){dir=-1;}else if (isRight){dir=1;}else{dir=0;}if(dir==moveDir){return;}else{moveDir=dir;}updateBehavior()}private function onEnterFrameHandler(_e:EnterFrameEvent):void{updateMove();WorldClock.clock.advanceTime(-1);}private function updateBehavior():void{if (isJumping){return;}if (moveDir == 0){speedX = 0;armature.animation.gotoAndPlay("stand");}else{speedX=6*moveDir;armatureClip.scaleX = -moveDir;armature.animation.gotoAndPlay("walk");}}private function updateMove():void{if (speedX != 0) {armatureClip.x += speedX;if (armatureClip.x 800) {armatureClip.x = 800;}}if (isJumping){if (speedY 0 ) {armature.animation.gotoAndPlay("fall");}speedY += 1;}if (speedY != 0) {armatureClip.y += speedY;if (armatureClip.y > 540) {armatureClip.y = 550;isJumping = false;speedY = 0;updateBehavior();}}}private function jump():void{if (isJumping) {return;}speedY = -25;isJumping = true;armature.animation.gotoAndPlay("jump");}}}通过上面的代码我们可以发现,我们只需要在程序中需要播放相关骨骼动画的时候调用函数armature.animation.gotoAndPlay()即可。
除了指定需要播放的动作名称,你还可以通过此函数来动态指定动作的总帧数、是否循环等。
对于每个动画,除了指定其播放之外,DragonBones框架提供了动画播放相关的各种事件。
动作切换事件:
armature.addEventListener(dragonbones.events.Event.MOVEMENT_CHANGE, aramtureEventHandler);动作开始事件:
armature.addEventListener(dragonbones.events.Event.START, aramtureEventHandler);动作结束事件
armature.addEventListener(dragonbones.events.Event.COMPLETE, aramtureEventHandler);动作循环完毕事件:
armature.addEventListener(dragonbones.events.Event.LOOP_COMPLETE, aramtureEventHandler);通过各种事件与动作的配合,你可以轻松创建具有复杂运动角色的游戏。
控制骨骼框架中的每根骨头
对于一个有趣的游戏,仅仅播放预先设置的骨骼动画或许不够,我们需要角色具有动态可控的各自动作。
令人高兴的是DragonBones提供了访问并控制骨骼框架里每根骨头的方法,让你的角色在游戏中随意运动。
此示例通过鼠标在场景中的移动来控制骨骼。
我们创建了一个跟随鼠标运动的小鸟,小龙人会与小鸟保持一定距离,同时小龙人的头和胳膊会跟随小鸟运动而做出不同姿势,非常有趣。
打开DBStarlingControlBone.as,代码如下。
package{import dragonBones.Armature;import dragonBones.Bone;import dragonBones.animation.WorldClock;import dragonBones.factorys.StarlingFactory;import flash.geom.Point;import flash.ui.Mouse;import starling.display.Image;import starling.display.Sprite;import starling.events.EnterFrameEvent;import starling.events.TouchEvent;import starling.textures.Texture;import flash.events.Event;public class DBStarlingControlBone extends Sprite{[Embed(source = "../assets/Dragon2.png", mimeType = "application/octet-stream")]public static const ResourcesData:Class;[Embed(source = "../assets/starling.png")]private static const starlingImg:Class;private var factory:StarlingFactory;private var armature:Armature;private var armatureClip:Sprite;private var mouseX:Number = 0;private var mouseY:Number = 0;private var moveDir:int=0;private var dist:Number;private var speedX:Number = 0;private var starlingBird:Image;private var _r:Number;private var _head:Bone;private var _armR:Bone;private var _armL:Bone;public function DBStarlingControlBone(){factory = new StarlingFactory();factory.addEventListener(Event.COMPLETE, textureCompleteHandler);factory.parseData(new ResourcesData());}private function textureCompleteHandler(e:Event):void{armature = factory.buildArmature("Dragon");armatureClip = armature.display as Sprite;armatureClip.x = 400;armatureClip.y = 550;addChild(armatureClip);WorldClock.clock.add(armature);updateBehavior(0)addEventListener(EnterFrameEvent.ENTER_FRAME, onEnterFrameHandler);stage.addEventListener(TouchEvent.TOUCH, onMouseMoveHandler);starlingBird=new Image(Texture.fromBitmap(new starlingImg()))addChild(starlingBird);Mouse.hide();//get the bones which you want to control_head = armature.getBone("head");_armR = armature.getBone("armUpperR");_armL = armature.getBone("armUpperL");}private function onEnterFrameHandler(_e:EnterFrameEvent):void{checkDist();updateMove();updateBones();WorldClock.clock.advanceTime(-1);}private function checkDist():void{dist = armatureClip.x-mouseX;if(dist190){updateBehavior(-1)}else{updateBehavior(0)}}private function onMouseMoveHandler(_e:TouchEvent):void{var _p:Point = _e.getTouch(stage).getLocation(stage);mouseX = _p.x;mouseY = _p.y;starlingBird.x=mouseX-73;starlingBird.y=mouseY-73;}private function updateBehavior(dir:int):void{if(moveDir==dir)return;moveDir=dir;if (moveDir == 0){speedX = 0;armature.animation.gotoAndPlay("stand");}else{speedX=6*moveDir;armature.animation.gotoAndPlay("walk");}}private function updateMove():void{if (speedX != 0) {armatureClip.x += speedX;if (armatureClip.x 800) {armatureClip.x = 800;}}}private function updateBones():void{//update the bones' pos or rotation_r = Math.PI + Math.atan2(mouseY - armatureClip.y+armatureClip.height/2, mouseX - armatureClip.x);if (_r > Math.PI){_r -= Math.PI * 2;}_head.node.rotation = _r*0.3_armR.node.rotation = _r *0.8;_armL.node.rotation = _r * 1.5;starlingBird.rotation=_r*0.2;}}}从上面代码我们可以看到,通过方法dragonBones.Armature.getBone(_name:String):Bone来获取某个骨骼。
骨骼中的node对象包含了此骨骼的位置坐标,旋转弧度,拉伸比例,倾斜数据等等。
我们根据游戏逻辑的需要对骨骼的这些参数赋数,即可实现动态控制此骨骼的效果。
在上面示例中,请留意updateBones()函数里,我们先获取到当前鼠标位置与骨骼框架中心点的夹角,然后根据这个角度,来改变小龙人的头部和胳膊的旋转弧度,从而实现了这个有趣的效果。
DragonBones,插件,创建,并,控制,多个,动作,的Ecplise编译Cygwin环境、使用CDT插件开发C/C++
编译环境采用的是Cygwin。
使用Ecplise4.2 + CDT8.1.2 +Cygwin2.774。
建议先阅读第6条的注意事项。
强烈介意:先安装配置cygwin再安装cdt插件一、具体安装步骤为了保证安装顺利,请按以下步骤来进行。
1、安装Cygwin下载地址:http://cygwin.com/setup.exe官网:http://cygwin.com/下载好后,点击setup.exe进行安装,出现如下图所示界面 点击“NEXT”后我们看到如下界面:我们看到有三种安装模式:Install from Internet,这种模式直接从Internet安装,适合网速较快的情况;Download Without Installing,这种模式只从网上下载Cygwin的组件包,但不安装;Install from Local Directory,这种模式与上面第二种模式对应,当你的Cygwin组件包已经下载到本地,则可以使用此模式从本地安装Cygwin。
从上述三种模式中选择适合你的安装模式,这里我们选择第一种安装模式,直接从网上安装,当然在下载的同时,Cygwin组件也保存到了本地,以便以后能够再次安装。
选中后,点击“下一步”。
这一步选择Cygwin的安装目录,以及一些参数的设置。
默认的安装位置是C:\cygwin\,你也可以选择自己的安装目录,然后选择“下一步”,这一步我们可以选择安装过程中从网上下载的Cygwin组件包的保存位置,选择完以后,点击“下一步”,这一步选择连接的方式,选择你的连接方式,然后点击下一步,会出现选择下载站点的对话框,如下图所示,此步选择第一个163提供的镜像网站就可以,国内下载速度挺快,如果有其他镜像,可以输入URL后,点击“Add”进行添加,然后再在列表中选中。
选择完成后,点击“下一步”,进过下载几个文件后显示如下界面下面就在这个界面中下载我们需要编译C/C++代码的Packages,我们只需要下载“Devel”分支下几个包就可以了,gcc,gcc-core,gcc-g++,gcc-mingw-core,gcc-mingw-g++,make ,gdb,binutils。
在上图的search框中输入gcc,程序会自动进行搜索,如下图,通过选择“Devel”分支下的包,找到安装我们需要的包,然后点击Skip来选择最新的安装包这是已经成功安装最新版本包后的图示,大家单击“Skip”来选择最新版本的安装。
同理,输入“make”后,选择“Devel”分支下的包,下载如图所示的包:输入“gdb”后,选择“Devel”分支下的包,下载如图所示的包:输入“binutils”后,选择“Devel”分支下的包,下载如图所示的包:选完以后,我们选择下一步,进入安装过程,如下图所示,安装的时间依据你选择的组件以及网络情况而定。
安装完成后,安装程序会提示是否在桌面上创建Cygwin图标等,点击完成退出安装程序。
2、配置Windows的环境变量熟悉Java开发环境的都应该知道怎么找到环境变量,实在不知道的去百度下吧。
将cygwin\bin目录加入到环境变量PATH中。
然后,打开cmd命令行窗口,分别试一下gcc , g++命令。
如果显示“访问被拒绝” (access denied), 进入cygwin安装目录\bin下检查g++.exe, gcc.exe是否只有1k大小,如果是,那么文件是符号链接,那么把文件重命名一下(备份)。
然后把g++-3.exe(或者g++-4.exe)拷贝一份,重命名为g++.exe。
把gcc-3.exe拷贝一份,重命名为gcc.exe。
3、下载Ecplise CDT插件下载地址:http://www.eclipse.org/cdt/downloads.php参考:Ecplise插件的安装的四种方法。
或者通过Ecplise自动升级功能进行安装,如下图所示:添加地址:http://download.eclipse.org/tools/cdt/releases/juno4、配置Ecplise的C/C++开发环境(1)设置Ecplise与Cygwin的路径映射按以下步骤打开Ecplise:Window -> Preferences->C/C++->Debug-> Common Source Lookup Path -> add -> new "Path Mapping".映射方法,如下图:eclipse中调试时,由于GDB使用的unix格式的路径,而eclipse使用的是windows路径,导致找不到匹配的代码, 把linux的路径映射windows的路径:比如 /cygwin/c 映射成 C:\ 。
(2)配置C/C++的"Makefile Project",选择“PE Windows Parser", 和”Cygwin PE Parser" 两项。
5、在Ecplise中创建工程编写C/C++代码(1)创建C/C++工程点击”Next“,显示如下图:点击”Next“,显示如下图:点击”Finish“完成创建。
当编写好代码后,可以对你的工程进行编译,点击“Project”选项下的"Builder Project"项目即可。
编译后的工程,如下图所示:此时是成功编译后“Consloe”控制台的显示画面。
点击上面选中的,然后点击鼠标右键,选择“Run”,即可运行程序。
此时控制台即可打印出文字了。
到此我们就完成了Ecplise + CDT + Cygwin开发环境的配置,以后你就可以享用其方便的功能了。
6、常见问题1、Eclipse下的CDT创建C++项目时候,不能自动生成includes文件夹有两种解决方法:(1)打开Window -> Preferences->C/C++->Environment,如下图所示,添加两个环境变量将C_INCLUDE_PATH 设为 /usr/include将CPLUS_INCLUDE_PATH 设为 /usr/include/c++如果在Cygwin的/usr/include/目录下没有c++这个目录,可以从\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++拷贝一个到目录下,或者直接添加这个目录都可以。
此步也可以解决代码中提示的显示信息”Unresolved inclusion:“问题,尽管不影响编译,只是无法定位头文件中的符号。
(2)在Windows里面,加入环境变量CPLUS_INCLUDE_PATH 和C_INCLUDE_PATH,并都设置成,安装的Cygwin的对应lib路径:D:\cygwin\lib然后再新建C/C++项目的时候,就可以自动生产Includes文件夹了。
2、用eclipse 建立编译C++工程出现错误提示 “symbol could not be resolved”问题原因:是debug下的source lookup path没有映射正确。
解决办法:window -> preferences -> C/C++ -> debug -> source lookup path > Path Mapping\cygdirve\c C:\用cygwin下的c盘来替代当前的C盘 来查找需要的库文件,如果你的Cygwin安装在C盘,则映射C盘,如果安装在D盘,则映射为\cygdirve\d D:\,其他盘同理。
3、用eclipse 建立编译C++Debug工程出现错误提示以下错误依然是上面映射的问题,打开Cygwin自带的“Cygwin Terminal”,然后输入以下命令“mount”如图所示:上面就是我们设置的映射,如果没有你的Ecplise的Workspace所在的盘的位置的映射,请按照上面的说明进行添加,即可调试成功。
例如,我的Workspace在D:盘下,则我想调试程序,必须映射到D盘的位置。
4、解决Eclipse的CDT编写的c/c++程序的运行结果不能输出到console的问题(1)设置“Debug Configurations"里的“Environment”选项,添加PATH,指定X:\cygwin\bin的路径。
如图所示(2)如果build不能通过(编译正常通过后会出现类似下面的输出)**** Build of configuration Debug for project Test ****make allmake: Nothing to be done for `all‘.**** Build Finished ****请按照上面步骤重新安装。
Ecplise,编译,Cygwin,环境,、,使用,CDT,
使用jquery和MySql创建一个ajax关键词数据搜索
点击搜索默认显示所有的结果输入A之后显示的搜索结果输入 p之后显示的搜索结果没有找到相关的搜索词页面演示-点击下面的搜索按钮搜索数据文件结构 主要用到几个文件 index.php首页 dbcon.php数据库连接文件 search.php搜索处理页面第一步创建一个ajax_search的数据库,紧接着创建一个ajax_search表CREATE TABLE `ajax_search` ( `id` int(11) NOT NULL auto_increment, `FirstName` varchar(50) NOT NULL, `LastName` varchar(50) NOT NULL, `Age` int(11) NOT NULL, `Hometown` varchar(50) NOT NULL, `Job` varchar(50) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;HTML :index.php--程序主页面DB Connect:dbcon.php--数据库连接文件 ?php //数据库连接函数 $link = mysql_connect(‘localhost‘, ‘root‘, ‘你的密码‘); mysql_select_db(‘ajax_demo‘,$link);//选择数据库连接?>搜索结果页面search.php代码如下 ?phpfunction checkValues($value) // 使用此函数对所有这些值都要检查防止 sql 注入和跨站点脚本 //除去字符串开头和末尾的空格或其他字符 $value = trim($value); // Stripslashes if (get_magic_quotes_gpc()) { //删除由 addslashes() 函数添加的反斜杠,该函数用于清理从数据库或 HTML 表单中取回的数据。
$value = stripslashes($value); //转换所有的 , 字符 $value = strtr($value,array_flip(get_html_translation_table(HTML_ENTITIES))); // 剥去 HTML的标签 $value = strip_tags($value); // 引用值 $value = mysql_real_escape_string($value); return $value;include("dbcon.php");//加载数据库连接文件$rec = checkValues($_REQUEST[‘val‘]);//获取table内容if($rec) $sql = "select * from ajax_search where FirstName like ‘%$rec%‘ or LastName like ‘%$rec%‘ or Age like ‘%$rec%‘ or Hometown like ‘%$rec%‘"; $sql = "select * from ajax_search";$rsd = mysql_query($sql);//查询这条语句$total = mysql_num_rows($rsd);//返回结果集中行的数目if($total==0){ echo ‘No Record Found !‘;}?>checkValues函数过滤字符串防止sql注入和跨站点脚本攻击,mysql_query($sql);用来查询语句,mysql_fetch_assoc()用来循环输出结果,怎么样是不是很简单,如果你的项目有需要,可以直接使用这个代码。
使用,jquery,和,MySql,创建,一个,ajax,关