scratch是一个开源的游戏制作平台,我们可以从GitHub上获取到他的代码,其中2.0是使用flash技术支持的,而3.0则是基于HTML5技术开发。
作为一名前端工程师,理所当然的选择3.0版本了,然而让人遗憾的是3.0还没有开发完成,所以还得等待一段时间。
那就先用2.0将就一下吧,scratch 2.0使用ActionScript开发,必须安装Java环境以及使用Dradle进行build。
这里重点说下环境
- Java
- Gradle
- 至于其他的Gradle会自动去下载编译需要的依赖
按照上面的环境要求,一切准备妥当,首先就是先build一个试试咯,不然万一不行呢?那不是白搞了。果然,根据文档
在项目下运行命令
./gradlew build -Ptarget=11.6
,首先是Gradle会下载一个名为
gradle-2.5-bin.zip
,以后下载一堆
apache flex sdk
相关的东西,最后还会下载两个
swc
文件,这些就是所有的依赖了。可以在
scratch.gradle
文件中看到
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'org.gradlefx', name: 'gradlefx', version: '1.2.0'
}
}
repositories {
ivy {
name 'Apache Flex'
artifactPattern 'http://archive.apache.org/dist/flex/[revision]/binaries/[module]-[revision]-bin.[ext]'
}
ivy {
name 'Player Globals'
artifactPattern 'http://fpdownload.macromedia.com/get/flashplayer/installers/archive/[module]/[module][revision].[ext]'
}
}复制代码
如果一切都顺利。。。
那么还是会出错。
我的环境是Windows,说说我遇到的问题,按时间顺序来吧
- 下载
flex-sdk
直接403 - 运行命令
./gradlew build -Ptarget=11.6
报错Cannot invoke method replace() on null object
- 解决上面的问题,重新执行命令,在执行
:compileFlex
任务时报XXXadvanced-telemetry
参数配置错误
下面介绍解决问题的过程
- http 403
首先尝试在浏览器打开下载链接,是可以下载的。所以问题出在运行环境了,好吧,第一想法就是先把域名给换成IP。换上果然成功,下载了68M左右的东西,仿佛看到了希望,接着还下载了一些其他的,仿佛离完成任务更接近了,然而跑着跑着不跑了,再跑时就完全乱了。那好吧,清除缓存再来(缓存文件在家目录下的.gladle/caches
)。就这样不断重复浪费了两个小时睡觉时间。第二天上班不知怎么想的,直接用网上下载的zip
包解压到了gladle sdks
目录.gradle\gradleFx\sdks\[9113ebe5e674b4f43da6410401f9d4743f61c286]
这一段乱七八糟的事flex-sdk
sha码,千万不要换掉,在build的时候gladle会检查是否有缓存zip包再来该文件夹下找(根据sha效验码)解压的文件。然后按照文档中介绍的下载那个两个swc
依赖文件放到对应目录,后来验证,依赖问题算是解决。
总结原因的话就是依赖在没下完整的情况下终端了程序的运行
Cannot invoke method replace() on null object
这个问题主要原因在于命令./gradlew build -Ptarget=11.6
,这里前面两个分别是项目下gradlew.gradle
,build.gradle
,Ptarget
是自定义的参数,11.6
是希望的版本,看gradlew.gradle
def target = hasProperty('target') ? target : '11.6' println "Target is: $target" def config = new ConfigSlurper(target).parse(file("${commonDir}/config.groovy").toURL()) ... playerVersion = config.get('playerVersion') ... dependencies { flexSDK group: 'org.apache', name: 'apache-flex-sdk', version: '4.15.0', ext: 'zip' external group: 'macromedia.com', name: 'playerglobal', version: playerVersion.replace('.', '_'), ext: 'swc' ... }复制代码
这里根据自定义的target属性来获取在配置文件中的配置信息。而配置文件
environments { '11.6' { output = 'Scratch' playerVersion = '11.6' additionalCompilerOptions = [ "-swf-version=19", "-define+=SCRATCH::allow3d,true", ] } '10.2' { output = 'ScratchFor10.2' playerVersion = '10.2' additionalCompilerOptions = [ "-swf-version=11", "-define+=SCRATCH::allow3d,false", ] } }复制代码
看起来没任何问题,但是当在
gradlew.gradle
输出target
是得到的却是11
即点后面的没有取到,所有playerVersion.replace('.', '_')
会出错。解决方法就是把11.6
使用引号包含起来或者不带参数build。advanced-telemetry
参数配置错误
这个解决方法很简单,因为身为前端程序员并不了解Java或者gradle这个东西,对于ActionScript更是没了解过,一开始完全蒙圈,看错误提示就是这参数不对,所以暴力解决,全局搜索advanced-telemetry
字样,果然在gradlew.gradle
中找到了,然后删除这个参数。
最后BUILD SUCCESSFUL