今天收到了收到来自 TexturePacker & PhysicsEditor 的免费 license 了。在申请免费 license 后的第二天就收到了,太激动了!
既然人家都免费发 license 了,按照人家回复的邮件期望,我们也有义务为人家做些推广。好东西当然要大家共享了!
开发游戏的人一般都很喜欢对 sprite 进行打包,而且在游戏中很可能还会使用到box2d 形状生成工具,不过免费的都不太好用,但是好的东西又都是要收费的。今天就给大家介绍一个福利,可以得到免费的收费工具。
软件下载地址:
http://www.codeandweb.com/
大家可以根据需要下载 TexturePacker 或 PhysicsEditor。
免费 license 申请地址:
http://www.codeandweb.com/request-free-license
若通过申请,你会收到类似下面的邮件(这是我收到的邮件内容):
Here's your license key for TexturePacker
TP-xxxx-xxxx-xxxx-xxxx
The license key for PhysicsEditor is attached as file.
Have fun!
Nice blog! I would be happy to get a (short) blog post in return.
In case you do a tutorial post about my tools I can link back to your blog from the tutorials section on my page. That might give you some more visitors on your page!
Kind regards
Kerstin on behalf of Andreas
鍦ㄧ綉涓婄湅鍒板緢澶氫汉瀵逛簬CountDownLatch鍜孋yclicBarrier鐨勫尯鍒畝鍗曠悊瑙d负CountDownLatch鏄竴娆℃€х殑锛岃€?CyclicBarrier鍦ㄨ皟鐢╮eset涔嬪悗杩樺彲浠ョ户缁娇鐢ㄣ€傞偅濡傛灉鍙槸杩欎箞绠€鍗曠殑璇濓紝鎴戣寰桟yclicBarrier绠€鍗曞懡鍚嶄负ResetableCountDownLatch濂戒簡锛屾樉鐒朵笉鏄殑銆?br> 鎴戠殑鐞嗚В鏄紝瑕佷粠浠栦滑鐨勮璁$洰鐨勫幓鐪嬭繖涓や釜绫汇€俲avadoc閲岄潰鐨勬弿杩版槸杩欐牱鐨勩€?/p>
聽
CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
聽
鍙兘鏄垜鐨勮嫳璇笉澶熷ソ鍚э紝 鎴戞劅瑙変粠杩欎釜javadoc閲岄潰瑕佸噯纭悊瑙d粬浠殑宸紓杩樻槸涓嶅鏄撶殑銆?br> 鎴戠殑鐞嗚В鏄?/p>
聽
CountDownLatch :聽涓€涓嚎绋?/strong>(鎴栬€呭涓?锛?绛夊緟鍙﹀N涓嚎绋?/strong>瀹屾垚鏌愪釜浜嬫儏涔嬪悗鎵嶈兘鎵ц銆?聽 CyclicBarrier 聽 聽 聽 聽:聽N涓嚎绋?/strong>鐩镐簰绛夊緟锛屼换浣曚竴涓嚎绋嬪畬鎴愪箣鍓嶏紝鎵€鏈夌殑绾跨▼閮藉繀椤荤瓑寰呫€?br> 杩欐牱搴旇灏辨竻妤氫竴鐐逛簡锛屽浜嶤ountDownLatch鏉ヨ锛岄噸鐐规槸閭d釜鈥滀竴涓嚎绋嬧€?/strong>, 鏄畠鍦ㄧ瓑寰咃紝 鑰屽彟澶栭偅N鐨勭嚎绋嬪湪鎶?strong>鈥滄煇涓簨鎯呪€?/strong>鍋氬畬涔嬪悗鍙互缁х画绛夊緟锛屽彲浠ョ粓姝€傝€屽浜嶤yclicBarrier鏉ヨ锛岄噸鐐规槸閭?strong>N涓嚎绋?/strong>锛屼粬浠箣闂翠换浣曚竴涓病鏈夊畬鎴愶紝鎵€鏈夌殑绾跨▼閮藉繀椤荤瓑寰呫€?/p>
聽
聽
CountDownLatch 鏄鏁板櫒, 绾跨▼瀹屾垚涓€涓氨璁颁竴涓? 灏卞儚 鎶ユ暟涓€鏍? 鍙笉杩囨槸閫掑噺鐨?
聽
鑰孋yclicBarrier鏇村儚涓€涓按闂? 绾跨▼鎵ц灏辨兂姘存祦, 鍦ㄦ按闂稿閮戒細鍫典綇, 绛夊埌姘存弧(绾跨▼鍒伴綈)浜? 鎵嶅紑濮嬫硠娴?
聽
聽
聽
CyclicBarrier聽
鍋囪鏈夊彧鏈夌殑涓€涓満鏅細姣忎釜绾跨▼浠h〃涓€涓窇姝ヨ繍鍔ㄥ憳锛屽綋杩愬姩鍛橀兘鍑嗗濂藉悗锛屾墠涓€璧峰嚭鍙戯紝鍙鏈変竴涓汉娌℃湁鍑嗗濂斤紝澶у閮界瓑寰?
聽
import java.io.IOException; import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class Runner implements Runnable { private CyclicBarrier barrier; private String name; public Runner(CyclicBarrier barrier, String name) { super(); this.barrier = barrier; this.name = name; } @Override public void run() { try { Thread.sleep(1000 * (new Random()).nextInt(8)); System.out.println(name + " 鍑嗗OK."); barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(name + " Go!!"); } } public class Race { public static void main(String[] args) throws IOException, InterruptedException { CyclicBarrier barrier = new CyclicBarrier(3); ExecutorService executor = Executors.newFixedThreadPool(3); executor.submit(new Thread(new Runner(barrier, "zhangsan"))); executor.submit(new Thread(new Runner(barrier, "lisi"))); executor.submit(new Thread(new Runner(barrier, "wangwu"))); executor.shutdown(); } }
聽
鎬荤粨锛欳yclicBarrier灏辨槸涓€涓爡鏍忥紝绛夊緟鎵€鏈夌嚎绋嬪埌杈惧悗鍐嶆墽琛岀浉鍏崇殑鎿嶄綔銆俠arrier 鍦ㄩ噴鏀剧瓑寰呯嚎绋嬪悗鍙互閲嶇敤銆?
聽
聽
聽
CountDownLatch聽
聽
import java.util.concurrent.CountDownLatch; /** * 绀轰緥锛欳ountDownLatch鐨勪娇鐢ㄤ妇渚? * Mail: ken@iamcoding.com * @author janeky */ public class TestCountDownLatch { private static final int N = 10; public static void main(String[] args) throws InterruptedException { CountDownLatch doneSignal = new CountDownLatch(N); CountDownLatch startSignal = new CountDownLatch(1);//寮€濮嬫墽琛屼俊鍙? for (int i = 1; i <= N; i++) { new Thread(new Worker(i, doneSignal, startSignal)).start();//绾跨▼鍚姩浜? } System.out.println("begin------------"); startSignal.countDown();//寮€濮嬫墽琛屽暒 doneSignal.await();//绛夊緟鎵€鏈夌殑绾跨▼鎵ц瀹屾瘯 System.out.println("Ok"); } static class Worker implements Runnable { private final CountDownLatch doneSignal; private final CountDownLatch startSignal; private int beginIndex; Worker(int beginIndex, CountDownLatch doneSignal, CountDownLatch startSignal) { this.startSignal = startSignal; this.beginIndex = beginIndex; this.doneSignal = doneSignal; } public void run() { try { startSignal.await(); //绛夊緟寮€濮嬫墽琛屼俊鍙风殑鍙戝竷 beginIndex = (beginIndex - 1) * 10 + 1; for (int i = beginIndex; i <= beginIndex + 10; i++) { System.out.println(i); } } catch (InterruptedException e) { e.printStackTrace(); } finally { doneSignal.countDown(); } } } }
聽
聽
聽
鎬荤粨锛欳ounDownLatch瀵逛簬绠$悊涓€缁勭浉鍏崇嚎绋嬮潪甯告湁鐢ㄣ€備笂杩扮ず渚嬩唬鐮佷腑灏卞舰璞″湴鎻忚堪浜嗕袱绉嶄娇鐢ㄦ儏鍐点€傜涓€绉嶆槸璁$畻鍣ㄤ负1锛屼唬琛ㄤ簡涓ょ鐘舵€侊紝寮€ 鍏炽€傜浜岀鏄鏁板櫒涓篘锛屼唬琛ㄧ瓑寰匩涓搷浣滃畬鎴愩€備粖鍚庢垜浠湪缂栧啓澶氱嚎绋嬬▼搴忔椂锛屽彲浠ヤ娇鐢ㄨ繖涓瀯浠舵潵绠$悊涓€缁勭嫭绔嬬嚎绋嬬殑鎵ц銆?
聽
浣滆€?聽xumingming
缃戝潃:聽http://xumingming.sinaapp.com/215/countdownlatch-vs-cyclicbarrier/
介绍:
开发应用的时候第三方的库是不可缺少的,能提高开发的效率。 一些经常用到的库,在新的项目里用是,你又得手工的Add到项目里,用的到库多起来了,就不方便管理了。发现CocoaPods这个软件,可以帮你管理Xcode里的第三方的库,很方便。
那怎么用呢?先安装CocoaPods。1、CocoaPods是跑在Ruby的软件,安装可能需要几分钟,安装命名:
sudo gem install cocoapods
2、如果想为每个第三方库生成文档,那运行
brew install appledoc 这步是可选的。
安装完成后提示:
如果你的Ruby环境不够新的话,可能要更新一下:
gem update --system
现在pod安装好了,怎么使用呢? 搜索先试试搜索功能,你需要什么库,可以用pod来搜索,比如要用JSONKit这个库:
pod search是搜索命名,后面写上库名称就行了。
pod search JSONKit
搜索出来:
初始化好了, 在终端shell中cd 来到你要管理的项目,运行:pod install
运行完之后你会发现你的项目目录下是这样的:
多了*.xcworkspace pod等文件。这是pod生成的项目管理文件,打开LibDemo.xcworkspace 项目文件,在Xcode里看到是这样的目录结构:
添加一个库:vim Podfile 打开文件,把刚才搜索到的JSONkit添加进去。
platform :ios
pod 'JSONKit'
保存退出。
运行:pod update
这样是就把JSONKit 库下载并和本地项目关联起来了,这是Xcode提示你更新项目
点Revert。
这时你看项目pod部分,多了JSONKit库.好了,第三方库就这么神奇的加进来。
头文件路径那试试看使用JONSKit.h,在ViewController.m里引用下。找不到头文件,怎么办?还没设置头文件的目录,在项目的Target的里设置一下:
如下图所示,输入${SRCROOT} 后面选上recursive。
在引用头文件:
完美。
其他的第三方库。Podfile文件中添加后pod update下就ok。
比如我引用了上面这些库,Nimbus太大了,我只需要 Core,也可以这么写。
CocoaPods还有好多高级功能,可以根据需求来使用。
参考:https://github.com/CocoaPods/CocoaPods/wiki