본문 바로가기

Cocos2d

Cocos2d Android : 9장. cocos2d ConvertToNodeSpace

반응형
//이전에 포스팅 하였던 ConvertToNodeSpace 예제입니다
//스프라이트 클래스에서 이벤트를 처리하는 방식입니다
//병뚜껑을 터치하면 병뚜껑이 날라 가는 간단한 예제입니다;
//bottle.png , cap0.png , cap1.png , cap2.png  넣어주셔야 합니다^^



ConvertToNodeSpaceTest.java
///////////////////////////////////////////////////////////////////////////////////////////////////////
package test.ConvertToNodeSpaceTest;

import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.types.CGPoint;

import android.view.MotionEvent;

public class ConvertToNodeSpaceTest extends CCLayer{
Bottle bottle;
public ConvertToNodeSpaceTest(){
this.setIsTouchEnabled(true);
setBackGround();
}

private void setBackGround() {
bottle = new Bottle("bottle.png",240f,400f);
this.addChild(bottle,0);
}
public static CCScene scene() {
CCScene scene = CCScene.node();
CCLayer layer = new ConvertToNodeSpaceTest();
scene.addChild(layer);
return scene;
}
@Override
public boolean ccTouchesBegan(MotionEvent event) {
CGPoint startLocation = CCDirector.sharedDirector().convertToGL(CGPoint.make(event.getX(), event.getY()));
bottle.beganTouch(startLocation.x,startLocation.y);
return super.ccTouchesBegan(event);
}

}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////


Bottle.java
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
package test. ConvertToNodeSpaceTest ;

import java.util.ArrayList;
import java.util.Random;

import org.cocos2d.actions.instant.CCCallFunc;
import org.cocos2d.actions.interval.CCAnimate;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCScaleBy;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.nodes.CCAnimation;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.nodes.CCSpriteFrame;
import org.cocos2d.nodes.CCTextureCache;
import org.cocos2d.opengl.CCTexture2D;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGRect;

public class Bottle extends CCSprite{
CCSprite cap ;
public Bottle(String str, float x, float y){
super(str);
this.setPosition(x,y);
addCap();
}

private void addCap() {
cap = CCSprite.sprite("cap0.png");
cap.setPosition(57f,247f);
this.addChild(cap,3);
}

public void beganTouch(float x, float y) {
CGPoint spriteNode = this.convertToNodeSpace(x, y);//현재 스프라이트를 기준으로 새로운 좌표를 생성한다
if( cap.getBoundingBox().contains(spriteNode.x, spriteNode.y)){
CCSequence ac = CCSequence.actions(actionsUp(), actionsDown(), CCCallFunc.action(this, "removeCap"));//위로가는 액션, 아래로 가는 액션, 뚜껑제거
cap.runAction(ac);
}
}
public CCSpawn actionsUp() {
CCMoveBy mv = CCMoveBy.action(0.3f, CGPoint.ccp((new Random()).nextInt(50)-25,150f));
CCSpawn acUp = CCSpawn.actions(mv, CCAnimate.action(capAni() , false));
return acUp;
}
public CCSpawn actionsDown(){
CCMoveBy mv1 =  CCMoveBy.action(0.6f, CGPoint.ccp((new Random()).nextInt(50)-25, -550f));
CCScaleBy sc = CCScaleBy.action(0.6f, 1.9f);
CCSpawn acDown = CCSpawn.actions(mv1, sc, CCAnimate.action(capAni() , false));
return acDown;
}
private CCAnimation capAni() {
CCTexture2D t2d = CCTextureCache.sharedTextureCache().addImage("cap0.png");
CCTexture2D t2d1 = CCTextureCache.sharedTextureCache().addImage("cap1.png");
CCTexture2D t2d2 = CCTextureCache.sharedTextureCache().addImage("cap2.png");
CCSpriteFrame frame1 = CCSpriteFrame.frame(t2d,CGRect.make(0, 0, 90, 80), CGPoint.ccp(0, 0));
CCSpriteFrame frame2 = CCSpriteFrame.frame(t2d1,CGRect.make(0, 0, 90, 80), CGPoint.ccp(0, 0));
CCSpriteFrame frame3 = CCSpriteFrame.frame(t2d2,CGRect.make(0, 0, 90, 80), CGPoint.ccp(0, 0));

ArrayList<CCSpriteFrame> animFrames = new ArrayList<CCSpriteFrame>();
animFrames.add(frame1);
animFrames.add(frame2);
animFrames.add(frame3);

CCAnimation animation = CCAnimation.animation("run", 0.1f, animFrames); 
return animation;
}
public void removeCap(){
this.removeChild(cap, true);
}


 /////////////////////////////////////////////////////////////////////////////////////////////////////// 
반응형