본문 바로가기

Cocos2d

Cocos2d Android : 6장 . plist를 이용한 애니매이션

//cocos2d 에서 여러이미지를 애드 시키면 메모리에도 문제가 있는것같고 용량도 커지고 비효율적인것 같습니다
//plist 파일을 이용하면 효율적으로 애니매이션을 구현할수 있습니다(plist 만드는 방법은 검색을^^;)
//plist 파일을 이용해서 100까지 숫자가 증가하는 간단한 애니매이션을 만들어 보았습니다.
//asset 폴드에 cnum.png  , cnum.plist 를 넣어주셔야 합니다(첨부했습니다)



ScoreSetting.java
===================================================================================================
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCNode;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.nodes.CCSpriteFrame;
import org.cocos2d.nodes.CCSpriteFrameCache;
import org.cocos2d.nodes.CCSpriteSheet;

public class ScoreSetting {
CCLayer baseLayer;
private final int scoreZvalue=11;
private final int scoreTag=48;
 
private CCSpriteFrameCache cache; 
CCSpriteFrame[] cNum = new CCSpriteFrame[10];
CCSprite[] uspScore = new CCSprite[10];
private int idxCount=0;
 
public ScoreSetting(String pListname, CCLayer bLayer) {
cache = CCSpriteFrameCache.sharedSpriteFrameCache();   
cache.addSpriteFrames(pListname +".plist");    
CCSpriteSheet.spriteSheet(pListname +".png");
this.baseLayer = bLayer;
setPlist();
}
public CCSpriteFrame getSpriteFrame(String name){     
return cache.getSpriteFrame(name);    
public void setPlist(){
for(int i = 0 ; i < 10 ; i++){
cNum[i]=  getSpriteFrame("00"+i+".png");
}
}
public void cal_PreScore(int calScore){//스코어 int 값을 얻어와서 이에 맞는 스프라이트 배열로 만들어서 저장해준다
int tot=1;
int mok;
int mod=calScore;
int calTot=calScore;
while(calTot>=10){ 
calTot=calTot/10;
tot=tot*10;
}
while(tot>=1){
mok = mod /tot;
uspScore[idxCount] = CCSprite.sprite(cNum[mok]);
mod = mod %tot;
tot=tot/10;
idxCount++;
}
}
public void addScore(float x,float y){//방향에 맞게 스코어를 게임 화면에 애드해 준다
for(int i=idxCount-1 ; i >= 0 ; i-- ){
baseLayer.addChild(uspScore[i],scoreZvalue,scoreTag);
uspScore[i].setPosition(x-(27*(idxCount-i-1)),y);
}
idxCount=0;
}
public void updateScore(int uScore){//점수가 올라갈때 점수를 제거한 후 업데이트 해준다
CCNode[] nodes = null;
nodes = (CCNode[]) baseLayer.getChildren().toArray(new CCNode[0]);
for (int i = 0; i < nodes.length; i++) {
int tag = nodes[i].getTag();
if(tag == scoreTag) {//스코어제거
baseLayer.removeChild(nodes[i], true);
}
}
 
idxCount=0;
cal_PreScore(uScore);
}
public CCSprite[] getSprite(){
return uspScore;
}
public int getIdxCnt(){
return idxCount;
}

}
=================================================================================================== 

ShowResultLayer.java
===================================================================================================
import org.cocos2d.layers.CCColorLayer;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.types.ccColor4B;

public class ShowResultLayer extends CCColorLayer {
ScoreSetting pScore;
private int startPercent = -1;

protected ShowResultLayer(ccColor4B color) {
super(color);
showResut();
// TODO Auto-generated constructor stub
}

private void showResut() {
pScore = new ScoreSetting("cnum", this);
pScore.cal_PreScore(0);
pScore.addTopScore(255f, 305f);
schedule("updatepercent", 0.02f);

}

public void updatepercent(float dt) {
startPercent++;
pScore.updateScore(startPercent);
pScore.addTopScore(255f, 305f);
if (startPercent == 100) {
unschedule("updatepercent");
}
pScore.addScore(255f, 305f);
}

public static CCScene scene() {
CCScene scene = CCScene.node();
CCLayer layer = new ShowResultLayer(ccColor4B.ccc4(255, 255, 255, 255));
scene.addChild(layer);
return scene;
}

}
===================================================================================================