/*cocos 2d 已经成为了如今移动端游戏开发的强有力的工具,眼下主流游戏中多採用cocos 2d游戏引擎。
我也尝试了一下该引擎。我是用的是cocos2d-android,以后要移植到Cocos2d-x上。废话不多说,代码例如以下。*/
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlub29t/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >
package com.ilighti.flowerfairy; import com.tencent.stat.StatService; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import org.apache.http.util.EncodingUtils; import org.cocos2d.actions.CCScheduler; import org.cocos2d.actions.base.CCRepeatForever; import org.cocos2d.actions.instant.CCHide; import org.cocos2d.actions.instant.CCShow; import org.cocos2d.actions.interval.CCAnimate; import org.cocos2d.actions.interval.CCBlink; import org.cocos2d.actions.interval.CCIntervalAction; import org.cocos2d.actions.interval.CCScaleTo; import org.cocos2d.layers.CCLayer; import org.cocos2d.layers.CCMultiplexLayer; import org.cocos2d.layers.CCScene; import org.cocos2d.menus.CCMenu; import org.cocos2d.menus.CCMenuItem; import org.cocos2d.menus.CCMenuItemImage; import org.cocos2d.nodes.CCAnimation; import org.cocos2d.nodes.CCDirector; import org.cocos2d.nodes.CCLabel; import org.cocos2d.nodes.CCSprite; import org.cocos2d.nodes.CCSpriteFrame; import org.cocos2d.nodes.CCSpriteSheet; import org.cocos2d.nodes.CCTextureCache; import org.cocos2d.opengl.CCGLSurfaceView; import org.cocos2d.sound.SoundEngine; import org.cocos2d.types.CGPoint; import org.cocos2d.types.CGRect; import org.cocos2d.types.CGSize; import org.cocos2d.types.ccColor3B; //import com.badlogic.gdx.math.Vector2; //import com.badlogic.gdx.physics.box2d.Body; //import com.badlogic.gdx.physics.box2d.BodyDef; //import com.badlogic.gdx.physics.box2d.EdgeShape; //import com.badlogic.gdx.physics.box2d.World; import com.ilighti.flowerfairy.R.raw; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.qq.e.ads.AdRequest; import com.qq.e.ads.AdSize; import com.qq.e.ads.AdView; import com.ilighti.flowerfairy.Constants; /** * An example full-screen activity that shows and hides the system UI (i.e. * status bar and navigation/system bar) with user interaction. * * @see SystemUiHider */ public class FlowerMainActivity extends Activity { private AdView bannerAD; private LinearLayout bannerContainer; /** * CoCos2d surface view */ private CCGLSurfaceView surfaceView = null; private CCScene scene = null; public static FlowerMainActivity app; private CCMultiplexLayer mlayer = null; // private int[] levelSpirit = { 0, 500, 3000, 100000 }; // private int levelNum = 4; private String msg = new String("Level Failed. "); private static int idScene = 0; private LauncherMenuLayer launcherMenuLayer = null; private BirdFlyLayer birdFlyLayer = null; private FairyFlyLayer fairyFlyLayer = null; private GirlFlyLayer girlFlyLayer = null; private GameOverLayer gameOverLayer = null; private FinalLayer finalLayer = null; private GameState gameState = new GameState(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); StatService.trackCustomEvent(this, "onCreate", ""); app = this; requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); readState(); refineState(); surfaceView = new CCGLSurfaceView(this); // create surface view CCDirector director = CCDirector.sharedDirector(); // get director director.attachInView(surfaceView); // set application view director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft); setContentView(surfaceView); if (gameState.getStartUpNum() > Constants.freshUserThreshold && gameState.getStartUpToday() < Constants.frequentPlayerThreshold) { setupAds(); } director.setDisplayFPS(false); // set display fps or not director.setAnimationInterval(1 / 30.0); scene = CCScene.node(); // StartMenuLayer startMenuLayer = new StartMenuLayer(); // scene.addChild(startMenuLayer); // GirlFlyLayer GirlFlyLayer = new GirlFlyLayer(); // scene.addChild(GirlFlyLayer); launcherMenuLayer = new LauncherMenuLayer(); birdFlyLayer = new BirdFlyLayer(); fairyFlyLayer = new FairyFlyLayer(); girlFlyLayer = new GirlFlyLayer(); gameOverLayer = new GameOverLayer(); finalLayer = new FinalLayer(); mlayer = CCMultiplexLayer.node(launcherMenuLayer, birdFlyLayer, fairyFlyLayer, girlFlyLayer, gameOverLayer, finalLayer); scene.addChild(mlayer, 0); SoundEngine.sharedEngine().preloadSound(app, raw.ground); SoundEngine.sharedEngine().preloadEffect(this, raw.upgrade); SoundEngine.sharedEngine().preloadEffect(this, raw.eat); SoundEngine.sharedEngine().preloadEffect(this, raw.die); SoundEngine.sharedEngine().preloadEffect(this, raw.fly); director.runWithScene(scene); } private void setupAds() { this.bannerContainer = new LinearLayout(this); bannerContainer.setOrientation(LinearLayout.HORIZONTAL); addContentView(this.bannerContainer, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); FlowerMainActivity.this.showBannerAD(); } private void showBannerAD() { this.bannerAD = new AdView(this, AdSize.BANNER, Constants.APPId, Constants.BannerPosId); this.bannerContainer.removeAllViews(); this.bannerContainer.addView(bannerAD); bannerAD.fetchAd(new AdRequest()); } private void switchScene(int n) { mlayer.switchTo(n); idScene = n; } @Override public void onStart() { super.onStart(); } @Override public void onPause() { super.onPause(); SoundEngine.sharedEngine().pauseSound(); CCDirector.sharedDirector().onPause(); } @Override public void onResume() { super.onResume(); // this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // CCDirector.sharedDirector().runWithScene(scene); SoundEngine.sharedEngine().resumeSound(); CCDirector.sharedDirector().onResume(); } @Override public void onDestroy() { super.onDestroy(); CCDirector.sharedDirector().end(); // CCTextureCache.sharedTextureCache().removeAllTextures(); } public void gameOver(String msg) { SoundEngine.sharedEngine().playEffect(app, raw.die); this.msg = msg; app.switchScene(4); } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public void readState() { boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); // 推断sd卡是否存在 if (sdCardExist) { String fileName = Environment.getExternalStorageDirectory() .getPath() + Constants.stateFile; File file = new File(fileName); if (!file.exists()) { String dir = Constants.workDir; makeStorageDir(dir); writeSDFile(fileName, gameState.toString()); } else { gameState = GameState.parseFromString(readSDFile(fileName)); } } } public void refineState() { gameState.setStartUpNum(gameState.getStartUpNum() + 1); SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String date = sDateFormat.format(new java.util.Date()); if (gameState.getSaveDate().equals(date)) { gameState.setStartUpToday(gameState.getStartUpToday() + 1); if (gameState.getStartUpToday() > gameState.getMaxStartUpOneDay()) { gameState.setMaxStartUpOneDay(gameState.getStartUpToday()); } } else { gameState.setStartUpToday(0); gameState.setSaveDate(date); } saveState(); } public void saveState() { boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); // 推断sd卡是否存在 if (sdCardExist) { String fileName = Environment.getExternalStorageDirectory() .getPath() + Constants.stateFile; File file = new File(fileName); if (!file.exists()) { String dir = Constants.workDir; makeStorageDir(dir); writeSDFile(fileName, gameState.toString()); } else { writeSDFile(fileName, gameState.toString()); } } } public boolean makeStorageDir(String dirName) { boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); // 推断sd卡是否存在 if (sdCardExist) { File dir = Environment.getExternalStorageDirectory(); String path = dir.getPath() + "/" + dirName; File dstdir = new File(path); dstdir.mkdir(); return true; } return false; } // 读文件 public String readSDFile(String fileName) { String res = null; try { File file = new File(fileName); FileInputStream fis = new FileInputStream(file); int length = fis.available(); byte[] buffer = new byte[length]; fis.read(buffer); res = EncodingUtils.getString(buffer, "UTF-8"); fis.close(); } catch (IOException e) { e.printStackTrace(); } return res; } // 写文件 public void writeSDFile(String fileName, String write_str) { try { File file = new File(fileName); FileOutputStream fos = new FileOutputStream(file); byte[] bytes = write_str.getBytes(); fos.write(bytes); fos.close(); } catch (IOException e) { e.printStackTrace(); } } static class BirdFlyLayer extends CCLayer { private CCSprite[] bird_wave = new CCSprite[3]; private CCSprite bg = null; private int cur = 0; private int total = 4; private int[] ids = { 0, 1, 2, 1 }; private CGPoint curPos = null; private float speed = 0f; private float accel_speed = -10f; private float interval_time = 1 / 30.0f; private float fly_speed_delta = 35f; private int pixels_per_meter = 5; private boolean is_started = false; private CGSize winSize = null; private String[] birds_pics = { "bird_XXlarge.png", "wave1_XXlarge.png", "wave2_XXlarge.png" }; private String[] flower_pics = { "small_flower_a.png", "small_flower_b.png", "small_flower_c.png", "small_flower_d.png", "small_flower_e.png", "small_flower_f.png", "small_flower_g.png", "small_flower_h.png", "small_flower_i.png", "small_flower_j.png", "small_flower_k.png" }; private int[] flowerSpirit = { 20, 10, 20, 10, 50, 5, 30, 20, 15, 25, 5 }; private int flowerCatagory = 11; private FlowerProperty[] flowerProperties = null; private int spirit = 0; private int power = 100; private int miss = 0; private int spiritThreshold = Constants.levelSpirit[1]; private int missThreshold = 1; private int flyCost = 1; private CCLabel labelSpirit = null; private CCLabel labelPower = null; private String spiritStr = "Spirit"; private String powerStr = "Power"; private CGPoint spiritPos = CGPoint.ccp(10, 60); private CGPoint powerPos = CGPoint.ccp(10, 85); private float widthStep = 0f; // private int maxShow = 4; private CGPoint flowerSpeed = CGPoint.ccp(-100f, 0f); private float flower_interval = 1.5f; private Random rand = new Random(System.currentTimeMillis()); // private List<CCSprite> flowerBuf = new LinkedList<CCSprite>(); // private List<FlowerState> flowerState = new // LinkedList<FlowerState>(); // protected static final float PTM_RATIO = 32.0f; // protected final World bxWorld; private CGPoint exRay = CGPoint.ccp(45, 18); private float radius = 60f; // private CCBlink blink = CCBlink.action(0.2f, 5); public BirdFlyLayer() { this.setIsTouchEnabled(true); winSize = CCDirector.sharedDirector().winSize(); flowerSpeed = CGPoint.ccp(-252, 0f); labelPower = CCLabel.makeLabel(powerStr + ":" + power, "DroidSans", 32); this.addChild(labelPower, 1); labelPower.setAnchorPoint(0f, 0f); powerPos = CGPoint.ccp(winSize.width / 2f, 40); labelPower.setPosition(powerPos); labelPower.setColor(ccColor3B.ccBLACK); widthStep = labelPower.getContentSize().width + 20f; labelSpirit = CCLabel.makeLabel(spiritStr + ":" + spirit, "DroidSans", 32); this.addChild(labelSpirit, 1); labelSpirit.setAnchorPoint(0f, 0f); spiritPos = CGPoint.ccp(winSize.width / 2f + widthStep, 40); labelSpirit.setPosition(spiritPos); labelSpirit.setColor(ccColor3B.ccBLACK); CGPoint pnt = CGPoint.ccp(winSize.width / 4, winSize.height / 2); curPos = pnt; bird_wave[0] = CCSprite.sprite(birds_pics[0]); bird_wave[1] = CCSprite.sprite(birds_pics[1]); bird_wave[2] = CCSprite.sprite(birds_pics[2]); bird_wave[0].setPosition(pnt); bird_wave[1].setPosition(pnt); bird_wave[2].setPosition(pnt); bg = CCSprite.sprite("background.jpg"); bg.setAnchorPoint(0f, 0f); bg.setPosition(CGPoint.ccp(0f, 0f)); this.addChild(bg); this.addChild(bird_wave[0]); this.addChild(bird_wave[1]); this.addChild(bird_wave[2]); bird_wave[1].runAction(CCHide.action()); bird_wave[2].runAction(CCHide.action()); flowerProperties = new FlowerProperty[flowerCatagory]; for (int i = 0; i < flowerCatagory; i++) { flowerProperties[i] = new FlowerProperty(); flowerProperties[i].setImgName(flower_pics[i]); CCSprite sprite = CCSprite.sprite(flower_pics[i]); sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); flowerProperties[i].setFlowerSprite(sprite); flowerProperties[i].setFlowerState(new FlowerState(0)); flowerProperties[i].setSpirit(flowerSpirit[i]); flowerProperties[i].setRadius((int) radius); flowerProperties[i].setEatable(true); this.addChild(sprite); sprite.runAction(CCHide.action()); } } @Override public boolean ccTouchesBegan(MotionEvent event) { // TODO Auto-generated method stub SoundEngine.sharedEngine().playEffect(app, raw.fly); flyUp(); if (!is_started) { this.schedule("nextPosition", interval_time); this.schedule("updateFlower"); this.schedule("startFlower", flower_interval); is_started = true; } return super.ccTouchesBegan(event); } public void clean() { // stop schedule task this.unschedule("nextPosition"); this.unschedule("updateFlower"); this.unschedule("startFlower"); // reset start flag is_started = false; // reset the miss number miss = 0; // reset speed speed = 0; // reset the bird state CGPoint pnt = CGPoint.ccp(winSize.width / 4, winSize.height / 2); curPos = pnt; bird_wave[0].setPosition(curPos); bird_wave[1].setPosition(curPos); bird_wave[2].setPosition(curPos); bird_wave[0].runAction(CCShow.action()); bird_wave[1].runAction(CCHide.action()); bird_wave[2].runAction(CCHide.action()); // reset the flowers // Iterator<CCSprite> spriteIter = flowerBuf.iterator(); // Iterator<FlowerState> stateIter = flowerState.iterator(); // if(scaleSpriteId!=-1) { // flowerProperties[scaleSpriteId].getFlowerSprite().stopAction(scaleTo); // scaleSpriteId = -1; // } for (int i = 0; i < flowerCatagory; i++) { flowerProperties[i].getFlowerSprite() .runAction(CCHide.action()); flowerProperties[i].getFlowerState().state = 0; } // reset power and spirit power = 100; spirit = 0; labelPower.setString(powerStr + ":" + power); labelSpirit.setString(spiritStr + ":" + spirit); } @Override public boolean ccTouchesEnded(MotionEvent event) { // TODO Auto-generated method stub flyUp(); return super.ccTouchesEnded(event); } @Override public boolean ccTouchesMoved(MotionEvent event) { // TODO Auto-generated method stub return super.ccTouchesMoved(event); } @Override public void onEnter() { super.onEnter(); SoundEngine.sharedEngine().playSound(app, raw.ground, true); } @Override public void onExit() { super.onExit(); SoundEngine.sharedEngine().pauseSound(); } public void nextPosition(float delta) { CGPoint flyDeltaVec = CGPoint.ccp(0, speed * interval_time * pixels_per_meter); CGPoint dstPnt = CGPoint.ccpAdd(curPos, flyDeltaVec); curPos = dstPnt; bird_wave[0].setPosition(curPos); bird_wave[1].setPosition(curPos); bird_wave[2].setPosition(curPos); CCShow show = CCShow.action(); bird_wave[ids[cur]].runAction(show); speed += accel_speed; if (curPos.y <= 0 || curPos.y >= winSize.height) { clean(); if (curPos.y <= 0) { app.gameOver("You fell on the ground and died. "); } else { app.gameOver("You can not fly that high. "); } } } public void updateFlower(float delta) { for (int i = 0; i < flowerCatagory; i++) { FlowerState state = flowerProperties[i].getFlowerState(); CCSprite sprite = flowerProperties[i].getFlowerSprite(); if (state.equals(1)) { CGPoint pos = sprite.getPosition(); pos = CGPoint.ccpAdd(pos, CGPoint.ccpMult(flowerSpeed, delta)); if (pos.x <= 0) { // scaleSpriteId = i; // sprite.runAction(blink); // this.unschedule("nextPosition"); // this.unschedule("updateFlower"); // this.unschedule("startFlower"); // Timer mtimer = new Timer(); // long delay = 200; // mtimer.schedule(new TimerTask() { // @Override // public void run() { miss++; clean(); app.gameOver("You have wasted too much opportunities. "); // } // }, delay); break; } else if (birdGetFlower(pos, flowerProperties[i])) { state.state = 0; sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); sprite.runAction(CCHide.action()); birdEatFlower(flowerProperties[i]); } else { sprite.setPosition(pos); CCShow show = CCShow.action(); sprite.runAction(show); } } } } private void birdEatFlower(FlowerProperty flowerProperty) { // TODO Auto-generated method stub SoundEngine.sharedEngine().playEffect(app, raw.eat); power += flowerProperty.getSpirit(); if (power > 100) { spirit += power - 100; labelSpirit.setString(spiritStr + ":" + spirit); if (spirit > spiritThreshold) { upgrade(); } power = 100; } labelPower.setString(powerStr + ":" + power); } private void upgrade() { SoundEngine.sharedEngine().playEffect(app, raw.upgrade); clean(); app.gameState.setGrade(app.gameState.getGrade() + 1); app.saveState(); app.launcherMenuLayer.setGrade(app.gameState.getGrade()); app.launcherMenuLayer.refreshMenu(); app.switchScene(2); } private boolean birdGetFlower(CGPoint pos, FlowerProperty flowerProperty) { // TODO Auto-generated method stub if (CGPoint.ccpDistance(pos, curPos) < flowerProperty.getRadius()) { return true; } if (CGPoint.ccpDistance(pos, CGPoint.ccpAdd(curPos, exRay)) < flowerProperty .getRadius()) { return true; } return false; } public void startFlower(float delta) { int id = Math.abs(rand.nextInt()) % (flowerCatagory); int n = 0; while (!flowerProperties[id].getFlowerState().equals(0) && n++ < (flowerCatagory)) { id = (id + 1) % (flowerCatagory); } if (n < (flowerCatagory)) { CCSprite sprite = flowerProperties[id].getFlowerSprite(); sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 4 + Math.abs(rand.nextInt()) % (winSize.height / 2))); sprite.runAction(CCShow.action()); flowerProperties[id].setFlowerState(new FlowerState(1)); } } public void flyUp() { CCHide hide = CCHide.action(); CCShow show = CCShow.action(); bird_wave[ids[cur]].runAction(hide); cur = (++cur) % total; bird_wave[ids[cur]].runAction(show); speed += fly_speed_delta; if (speed < 0) { speed = 0; } power -= flyCost; labelPower.setString(powerStr + ":" + power); } } class FairyFlyLayer extends CCLayer { private CCSprite[] bird_wave = new CCSprite[2]; private CCSprite bg = null; private int cur = 0; private int total = 2; private int[] ids = { 0, 1 }; private CGPoint curPos = null; private float speed = 0f; private float accel_speed = -10f; private float interval_time = 1 / 30.0f; private float fly_speed_delta = 35f; private int pixels_per_meter = 5; private boolean is_started = false; CGSize winSize = null; private String[] birds_pics = { "small_fairyf.png", "small_fairyw.png" }; private String[] flower_pics = { "small_flower_a.png", "small_flower_b.png", "small_flower_c.png", "small_flower_d.png", "small_flower_e.png", "small_flower_f.png", "small_flower_g.png", "small_flower_h.png", "small_flower_i.png", "small_flower_j.png", "small_flower_k.png", "small_spirit_killer.png", "small_spirit_killer.png", "small_spirit_killer.png", "small_spirit_killer.png" }; private int[] flowerSpirit = { 20, 10, 20, 10, 50, 5, 30, 20, 15, 25, 5, -500, -500, -500, -500 }; private int flowerCatagory = 15; private int killerBeginId = 11; private FlowerProperty[] flowerProperties = null; private int spirit = Constants.levelSpirit[1]; private int spiritLowThreshold = Constants.levelSpirit[1]; private int spiritThreshold = Constants.levelSpirit[2]; private int power = 100; // private int miss = 0; // private int missThreshold = 3; // private int flyCost = 1; // private int[] poisonousSpirit = { 500, 500 }; CCLabel labelSpirit = null; CCLabel labelPower = null; String spiritStr = "Spirit"; String powerStr = "Power"; private CGPoint spiritPos = CGPoint.ccp(10, 60); private CGPoint powerPos = CGPoint.ccp(10, 85); private float widthStep = 0f; // private int totalFlower = 10; private CGPoint flowerSpeed = CGPoint.ccp(-100f, 0f); private float flower_interval = 1.0f; private Random rand = new Random(System.currentTimeMillis()); // private List<CCSprite> flowerBuf = new LinkedList<CCSprite>(); // private List<FlowerState> flowerState = new // LinkedList<FlowerState>(); // private CGPoint exRay = CGPoint.ccp(49, 25); private CGPoint[] ctrlPoints = { CGPoint.ccp(0f, 75f), CGPoint.ccp(37f, 55f), CGPoint.ccp(49, 15), CGPoint.ccp(0f, -75f) }; private CGPoint exRay = ctrlPoints[2]; private int numCtrlPoints = 4; private float radius = 60f; private float poisonRadiux = 80f; private int eatenFrameNum = 5; private int curFrame = 0; private String[] eatenPics = { "eatfairy_a.png", "eatfairy_b.png", "eatfairy_c.png", "eatfairy_c.png", "eatfairy_c.png"}; private CCSprite[] eatenFrames = new CCSprite[eatenFrameNum]; public FairyFlyLayer() { winSize = CCDirector.sharedDirector().winSize(); flowerSpeed = CGPoint.ccp(-winSize.width / 2, 0f); this.setIsTouchEnabled(true); labelPower = CCLabel.makeLabel(powerStr + ":" + power, "DroidSans", 32); this.addChild(labelPower, 1); labelPower.setAnchorPoint(0f, 0f); powerPos = CGPoint.ccp(winSize.width / 2f, 40); labelPower.setPosition(powerPos); labelPower.setColor(ccColor3B.ccBLACK); widthStep = labelPower.getContentSize().width + 20f; labelSpirit = CCLabel.makeLabel(spiritStr + ":" + spirit, "DroidSans", 32); this.addChild(labelSpirit, 1); labelSpirit.setAnchorPoint(0f, 0f); spiritPos = CGPoint.ccp(winSize.width / 2f + widthStep, 40); labelSpirit.setPosition(spiritPos); labelSpirit.setColor(ccColor3B.ccBLACK); CGPoint pnt = CGPoint.ccp(winSize.width / 4, winSize.height / 2); curPos = pnt; bird_wave[0] = CCSprite.sprite(birds_pics[0]); bird_wave[1] = CCSprite.sprite(birds_pics[1]); // bird_wave[2] = CCSprite.sprite(birds_pics[2]); bird_wave[0].setPosition(pnt); bird_wave[1].setPosition(pnt); // bird_wave[2].setPosition(pnt); bg = CCSprite.sprite("background.jpg"); bg.setAnchorPoint(0f, 0f); bg.setPosition(CGPoint.ccp(0f, 0f)); this.addChild(bg); this.addChild(bird_wave[0]); this.addChild(bird_wave[1]); // this.addChild(bird_wave[2]); bird_wave[1].runAction(CCHide.action()); // bird_wave[2].runAction(CCHide.action()); flowerProperties = new FlowerProperty[flowerCatagory]; for (int i = 0; i < flowerCatagory; i++) { flowerProperties[i] = new FlowerProperty(); flowerProperties[i].setImgName(flower_pics[i]); CCSprite sprite = CCSprite.sprite(flower_pics[i]); sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); flowerProperties[i].setFlowerSprite(sprite); flowerProperties[i].setFlowerState(new FlowerState(0)); flowerProperties[i].setSpirit(flowerSpirit[i]); flowerProperties[i].setRadius((int) radius); flowerProperties[i].setEatable(true); if (i >= killerBeginId) { flowerProperties[i].setEatable(false); flowerProperties[i].setRadius((int) poisonRadiux); } this.addChild(sprite); sprite.runAction(CCHide.action()); } for (int i = 0; i < eatenFrameNum; i++) { eatenFrames[i] = CCSprite.sprite(eatenPics[i]); this.addChild(eatenFrames[i]); eatenFrames[i].runAction(CCHide.action()); } } @Override public boolean ccTouchesBegan(MotionEvent event) { // TODO Auto-generated method stub SoundEngine.sharedEngine().playEffect(app, raw.fly); flyUp(); if (!is_started) { this.schedule("nextPosition", interval_time); this.schedule("updateFlower"); this.schedule("startFlower", flower_interval); is_started = true; } return super.ccTouchesBegan(event); } public void clean() { // stop schedule task this.unschedule("nextPosition"); this.unschedule("updateFlower"); this.unschedule("startFlower"); this.unschedule("eatFairyAnimation"); // reset start flag is_started = false; // reset the miss number // miss = 0; // reset speed speed = 0; // reset the bird state CGPoint pnt = CGPoint.ccp(winSize.width / 4, winSize.height / 2); curPos = pnt; bird_wave[0].setPosition(curPos); bird_wave[1].setPosition(curPos); // bird_wave[2].setPosition(curPos); bird_wave[0].runAction(CCShow.action()); bird_wave[1].runAction(CCHide.action()); // bird_wave[2].runAction(CCHide.action()); // reset the flowers for (int i = 0; i < flowerCatagory; i++) { flowerProperties[i].getFlowerState().state = 0; flowerProperties[i].getFlowerSprite() .runAction(CCHide.action()); } for (int i = 0; i < eatenFrameNum; i++) { eatenFrames[i].runAction(CCHide.action()); } curFrame = 0; // reset power and spirit power = 100; spirit = Constants.levelSpirit[1]; labelPower.setString(powerStr + ":" + power); labelSpirit.setString(spiritStr + ":" + spirit); } public void eatFairyAnimation(float delta) { if (curFrame < eatenFrameNum) { eatenFrames[curFrame].setPosition(curPos); eatenFrames[curFrame].runAction(CCShow.action()); if (curFrame > 0) { eatenFrames[curFrame - 1].runAction(CCHide.action()); } curFrame++; } else { clean(); app.gameOver("You are poisoned to death. "); } } @Override public boolean ccTouchesEnded(MotionEvent event) { // TODO Auto-generated method stub flyUp(); return super.ccTouchesEnded(event); } @Override public boolean ccTouchesMoved(MotionEvent event) { // TODO Auto-generated method stub return super.ccTouchesMoved(event); } @Override public void onEnter() { super.onEnter(); SoundEngine.sharedEngine().playSound(app, raw.ground, true); } @Override public void onExit() { super.onExit(); SoundEngine.sharedEngine().pauseSound(); } public void nextPosition(float delta) { CGPoint flyDeltaVec = CGPoint.ccp(0, speed * interval_time * pixels_per_meter); CGPoint dstPnt = CGPoint.ccpAdd(curPos, flyDeltaVec); curPos = dstPnt; bird_wave[0].setPosition(curPos); bird_wave[1].setPosition(curPos); // bird_wave[2].setPosition(curPos); CCShow show = CCShow.action(); bird_wave[ids[cur]].runAction(show); speed += accel_speed; if (curPos.y <= 0 || curPos.y >= winSize.height) { clean(); if (curPos.y <= 0) { app.gameOver("You fell on the ground and died. "); } else { app.gameOver("You are not F22 or J20. "); } } } public void updateFlower(float delta) { for (int i = 0; i < flowerCatagory; i++) { FlowerState state = flowerProperties[i].getFlowerState(); CCSprite sprite = flowerProperties[i].getFlowerSprite(); if (state.equals(1)) { CGPoint pos = sprite.getPosition(); pos = CGPoint.ccpAdd(pos, CGPoint.ccpMult(flowerSpeed, delta)); if (pos.x <= 0) { state.state = 0; sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); sprite.runAction(CCHide.action()); } else if (birdGetFlower(pos, flowerProperties[i])) { state.state = 0; sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); sprite.runAction(CCHide.action()); birdEatFlower(flowerProperties[i]); } else { sprite.setPosition(pos); CCShow show = CCShow.action(); sprite.runAction(show); } } } } private void birdEatFlower(FlowerProperty flowerProperty) { // TODO Auto-generated method stub SoundEngine.sharedEngine().playEffect(app, raw.eat); if (!flowerProperty.isEatable()) { //SoundEngine.sharedEngine().playEffect(app, raw.die); // spirit += flowerProperty.getSpirit(); this.unschedule("nextPosition"); this.unschedule("updateFlower"); this.unschedule("startFlower"); this.schedule("eatFairyAnimation", 0.1f); /* * Timer mtimer = new Timer(); long delay = 1000; * //this.schedule("cleanGameOver", delay); mtimer.schedule(new * TimerTask() { * * @Override public void run() { // TODO Auto-generated method * stub clean(); app.gameOver("You are poisoned to death. "); } * }, delay); */ } else { spirit += flowerProperty.getSpirit(); if (spirit >= spiritThreshold) { clean(); upgrade(); } } labelSpirit.setString(spiritStr + ":" + spirit); } private void upgrade() { SoundEngine.sharedEngine().playEffect(app, raw.upgrade); clean(); app.gameState.setGrade(app.gameState.getGrade() + 1); app.saveState(); app.launcherMenuLayer.setGrade(app.gameState.getGrade()); app.launcherMenuLayer.refreshMenu(); app.switchScene(3); } private boolean birdGetFlower(CGPoint pos, FlowerProperty flowerProperty) { // TODO Auto-generated method stub if (!flowerProperty.isEatable()) { if (CGPoint.ccpDistance(pos, curPos) < flowerProperty .getRadius()) { return true; } for (int i = 0; i < numCtrlPoints; i++) { if (CGPoint.ccpDistance(pos, CGPoint.ccpAdd(curPos, ctrlPoints[i])) < flowerProperty .getRadius()) { return true; } } } else { if (CGPoint.ccpDistance(pos, curPos) < flowerProperty .getRadius()) { return true; } if (CGPoint.ccpDistance(pos, CGPoint.ccpAdd(curPos, exRay)) < flowerProperty .getRadius()) { return true; } } return false; } public void startFlower(float delta) { int killerRate = 5; int base = 0; int isKiller = Math.abs(rand.nextInt()) % killerRate; if (isKiller > 0) { base = killerBeginId; } int id = Math.abs(rand.nextInt()) % (flowerCatagory - base) + base; int n = 0; while (!flowerProperties[id].getFlowerState().equals(0) && n++ < (flowerCatagory)) { id = (id + 1) % (flowerCatagory); } if (n < (flowerCatagory)) { CCSprite sprite = flowerProperties[id].getFlowerSprite(); sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 4 + Math.abs(rand.nextInt()) % (winSize.height / 2))); sprite.runAction(CCShow.action()); flowerProperties[id].setFlowerState(new FlowerState(1)); } } public void flyUp() { CCHide hide = CCHide.action(); CCShow show = CCShow.action(); bird_wave[ids[cur]].runAction(hide); cur = (++cur) % total; bird_wave[ids[cur]].runAction(show); speed += fly_speed_delta; if (speed < 0) { speed = 0; } } } class GirlFlyLayer extends CCLayer { private CCSprite[] bird_wave = new CCSprite[2]; private CCSprite bg = null; private int cur = 0; private int total = 2; private int[] ids = { 0, 1 }; private CGPoint curPos = null; private float speed = 0f; private float accel_speed = -10f; private float interval_time = 1 / 30.0f; private float fly_speed_delta = 35f; private int pixels_per_meter = 5; private boolean is_started = false; CGSize winSize = null; private String[] birds_pics = { "girlf.png", "girlw.png" }; private String[] flower_pics = { "little_flower_a.png", "little_flower_b.png", "little_flower_c.png", "little_flower_d.png" }; private String[] big_flower_pics = { "flower_a.png", "flower_b.png", "flower_c.png", "flower_d.png" }; private int spirit = Constants.levelSpirit[2]; private int spiritThreshold = Constants.levelSpirit[3]; private int power = 100; private int miss = 0; private int missThreshold = 1; // private int flyCost = 1; private int[] flowerSpirit = { 20, 10, 20, 10 }; // private int[] poisonousSpirit = { 100, 200 }; CCLabel labelSpirit = null; CCLabel labelPower = null; String spiritStr = "Spirit"; String powerStr = "Power"; private CGPoint spiritPos = CGPoint.ccp(10, 60); private CGPoint powerPos = CGPoint.ccp(10, 85); private float widthStep = 0f; private int flowerCatagory = 4; private int totalFlower = 16; private CGPoint flowerSpeed = CGPoint.ccp(-300f, 0f); private CGPoint maxFlowerSpeed = null; private float flower_interval = 1.5f; private Random rand = new Random(System.currentTimeMillis()); private List<CCSprite> flowerBuf = new LinkedList<CCSprite>(); private List<CCSprite> bigFlowerBuf = new LinkedList<CCSprite>(); private List<FlowerState> flowerState = new LinkedList<FlowerState>(); // protected static final float PTM_RATIO = 32.0f; // protected final World bxWorld; // private CGPoint exRay = CGPoint.ccp(49, 25); private CGPoint[] ctrlPoints = { CGPoint.ccp(0f, 100f), CGPoint.ccp(90f, 100f), CGPoint.ccp(90f, 0f), CGPoint.ccp(-90f, 0f) }; // private CGPoint exRay = ctrlPoints[2]; private int numCtrlPoints = 4; private float radiux = 75f; // private float poisonRadiux = 75f; public GirlFlyLayer() { winSize = CCDirector.sharedDirector().winSize(); flowerSpeed = CGPoint.ccp(-winSize.width / 2, 0f); maxFlowerSpeed = CGPoint.ccp(-winSize.width, 0f); labelPower = CCLabel.makeLabel(powerStr + ":" + power, "DroidSans", 32); this.addChild(labelPower, 1); labelPower.setAnchorPoint(0f, 0f); powerPos = CGPoint.ccp(winSize.width / 2f, 40); labelPower.setPosition(powerPos); labelPower.setColor(ccColor3B.ccBLACK); widthStep = labelPower.getContentSize().width + 20f; labelSpirit = CCLabel.makeLabel(spiritStr + ":" + spirit, "DroidSans", 32); this.addChild(labelSpirit, 1); labelSpirit.setAnchorPoint(0f, 0f); spiritPos = CGPoint.ccp(winSize.width / 2f + widthStep, 40); labelSpirit.setPosition(spiritPos); labelSpirit.setColor(ccColor3B.ccBLACK); // bird_wave[2].setPosition(pnt); bg = CCSprite.sprite("background.jpg"); bg.setAnchorPoint(0f, 0f); bg.setPosition(CGPoint.ccp(0f, 0f)); this.addChild(bg); for (int j = 0; j < totalFlower; j++) { int k = j % flowerCatagory; CCSprite sprite = CCSprite.sprite(flower_pics[k]); CCSprite bigSprite = CCSprite.sprite(big_flower_pics[k]); sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); bigSprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); flowerBuf.add(sprite); bigFlowerBuf.add(bigSprite); flowerState.add(new FlowerState(0)); this.addChild(sprite); this.addChild(bigSprite); sprite.runAction(CCHide.action()); bigSprite.runAction(CCHide.action()); } CGPoint pnt = CGPoint.ccp(winSize.width / 4, winSize.height / 2); curPos = pnt; bird_wave[0] = CCSprite.sprite(birds_pics[0]); bird_wave[1] = CCSprite.sprite(birds_pics[1]); // bird_wave[2] = CCSprite.sprite(birds_pics[2]); bird_wave[0].setPosition(pnt); bird_wave[1].setPosition(pnt); this.addChild(bird_wave[0]); this.addChild(bird_wave[1]); bird_wave[1].runAction(CCHide.action()); this.setIsTouchEnabled(true); } @Override public boolean ccTouchesBegan(MotionEvent event) { // TODO Auto-generated method stub SoundEngine.sharedEngine().playEffect(app, raw.fly); flyUp(); if (!is_started) { this.schedule("nextPosition", interval_time); this.schedule("updateFlower"); this.schedule("startFlower", flower_interval); is_started = true; } return super.ccTouchesBegan(event); } public void clean() { // stop schedule task this.unschedule("nextPosition"); this.unschedule("updateFlower"); this.unschedule("startFlower"); // reset start flag is_started = false; // reset the miss number miss = 0; // reset speed speed = 0; // reset the bird state CGPoint pnt = CGPoint.ccp(winSize.width / 4, winSize.height / 2); curPos = pnt; bird_wave[0].setPosition(curPos); bird_wave[1].setPosition(curPos); // bird_wave[2].setPosition(curPos); bird_wave[0].runAction(CCShow.action()); bird_wave[1].runAction(CCHide.action()); // bird_wave[2].runAction(CCHide.action()); // reset the flowers Iterator<CCSprite> spriteIter = flowerBuf.iterator(); Iterator<FlowerState> stateIter = flowerState.iterator(); Iterator<CCSprite> bigSpriteIter = bigFlowerBuf.iterator(); while (spriteIter.hasNext() && stateIter.hasNext() && bigSpriteIter.hasNext()) { FlowerState state = stateIter.next(); CCSprite sprite = spriteIter.next(); CCSprite bigSprite = bigSpriteIter.next(); state.state = 0; sprite.runAction(CCHide.action()); bigSprite.runAction(CCHide.action()); } // reset power and spirit power = 100; spirit = Constants.levelSpirit[2]; labelPower.setString(powerStr + ":" + power); labelSpirit.setString(spiritStr + ":" + spirit); } @Override public boolean ccTouchesEnded(MotionEvent event) { // TODO Auto-generated method stub flyUp(); return super.ccTouchesEnded(event); } @Override public boolean ccTouchesMoved(MotionEvent event) { // TODO Auto-generated method stub return super.ccTouchesMoved(event); } @Override public void onEnter() { super.onEnter(); SoundEngine.sharedEngine().playSound(app, raw.ground, true); } @Override public void onExit() { super.onExit(); SoundEngine.sharedEngine().pauseSound(); } public void nextPosition(float delta) { CGPoint flyDeltaVec = CGPoint.ccp(0, speed * interval_time * pixels_per_meter); CGPoint dstPnt = CGPoint.ccpAdd(curPos, flyDeltaVec); curPos = dstPnt; bird_wave[0].setPosition(curPos); bird_wave[1].setPosition(curPos); // bird_wave[2].setPosition(curPos); CCShow show = CCShow.action(); bird_wave[ids[cur]].runAction(show); speed += accel_speed; if (curPos.y <= 0 || curPos.y >= winSize.height) { clean(); if (curPos.y <= 0) { app.gameOver("You fell on the ground and died. "); } else { app.gameOver("You are not F22 or J20. "); } } } public void updateFlower(float delta) { Iterator<CCSprite> spriteIter = flowerBuf.iterator(); Iterator<CCSprite> bigSpriteIter = bigFlowerBuf.iterator(); Iterator<FlowerState> stateIter = flowerState.iterator(); int id = 0; while (spriteIter.hasNext() && stateIter.hasNext() && bigSpriteIter.hasNext()) { FlowerState state = stateIter.next(); CCSprite sprite = spriteIter.next(); CCSprite bigSprite = bigSpriteIter.next(); if (state.equals(1)) { CGPoint pos = sprite.getPosition(); pos = CGPoint.ccpAdd(pos, CGPoint.ccpMult(flowerSpeed, delta)); if (pos.x <= 0) { state.state = 0; sprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); sprite.runAction(CCHide.action()); miss++; if (miss >= missThreshold) { clean(); app.gameOver("You have wasted too much opportunities."); } } else if (birdGetFlower(pos, id)) { state.state = 2; // sprite.runAction(CCHide.action()); birdBloomFlower(sprite, bigSprite, id); } else { sprite.setPosition(pos); bigSprite.setPosition(pos); sprite.runAction(CCShow.action()); } } else if (state.equals(2)) { CGPoint pos = bigSprite.getPosition(); pos = CGPoint.ccpAdd(pos, CGPoint.ccpMult(flowerSpeed, delta)); if (pos.x <= 0) { state.state = 0; bigSprite.setPosition(CGPoint.ccp(winSize.width, winSize.height / 2)); bigSprite.runAction(CCHide.action()); } else { sprite.setPosition(pos); bigSprite.setPosition(pos); bigSprite.runAction(CCShow.action()); } } id++; } } private void birdBloomFlower(CCSprite sprite, CCSprite bigSprite, int id) { // TODO Auto-generated method stub SoundEngine.sharedEngine().playEffect(app, raw.eat); sprite.runAction(CCHide.action()); bigSprite.runAction(CCShow.action()); spirit += flowerSpirit[0]; updateSpeed(spirit); if (spirit >= spiritThreshold) { FinalScene(); } labelSpirit.setString(spiritStr + ":" + spirit); } private void updateSpeed(int sp) { // TODO Auto-generated method stub flowerSpeed.x = -(winSize.width / 2 + winSize.width * (sp - Constants.levelSpirit[2]) / (2 * Constants.levelSpirit[3] - Constants.levelSpirit[2])); } private void FinalScene() { SoundEngine.sharedEngine().playEffect(app, raw.upgrade); clean(); app.switchScene(5); } private boolean birdGetFlower(CGPoint pos, int id) { // TODO Auto-generated method stub if (CGPoint.ccpDistance(pos, curPos) < radiux) { return true; } for (int i = 0; i < numCtrlPoints; i++) { if (CGPoint.ccpDistance(pos, CGPoint.ccpAdd(curPos, ctrlPoints[i])) < radiux) { return true; } } return false; } public void startFlower(float delta) { int id = Math.abs(rand.nextInt()) % (totalFlower); int n = 0; while (!flowerState.get(id).equals(0) && n++ < (totalFlower)) { id = (id + 1) % (totalFlower); } if (n < (totalFlower)) { CCSprite sprite = flowerBuf.get(id); CCSprite bigSprite = bigFlowerBuf.get(id); CGPoint pos = CGPoint.ccp(winSize.width, winSize.height / 4 + Math.abs(rand.nextInt()) % (winSize.height / 2)); sprite.setPosition(pos); bigSprite.setPosition(pos); sprite.runAction(CCShow.action()); bigSprite.runAction(CCHide.action()); flowerState.set(id, new FlowerState(1)); } } public void flyUp() { CCHide hide = CCHide.action(); CCShow show = CCShow.action(); bird_wave[ids[cur]].runAction(hide); cur = (++cur) % total; bird_wave[ids[cur]].runAction(show); speed += fly_speed_delta; if (speed < 0) { speed = 0; } } } class FinalLayer extends CCLayer { private CCSprite bg = null; CGSize winSize = null; FinalLayer() { winSize = CCDirector.sharedDirector().winSize(); CGPoint pnt = CGPoint.ccp(winSize.width / 2, winSize.height / 2); bg = CCSprite.sprite("final.jpg"); bg.setPosition(pnt); this.addChild(bg); CCMenuItem itemEnd = CCMenuItemImage.item("end.png", "end.png", this, "callBackDoNothing"); CCMenuItem itemBack = CCMenuItemImage.item("back.png", "back_sel.png", this, "callBackGameOver"); CCMenu menu = CCMenu.menu(itemEnd, itemBack); menu.alignItemsVertically(); this.addChild(menu); } public void callBackDoNothing(Object sender) { } public void callBackGameOver(Object sender) { app.switchScene(0); } } public class LauncherMenuLayer extends CCLayer { private CCSprite bg = null; private CGSize winSize = null; private int grade = app.gameState.getGrade(); CCMenu selMenu = null; public LauncherMenuLayer() { winSize = CCDirector.sharedDirector().winSize(); CGPoint pnt = CGPoint.ccp(winSize.width / 2, winSize.height / 2); bg = CCSprite.sprite("menubg.jpg"); bg.setPosition(pnt); this.addChild(bg); CCMenuItem itemBird = CCMenuItemImage.item("menu_bird.png", "menu_bird_sel.png", this, "callBackBird"); CCMenuItem itemFairy = null; CCMenuItem itemGirl = null; if (grade >= 1) { itemFairy = CCMenuItemImage.item("menu_fairy.png", "menu_fairy_sel.png", this, "callBackFairy"); } else { itemFairy = CCMenuItemImage.item("menu_fairy_gray.png", "menu_fairy_gray.png", this, "doNothing()"); } if (grade >= 2) { itemGirl = CCMenuItemImage.item("menu_girl.png", "menu_girl_sel.png", this, "callBackGirl"); } else { itemGirl = CCMenuItemImage.item("menu_girl_gray.png", "menu_girl_gray.png", this, "doNothing"); } selMenu = CCMenu.menu(itemBird, itemFairy, itemGirl); selMenu.alignItemsHorizontally(20f); this.addChild(selMenu); CCMenuItem itemQuit = CCMenuItemImage.item("quit_mini.png", "quit_mini_sel.png", this, "callBackQuit"); CCMenu menu = CCMenu.menu(itemQuit); menu.setPosition(CGPoint.ccp( winSize.width - itemQuit.getBoundingBox().size.width, itemQuit.getBoundingBox().size.height)); menu.alignItemsVertically(); this.addChild(menu); } public void callBackBird(Object sender) { SoundEngine.sharedEngine().playEffect(app, raw.upgrade); app.switchScene(1); } public void callBackFairy(Object sender) { SoundEngine.sharedEngine().playEffect(app, raw.upgrade); app.switchScene(2); } public void callBackGirl(Object sender) { SoundEngine.sharedEngine().playEffect(app, raw.upgrade); app.switchScene(3); } public void doNothing(Object sender) { } public void callBackQuit(Object sender) { SoundEngine.sharedEngine().playEffect(app, raw.die); super.onExit(); CCDirector.sharedDirector().end(); app.onDestroy(); System.exit(0); } public void setGrade(int grade) { this.grade = grade; } public int getGrade() { return this.grade; } public void refreshMenu() { this.removeChild(selMenu, true); CCMenuItem itemBird = CCMenuItemImage.item("menu_bird.png", "menu_bird_sel.png", this, "callBackBird"); CCMenuItem itemFairy = null; CCMenuItem itemGirl = null; if (grade >= 1) { itemFairy = CCMenuItemImage.item("menu_fairy.png", "menu_fairy_sel.png", this, "callBackFairy"); } else { itemFairy = CCMenuItemImage.item("menu_fairy_gray.png", "menu_fairy_gray.png", this, "doNothing()"); } if (grade >= 2) { itemGirl = CCMenuItemImage.item("menu_girl.png", "menu_girl_sel.png", this, "callBackGirl"); } else { itemGirl = CCMenuItemImage.item("menu_girl_gray.png", "menu_girl_gray.png", this, "doNothing"); } selMenu = CCMenu.menu(itemBird, itemFairy, itemGirl); selMenu.alignItemsHorizontally(20f); this.addChild(selMenu); } } }
时间: 2024-10-20 17:40:05