[]关于使用Idea以及Linux下使用AS语言开发的一点经验

由于个人习惯和工作原因,我主要在linux下工作,主要ide为jetbrains系列,由于考虑到可能会有代码方面的需要所以选择的as语言开发。之前在windows虚拟机里把推荐的ide试了个遍,然而fd提示太弱而且没有自动导包,fb破解各种崩而且版本太老,后来是用了最新的eclipse+sdk,用了一周多还是不习惯,最后尝试半天还是在熟悉的平台和工具上跑起来了(idea旗舰版,自带as语言支持):
深度截图20170418135208.png

1.先说idea导入工程的问题
暂时不考虑平台差异,先用layaide生成标准工程,然后用idea导入,注意要选择直接导入代码:


深度截图20170418142812.png



(选其他的,不管是eclipse还是flashbuilder还是maven都会提示找不到模块)
 

深度截图20170418142828.png



这里设置一下源码路径,只给项目目录下的src设置就行了
 
导入之后肯定会是找不到lib而一堆错误:

深度截图20170418142920.png

 
此时就要进行一些设置了。
按 Ctrl + Alt + Shift + S打开工程设置面板,先去Modules设置一下mainClass为你的入口as类,然后设置Libraries,如下图:

深度截图20170418142941.png

然后定位到下载好的LayaAirAS引擎源码路径添加:

深度截图20170418145738.png

注意这里选择Raw ActionScript library,否则无效的。
 
最后去Problems哪里,随便给报错设置几个值(能fix的优先fix),也不是一定要全部解决掉,试一试就行了。
此时回到代码编辑,不报错能提示就行了。
 
2.然后是idea调用as编译工具的方法(其实和eclipse啥的大同小异)

深度截图20170418134802.png

如上图,找到设置里的Tools 》 Exteranl Tools,增加一个叫做layaJS的外部工具。
如果是windows用户,就直接在program那里选LayaAirAS引擎里的laya.js.exe,Parameters就设置成
$ProjectFileDir$"/.actionScriptProperties;iflash=false;outlaya=true"(估计可以,没验证),下面的工作路径填$ProjectFileDir$。你还可以给这个自定义工具设置快捷键,恕不细表。
如果只是想尝试idea的windows用户可以就此止步了,谢谢!
 
如果和我一样是Linux用户(虽然可能根本没有……),可以继续看我下面蛋疼的折腾之旅:
 
想在完全的linux环境下运行官方的laya.js.exe,想也不用想那只能是使用wine了(我现在是deepin2015,自带wine)。。然而我多次尝试执行 wine laya.js.exe "<path>/.actionScriptProperties;iflash=false;outlaya=true"命令后,即使弹出的编译器显示编译通过(当然要事先先编辑.actionScriptProperties文件把里面的路径改成linux下的文件路径),在bin目录下生成的网页打开就是黑屏,打开调试则是js报错,久久不知如何解决。。
后来偶然发现,实际上我在win下生成的laya.js和在linux下用wine生成的laya.js,两者文件大小乃至文件行数都是一样的,可是里面代码块的排列却有几处微妙的不同,从而导致的浏览器加载js解析失败。。我手工调整了linux下laya.js  里几处的位置,demo终于就跑起来了!!虽然现在还不知道具体原因,但是我知道只要照常用wine调用laya.js.exe去编译,然后再稍微修改一下 生成的js文件就能实现linux下的一键编译了。
于是,我又写了两个脚本,都放在工程目录下就好:
 
1> compile.sh(供idea使用,调用wine执行编译,并调用python脚本处理js文件,最后打开chrome浏览器)
#!/bin/bash
path=`pwd`
cmd="/.actionScriptProperties;iflash=false;outlaya=true"
index="/bin/h5/index.html"

#此处是LayaAirAS引擎工具所在的路径
cd /home/debuggerx/Documents/LayaAirAS

wine laya.js.exe ${path}${cmd}

cd $path

python TextFilePatchTools.py $path

google-chrome --allow-file-access-from-files --allow-file-access-frome-files --disable-web-security ${path}${index}




2> TextFilePatchTools.py (文本文件内容处理,最后几行是我尝试出来的针对目前问题的修改,也就是代码块位置移动):
#!/bin/python
# -*- coding:utf-8 -*-
# @Filename : TextFilePatchTools.py
# @Date : 2017-03-14 18:45
# @Author : DebuggerX

import sys
import shutil


def readcontentfromfile(filepath, backuporiginalfile=True):
editfile = open(filepath, "r")
content = editfile.read()
editfile.close()
if backuporiginalfile:
shutil.copy(filepath, filepath + ".bak")

return content


def savefilewithnewcontent(content, filepath):
editfile = open(filepath, "w")
editfile.write(content)
editfile.close()


def inserttextintofile(filepath, probe, add_content, tofront=False, backuporiginalfile=True,
pos=None):
"""
:param filepath: 接收要修改文档的路径
:param probe: 接收文档中修改位置的文字探针
:param add_content: 输入要增加的内容
:param tofront: 新增内容放到探针的前面还是后面(默认后面且换行)
:param backuporiginalfile:是否备份原始文件
:param pos: 直接指定插入文本的光标位置
:return: void
"""

content = readcontentfromfile(filepath, backuporiginalfile)

if pos != None and pos > 0:
content = content[:pos] + '\n' + add_content + '\n' + content[pos:]
savefilewithnewcontent(content, filepath)
return

pos = content.find(probe)
if pos != -1:
if tofront:
content = content[:pos] + add_content + '\n' + content[pos:]
else:
pos += len(probe)
content = content[:pos] + '\n' + add_content + content[pos:]

