逆袭的水晶吧 关注:28贴子:1,058
  • 10回复贴,共1

★关于ActionScript 3.0

只看楼主收藏回复

程序员喜欢但动画师恨之入骨的3.0


IP属地:北京1楼2014-01-08 00:04回复
    每个软件都会版本更新换代,但打开Adobe收购后的Flash时,真让人恨得咬牙切齿。
    以前一个简单的脚本就能搞定的东西,现在要用一大堆复杂的语句。而且,以前脚本写在任何实例上都行,我特别喜欢那种【自由自在】【代码无处不在】的感觉,现在统统要堆在帧上了。
    搞程序的是高兴了,但动画师、设计师还活不活了。以前,他们也能在主要活计之余,轻松地做两个脚本出来,丰富内容。现在,非得找个程序员来帮忙不可了,要不然就得一切从零开始,重新学上一年半载。
    AS2.0看看别人写的代码就能自己学会。AS3.0,对着一个简单的按钮脚本,看一下午都看不会。到现在,作为一个二手的程序员,我也渐渐理解了O-O-P的好处和严谨的好处了。不过我还是无法原谅让人难以上手的东西。学这个几乎是从0开始。


    IP属地:北京2楼2014-01-08 00:21
    回复
      经过了几天的学习(感谢Youtube上的Big Toe Interactive的教学视频),我对AS3的偏见消解了一半,也基本找回从前的感觉了!只要了解了一些基本的东西,很快就能够重新上手,以前的知识也可以重新派上用场。
      首先,代码不能像以前一样写在影片剪辑上,只能写在帧上了。但是,要想正经地开发游戏,代码应该写在单独的.as文件里。虽然一开始会觉得繁琐些,但它也会让思路更严谨清楚。
      写在帧上的代码会受到严重的功能限制。"生成物体"的addChild,在函数里调用无效!但把一模一样的程序写在.as文件里,就管用了!写在帧上我都不知道是不是有可能实现这个功能。编游戏没法用这个函数,这不是要人命吗。
      所以下面开始详细解说。要开始一个工程,
      第一件事就是建立一个单独的.as脚本文件。在新建菜单里,选择ActionScript 3.0 Class,需要输入一个"class"名作为标识。我觉得在这里把class译为"集"好一点。
      第二件事:把这个AS脚本和FLA文件连结起来。
      每个FLA文件,都有且只能有一个"档案之集(Document Class)",在“属性“栏里的”发布(PUBLISH)“区,有一个Class项,在那里填入集的名字。集名貌似是必须与AS文件名相同的。
      如果忽略了这一步,在AS脚本里写多少东西它也不会运行。
      注意1:在什么都没选中的时候,属性栏显示的就是整个FLA文档的属性。
      注意2:因为AS脚本是一个单独的文件了,所以由FLA生成的SWF,是在调用这个外部文件。这意味着什么呢?这意味着你每次测试之前都得按Ctrl+F5把AS脚本存一下盘,不然你刚才改动的部分不算数。
      第三件事:把集名设为Main,则刚建立的AS文件会有以下代码:
      package {
       public class Main {
        public function Main() {
        }
       }
      }
      为了让影片剪辑们不喝西北风,应该立即在public class Main后面加上"extends MovieClip". 打到一半会弹出菜单,直接选用的话,前面也会自动多出另一行代码,成为这样:
      package {
       import flash.display.MovieClip
       public class Main extends MovieClip{
        public function Main() {
        }
       }
      }
      下面详细解释每行的意思:
      package - 打包,某种封装方式,我也不知道,反正肯定会让程序更安全,或者更有序。
      import flash.display.MovieClip - 顾名思义,从Flash文档里进口影片剪辑. 虽然脚本和文档是连结的,它也是在调用外面的资源。
      需要什么就得进口什么,即使是很常用的函数库也一样!需要编键盘控制的程序的话,就要进口flash.events.KeyboardEvent这个《键盘函数书》。
      我想,是自带函数数量实在太多了,所以让用户自己说明白,要用到哪几本"书"。AS2里搞不好是自动为你加载所有可能的资源。看来,很多代码里觉得繁琐的东西,其实是为了性能的优化!
      public class Main - 我对Class的概念还不是特别熟悉,但是在这里,毫无疑问代表了被FLA所使用的"档案之集"
      public function Main() - 这表面上看当然是个"Main函数",但它是因为档案集起名为Main才叫Main的,我不太清楚函数这种用户自由发挥的东西,系统为什么自动给你生成一个同名的。可能是考虑到从AS2过渡过来的人的心情,怕你被前面那几行东西弄晕了,把函数怎么写都给忘了,提醒你一下。


      IP属地:北京6楼2014-06-04 01:29
      收起回复
        函数的访问权限:
        public access modifier allows every Class access
        internal access modifier allows Classes sharing this package access (默认)
        protected access modifier allows subclasses access
        private access modifier allows no external access


        IP属地:北京10楼2015-06-07 21:36
        回复
          3D方面的了 不过先贴在这里
          Please be careful with the image resolution when you make your own normal maps. Any resolution that is not a power of two will usually cost significantly more resources to process, thus take longer to render. This can be especially problematic in realtime applications like games.


          IP属地:北京11楼2015-06-10 08:02
          回复
            物理引擎目前的难题:
            ● 方块与平面的碰撞
            - - 想法:简化为 方块的4个顶点与1条直线的碰撞检测。
            - - ○ 一个点碰撞 → 在那点上,根据角度,给方块一个动量
            - - ○ 两个点碰撞 → 初始思路:切换为专门的「边与边碰撞系统」,内含摩擦力等
                    目前基本推翻这个思路,改为哪怕1个点也有摩擦力,2个点碰撞还是1个点碰撞似乎没有差别
            - ● 弹力
            想法:两个物体撞击时,不是全部的动量都进入“转移过程”,有一部分散失了(好像本来也是这样?) 散失越小的,弹性越大 不过这个想法应该不对。智商余额不足,需要接着想
            - ● 摩擦力
            想法:按照“每个点都有摩擦力”的新思路,当1个点和1个线碰撞时,按部就班地根据角度、分解力,生出一个摩擦力的动量。(?只有一个点/角碰到线的情况下,把摩擦因数降低一点;两个点都碰的时候,理解为面和面的摩擦,再用正常的摩擦因数?)


            IP属地:北京13楼2015-10-16 01:26
            回复
              【传说】linda) 16:17:48
              请教一下:
              for (i=1; i<46; i++)
              {
              var txt:TextField = new TextField ;
              txt.name = "txt" + i;
              txt.text = i;
              addChild(txt);
              }如何使用这里新建txt的text属性呢?
              【传说】linda() 16:18:13
              getChildByName("txt"+name1).text; 这样写会出错
              【话唠】全部都是空对象( 16:18:54
              name1是哪里定义的?
              【传说】linda( 16:19:22
              我截取了一段
              【话唠】全部都是空对象) 16:19:38
              as一下
              【活跃】梦回千年) 16:20:04
              你的name应该是txt1 ,txt2这样的吧
              【话唠】全部都是空对象) 16:20:05
              (getChildByName("txt" + name1) as TextField).text
              getChildByName返回值是DisplayObject,这个类没有text属性,编译就报错了
              这么直接贴Q群聊天记录有点粗糙 但我确实学到了东西,也懒得总结了


              IP属地:北京14楼2015-10-30 16:22
              收起回复
                ————AS3最新“劣化”实验————
                实验过程:
                试图写一个优化的随机数函数。置一装满随机数的大数组于全局,置一全局整数以读之。需要随机数时,读取大数组,变那整数。与系统自带Math.random();比赛
                实验结果:
                无论数组多大,整数是否周期性变回0,效率总都是Math.random();的一半左右。
                经验教训:
                · 不要再徒劳地试图“优化”Flash的自带函数,人家底层的效率比你不知高到哪里去了。
                · 写一个方便的、打印时间用的函数,还真是好用。多写这样的工具函数可以增加许多效率。


                IP属地:北京15楼2016-09-25 23:12
                回复