savefilewithnewcontent(content, filepath)


def deletetextfromfile(filepath, delcontent=None, startprobe=None, endprobe=None, isdelstart=True,
isdelend=True, backuporiginalfile=True):
"""
:param filepath: 接收要修改文档的路径
:param content: 输入要删除的内容(mode1)
:param startprobe: 输入要删除的内容的起始探针(mode2)
:param endprobe: 输入要删除的内容的结束探针(mode2)
:param isdelstart: 是否连同起始探针一起删除(默认删除)
:param isdelend: 是否连同结束探针一起删除(默认删除)
:param backuporiginalfile:是否备份原始文件
:return:删除内容后光标所处位置
"""

content = readcontentfromfile(filepath, backuporiginalfile)
if delcontent != None:
pos = content.find(delcontent)
if pos != -1:
content = content[:pos] + content[pos + len(delcontent):]
savefilewithnewcontent(content, filepath)
return pos
elif startprobe != None and endprobe != None:
startpos = content.find(startprobe)
endpos = content.find(endprobe)

if startpos != -1 and endpos != -1:
if not isdelstart:
startpos += len(startprobe)
if isdelend:
endpos += len(endprobe)
content = content[:startpos] + '\n' + content[endpos:]

savefilewithnewcontent(content, filepath)
return startpos


def replacetextwithfile(filepath, replacecontent, delcontent=None, startprobe=None, endprobe=None,
isdelstart=True,
isdelend=True, backuporiginalfile=True):
"""
:param filepath: 接收要修改文档的路径
:param replacecontent: 用于替换的新文本内容
:param delcontent:将替换掉的旧文本内容(mode1)
:param startprobe:将替换掉的旧文本内容的起始探针(mode2)
:param endprobe:将替换掉的旧文本内容的结束探针(mode2)
:param isdelstart:是否连同起始探针一起替换掉(默认删除)
:param isdelend:是否连同结束探针一起替换掉(默认删除)
:param backuporiginalfile:是否备份原始文件
:return:void
"""
content = readcontentfromfile(filepath, backuporiginalfile)
if delcontent != None:
pos = deletetextfromfile(filepath, delcontent, backuporiginalfile=False)

elif startprobe != None and endprobe != None:
pos = deletetextfromfile(filepath, None, startprobe, endprobe, isdelstart, isdelend, False)

if pos != -1:
inserttextintofile(filepath, None, replacecontent, backuporiginalfile=False, pos=pos)


def getcontextbyprobe(filepath,startprobe, endprobe,startoffset=0 , endoffset=0 , backuporiginalfile=True):
"""
:param filepath: 接收要修改文档的路径
:param startprobe: 获取文本内容的起始探针
:param endprobe: 获取文本内容的结束探针
:param startoffset: 获取文本内容的起始偏移量
:param endoffset: 获取文本内容的结束偏移量
:param backuporiginalfile: 是否备份原始文件
:return: context,查找到的文本内容
"""
content = readcontentfromfile(filepath, backuporiginalfile)
startpos = content.find(startprobe)
endpos = content.find(endprobe)
if startpos != -1 and endpos > startpos:
context = content[startpos+startoffset : endpos + len(endprobe)+endoffset]
return context




# deletetextfromfile(str(sys.argv[1]), None, str(sys.argv[2]), str(sys.argv[3]), False, False)
# replacetextwithfile(str(sys.argv[1]),str(sys.argv[2]),None,str(sys.argv[3]),str(sys.argv[4]),False,False)

if __name__ == '__main__':
saveBase = getcontextbyprobe(str(sys.argv[1])+"/bin/h5/laya.js","class laya.webgl.canvas.save.SaveBase","return SaveBase",startoffset=-2 ,endoffset=8,backuporiginalfile=False)

deletetextfromfile(str(sys.argv[1])+"/bin/h5/laya.js" ,saveBase,backuporiginalfile=False)

inserttextintofile(str(sys.argv[1])+"/bin/h5/laya.js" ,"//class laya.webgl.canvas.save.SaveTransform" ,saveBase,True,False)

Color = getcontextbyprobe(str(sys.argv[1])+"/bin/h5/laya.js","*<code>Color</code> 是一个颜色值处理类。","Color._COLODID=1;",startoffset=-7 ,endoffset=24,backuporiginalfile=False)

deletetextfromfile(str(sys.argv[1])+"/bin/h5/laya.js" ,Color,backuporiginalfile=False)

inserttextintofile(str(sys.argv[1])+"/bin/h5/laya.js" ,"//class laya.webgl.canvas.DrawStyle" ,Color,True,False)

 之后再参考这张配置图设置一下工具调用即可:

深度截图20170418134802.png

 
嗯,估计这一段也没人有需要了吧……姑且发出来记录一下。。不过如果编译工具的开发大大不嫌麻烦能找找原因处理一下,让wine跑laya.js.exe的时候不会再出现这诡异的问题的话,那就太感谢了~~
 
顺便分享一下我的工具链把:
Linux:建模用blender,素材Krita,动画龙骨(wine),ui用FairyGui(wine),unity(linux版,虽然还没怎么用到),ide不用说了~~
windows(Vmware):转换模型3dsmax , 等等
深度截图20170418142812.png
已邀请:

cuixueying

赞同来自:

厉害,谢谢分享!(*^__^*) ……

dandanqin

赞同来自:

请问一下我是windows,按照上面的windows步骤,还是不行啊,是哪儿的问题啊,,,抱歉,打扰了哈,实在不知道咋弄,,,,

要回复问题请先

商务合作
商务合作