植物大战僵尸(一)

 

CCSprite.sprite()加载进来的图片默认锚点是(0.5,0.5),即图片中间

CCTMXTiledMap.tiledMap()加载进来的地图默认锚点(0,0)

 

这段代码在

 SystemClock.sleep(2000);会报错,
SystemClock.sleep(5000)不会报错。
private void consumeTime() {
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... params) {
                SystemClock.sleep(5000);
                return null;
            }
            protected void onPostExecute(Void result) {
                setIsTouchEnabled(true);
                loading.removeSelf();
                WelcomeLayer.this.getChildByTag(TAG_START).setVisible(true);
            };
        }.execute();
    }

 错误log

11-22 18:36:44.818: W/System.err(19995): at org.zqt.cocos2d.layer.WelcomeLayer$1.onPostExecute(WelcomeLayer.java:42)
11-22 18:36:44.819: W/System.err(19995): at org.zqt.cocos2d.layer.WelcomeLayer$1.onPostExecute(WelcomeLayer.java:1)
11-22 18:36:44.819: W/System.err(19995): at android.os.AsyncTask.finish(AsyncTask.java:632)
11-22 18:36:44.819: W/System.err(19995): at android.os.AsyncTask.access$500(AsyncTask.java:177)
11-22 18:36:44.819: W/System.err(19995): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:648)
11-22 18:36:44.819: W/System.err(19995): at android.os.Handler.dispatchMessage(Handler.java:117)
11-22 18:36:44.819: W/System.err(19995): at android.os.Looper.loop(Looper.java:194)
11-22 18:36:44.819: W/System.err(19995): at android.app.ActivityThread.main(ActivityThread.java:6097)
11-22 18:36:44.819: W/System.err(19995): at java.lang.reflect.Method.invokeNative(Native Method)
11-22 18:36:44.820: W/System.err(19995): at java.lang.reflect.Method.invoke(Method.java:525)
11-22 18:36:44.820: W/System.err(19995): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:838)
11-22 18:36:44.820: W/System.err(19995): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)

MainActivity.java

public class MainActivity extends Activity {
    private CCDirector director;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CCGLSurfaceView surfaceView = new CCGLSurfaceView(this);
        director = CCDirector.sharedDirector();
        director.attachInView(surfaceView);
//        director.setDisplayFPS(true);
        director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft);
        director.setScreenSize(480, 320);
        CCScene scene = createScene();
        director.runWithScene(scene);
        setContentView(surfaceView);
        
    }
    private CCScene createScene() {
        CCScene scene = CCScene.node();
//        WelcomeLayer layer = new WelcomeLayer();
        FightLayer layer = new FightLayer();
        scene.addChild(layer);
        return scene;
    }
    
}

 

ShowZombie.java

public class ShowZombie extends CCSprite{
    private static ArrayList<CCSpriteFrame> shakeFrames;
    public ShowZombie() {
        super("image/zombies/zombies_1/shake/z_1_01.png");
        this.setAnchorPoint(0.5f,0);
        this.setScale(0.5f);
        shake();
    }
    public void shake(){
        CCAction repeatForeverAction = CommonUtil.getRepeatForeverAction(shakeFrames, 2, "image/zombies/zombies_1/shake/z_1_%02d.png", 0.2f);
        this.runAction(repeatForeverAction);
    }
}

 

ShowPlant.java

public class ShowPlant {
    private static HashMap<Integer,HashMap> data;
    private int id;
    private int sumNum = 25;
    private CCSprite defaultImg;
    private CCSprite bgImg;
    static{
        data = new HashMap<Integer, HashMap>();
        HashMap<String,String> map ;
        for(int i=1;i<=9;i++){
            map = new HashMap<String,String>();
            map.put("fileName", String.format("image/fight/chose/choose_default%02d.png", i));
            map.put("sunNum", String.valueOf(i*25));
            data.put(i, map);
        }
    }
    public ShowPlant(int id) {
        this.id = id;
        HashMap<String,String> item = data.get(id);
        defaultImg = CCSprite.sprite(item.get("fileName"));
        bgImg = CCSprite.sprite(item.get("fileName"));
        defaultImg.setAnchorPoint(0,0);
        bgImg.setAnchorPoint(0,0);
        bgImg.setOpacity(150);
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSumNum() {
        return sumNum;
    }
    public void setSumNum(int sumNum) {
        this.sumNum = sumNum;
    }
    public CCSprite getDefaultImg() {
        return defaultImg;
    }
    public void setDefaultImg(CCSprite defaultImg) {
        this.defaultImg = defaultImg;
    }
    public CCSprite getBgImg() {
        return bgImg;
    }
    public void setBgImg(CCSprite bgImg) {
        this.bgImg = bgImg;
    }
    
}

 

BaseElement.java

public abstract class BaseElement extends CCSprite{
    private DieListener dieListener;
    public BaseElement(String filePath) {
        super(filePath);
    }
    public void setDieListener(DieListener dieListener) {
        this.dieListener = dieListener;
    }
    public abstract void baseAction();
    public void destroy(){
        if(dieListener!=null){
            dieListener.onDie(this);
        }
        this.removeSelf();
    }
}

 

Bullet.java

public abstract class Bullet extends Plant{
    protected int attack = 10;
    protected int speed = 60;
    public Bullet(String filePath) {
        super(filePath);
    }
    public abstract void move();
    public int getAttack() {
        return attack;
    }
}

 

Product.java

public abstract class Product extends BaseElement{
    public Product(String filePath) {
        super(filePath);
        
    }
}

 

ProductPlant.java

public abstract class ProductPlant extends Plant{

    public ProductPlant(String filePath) {
        super(filePath);
    }
    public abstract void create();
}

Zombie

public abstract class Zombie extends BaseElement{
    protected CGPoint startPoint;
    protected CGPoint endPoint;
    protected int life = 50;
    protected int attack = 10;
    protected int speed = 10;
    
    public Zombie(String filePath) {
        super(filePath);
        setScale(0.5);
        setAnchorPoint(0.5f,0);
    }
    

    public abstract void move();
    
    public abstract void attack(BaseElement element);
    public abstract void attacked(int attack);

}

Plant.java

public abstract class Plant extends BaseElement{
    protected int life = 100;
    protected int row ;    // 行号     line
    protected int column;  // 列号      row
    public Plant(String filePath) {
        super(filePath);
        setScale(0.65);
        setAnchorPoint(0.5f,0);
    }
    public void attacked(int attack){
        life -= attack;
        if(life<0){
            destroy();
        }
    }
    public int getRow() {
        return row;
    }
    public void setRow(int row) {
        this.row = row;
    }
    public int getColumn() {
        return column;
    }
    public void setColumn(int column) {
        this.column = column;
    }
    public int getLife() {
        return life;
    }
    public void setLife(int life) {
        this.life = life;
    }
}

 

AttackPlant.java

public abstract class AttackPlant extends Plant implements DieListener{
    protected ArrayList<Bullet> bullets = new ArrayList<Bullet>();
    public AttackPlant(String filePath) {
        super(filePath);
    }
    public ArrayList<Bullet> getBullets() {
        return bullets;
    }
    public abstract void createBullet();
    @Override
    public void onDie(BaseElement element) {
        if(element instanceof Bullet){
            bullets.remove(element);
        }
    }
}

 

DefencePlant.java

public abstract class DefencePlant extends Plant {
    public DefencePlant(String filePath) {
        super(filePath);
        life = 200;
    }
}

 

 

baseLayer

public class BaseLayer extends CCLayer{
    protected CGSize winSize;
    public BaseLayer() {
        winSize = CCDirector.sharedDirector().getWinSize();
    }
}

welcomelayer

public class WelcomeLayer extends BaseLayer{
    private static final int TAG_START = 10;
    private static final String TAG = "WelcomeLayer";
    private CCSprite loading;
    private CCSprite start;
    public WelcomeLayer() {
        consumeTime();
        init();
    }

    public void consumeTime() {
        new AsyncTask<Void,Void,Void>(){
            @Override
            protected Void doInBackground(Void... params) {
                SystemClock.sleep(5000);      // 如果设置成2000,就会报空指针异常
                return null;
            }
            protected void onPostExecute(Void result) {
                setIsTouchEnabled(true);
                loading.removeSelf();
                WelcomeLayer.this.getChildByTag(TAG_START).setVisible(true);
                super.onPostExecute(result);
            };
        }.execute();
    }

    private void init() {
        CCSprite logo = CCSprite.sprite("image/popcap_logo.png");
        logo.setPosition(winSize.width/2,winSize.height/2);
        this.addChild(logo);
        CCSequence sequence = CCSequence.actions(CCDelayTime.action(1), CCHide.action(),
                CCDelayTime.action(1),CCCallFunc.action(this, "loadInfo"));
        logo.runAction(sequence);
        
    }
    public void loadInfo(){
        CCSprite bg = CCSprite.sprite("image/welcome.jpg");
        bg.setAnchorPoint(0,0);
        this.addChild(bg);
        ArrayList<CCSpriteFrame> frames = null;
        loading = CCSprite.sprite("image/loading/loading_01.png");
        loading.setPosition(winSize.width/2,25);
        this.addChild(loading);
        String filePath = "image/loading/loading_%02d.png";
        CCAnimate animate = CommonUtil.getAnimate(frames , 9, filePath, 0.2f);
        loading.runAction(animate);
        
        start = CCSprite.sprite("image/loading/loading_start.png");
        start.setPosition(winSize.width/2,25);
        this.addChild(start,0,TAG_START);// 在什么情况下需要增加TAG_START?在其他类中访问到
        start.setVisible(false);
        
    }
    @Override
    public boolean ccTouchesEnded(MotionEvent event) {
        if(CommonUtil.isClick(event,this,start)){
            CommonUtil.replaceScene(new MenuLayer());
        }
        return super.ccTouchesEnded(event);
    }
}

MenuLayer

public class MenuLayer extends BaseLayer {
    public MenuLayer() {
        init();
    }
    private void init() {
        CCSprite bg = CCSprite.sprite("image/menu/main_menu_bg.jpg");
        bg.setAnchorPoint(0,0);
        this.addChild(bg);
        CCMenu menu = CCMenu.menu();
        CCMenuItemSprite item = CCMenuItemSprite.item(CCSprite.sprite("image/menu/start_adventure_default.png"),
                CCSprite.sprite("image/menu/start_adventure_press.png"), this,"onClick");
        menu.addChild(item);
        menu.setScale(0.5f);
        menu.setRotation(5);
        menu.setPosition(winSize.width/2-25,winSize.height/2-110);// 在使用绝对像素的时候,对屏幕适配是否有影响
        this.addChild(menu);
    }
    public void onClick(Object o){
        CommonUtil.replaceScene(new FightLayer());
    }
}

FightLayer

public class FightLayer extends BaseLayer{
    private static final String TAG = "FightLayer";
    public static final int TAG_CHOSE = 10;
    private CCTMXTiledMap gameMap;
    private ArrayList<ShowZombie> showZombieList;
    private ArrayList<ShowPlant> showPlantList;
    private CopyOnWriteArrayList<ShowPlant> chosePlantList;
    private CCSprite choseContainer;
    private CCSprite chooseContainer;
    
    private HashMap<Integer,HashMap<String,String>> data;
    private CCSprite start;
    private CCSprite ready;
    public FightLayer() {
        init();
    }

    private void init() {
        loadMap();
        loadZombie();
        moveMap();
        
    }
    private void loadZombie() {
        ArrayList<CGPoint> loadPoint = CommonUtil.loadPoint(gameMap, "zombies");
        showZombieList = new ArrayList<ShowZombie>();
        for (CGPoint cgPoint : loadPoint) {
            ShowZombie showZombie = new ShowZombie();
            showZombie.setPosition(cgPoint);
            gameMap.addChild(showZombie);
            showZombieList.add(showZombie);
        }
    }

    private void moveMap() {
        CGSize contentSize = gameMap.getContentSize();
        CGPoint pos = CGPoint.ccp(winSize.width-contentSize.width, 0);
        CCMoveTo moveTo = CCMoveTo.action(1, pos);
        CCSequence sequence = CCSequence.actions(moveTo, CCCallFunc.action(this, "loadContainer"));
        gameMap.runAction(sequence);
    }
    
    public void loadContainer(){
        choseContainer = CCSprite.sprite("image/fight/chose/fight_chose.png");
        chooseContainer = CCSprite.sprite("image/fight/chose/fight_choose.png");
        choseContainer.setPosition(0,winSize.height);
        choseContainer.setAnchorPoint(0,1);
        this.addChild(choseContainer,0,TAG_CHOSE);//TAG_CHOSE 方便在另外一个类中访问到
        
        chooseContainer.setAnchorPoint(0,0);
        this.addChild(chooseContainer);
        loadPlant();
        start = CCSprite.sprite("image/fight/chose/fight_start.png");
        start.setPosition(chooseContainer.getContentSize().width/2,25);
        chooseContainer.addChild(start);
    }

    private void loadPlant() {
         //the picture width and height is 42*56 
        showPlantList = new ArrayList<ShowPlant>();
        chosePlantList = new CopyOnWriteArrayList<ShowPlant>();
        for (int i = 1; i <=9 ; i++) {
            ShowPlant showPlant = new ShowPlant(i);
            CCSprite defaultImg = showPlant.getDefaultImg();
            CCSprite bgImg = showPlant.getBgImg();
            defaultImg.setPosition(52*((i-1)%4)+25,175-((i-1)/4)*58); // from up to down ,so more and more low    
            bgImg.setPosition(52*((i-1)%4)+25,175-((i-1)/4)*58);
             
            chooseContainer.addChild(defaultImg);
            chooseContainer.addChild(bgImg); 
            
            showPlantList.add(showPlant); 
        }
        setIsTouchEnabled(true);
    }
    
    @Override
    public boolean ccTouchesBegan(MotionEvent event) {
        //CGPoint touchPos = convertTouchToNodeSpace(event);  // 确定坐标才需要转换
        //remove
        if(GameController.getInstance().isStart()){
            GameController.getInstance().handlerTouch(event);
        }else{
            if(CommonUtil.isClick(event, this, choseContainer)){
                boolean isDel = false;
                for (ShowPlant item : chosePlantList) {
                    if(CommonUtil.isClick(event, this, item.getDefaultImg())){
                        CGPoint pos = item.getBgImg().getPosition();
                        CCMoveTo moveTo = CCMoveTo.action(0.2f, pos);
                        item.getDefaultImg().runAction(moveTo);
                        chosePlantList.remove(item);
                        isDel = true;
                    }
                    if(isDel){
                        //当前点击的元素也会前移,但是接下来有moveTo动作 看到的效果是 moveTo后结果
                        item.getDefaultImg().setPosition(item.getDefaultImg().getPosition().x-52,
                                item.getDefaultImg().getPosition().y);
                    }
                }
            }else{
                //add
                if(CommonUtil.isClick(event, this, start)){
                    setIsTouchEnabled(false);
//                    Log.i(TAG, "start");
                    preGame();
                }else{
                    if(chosePlantList.size()<5){
                        for (ShowPlant item : showPlantList) {
                            if(CommonUtil.isClick(event, this, item.getDefaultImg())){
                                CGPoint pos = CGPoint.ccp(75+chosePlantList.size()*52, winSize.height-62);
                                CCMoveTo moveTo = CCMoveTo.action(0.2f, pos);
                                item.getDefaultImg().runAction(moveTo);
                                chosePlantList.add(item);
                                Log.i(TAG, chosePlantList.size()+"");
                            }
                        }
                    }
                }
            }
        }
        
        return super.ccTouchesBegan(event);
    }
    
    private void preGame() {
//        ①回收掉玩家已有植物容器
        chooseContainer.removeSelf();
        choseContainer.setScale(0.65); //  父node改变大小,child的大小并不会随之改变    
        for (ShowPlant item : chosePlantList){
            CCSprite plant = item.getDefaultImg();
            CGPoint pos = CGPoint.ccp(plant.getPosition().x*0.65,
                    winSize.height-42);
            plant.setPosition(pos);
            plant.setScale(0.65);
            this.addChild(plant);
        }
        CGPoint pos = CGPoint.ccp(0, 0);
        CCMoveTo moveTo = CCMoveTo.action(1, pos);
        CCSequence sequence = CCSequence.actions(moveTo, CCCallFunc.action(this, "clearShowZombies"));
        gameMap.runAction(sequence);
//        ④序列帧播放:准备……安放……植物……
    }
//    ②移动地图  之后 clearShowZombies
//    ③回收掉展示用僵尸
    public void clearShowZombies() {
        for (ShowZombie item : showZombieList) {
            item.removeSelf();
        }
        showZombieList.clear();
        showZombieList = null;
        ready();
    }

    public void ready() {
        ready = CCSprite.sprite("image/fight/startready_01.png");
        ready.setPosition(winSize.width/2,winSize.height/2);
        this.addChild(ready);
        ArrayList<CCSpriteFrame> frames = null;
        CCAnimate animate = CommonUtil.getAnimate(frames, 3, "image/fight/startready_%02d.png", 1f);
        CCSequence sequence = CCSequence.actions(animate, CCCallFunc.action(this, "go"));
        ready.runAction(sequence);
    
    }
    public void go(){
        ready.removeSelf();
        setIsTouchEnabled(true);
        GameController.getInstance().start(gameMap, chosePlantList);
    }

    private void loadMap() {
        gameMap = CommonUtil.loadMap("image/fight/map_day.tmx");
        this.setPosition(0,0);
        this.addChild(gameMap);
    }
}

 CommonUtil.java

public class CommonUtil {
    //只播放一次
    public static CCAnimate getAnimate(ArrayList<CCSpriteFrame> frames,int num,String filePath,float interval){
        if(frames == null){
            frames = new ArrayList<CCSpriteFrame>();
            for (int i = 1; i <= num; i++) {
                CCSpriteFrame frame = CCSprite.sprite(String.format(filePath, i)).displayedFrame();
                frames.add(frame);
            }
        }
        CCAnimation animation = CCAnimation.animation("",interval,frames);
        CCAnimate animate = CCAnimate.action(animation,false);
        return animate;
    }
    //永久播放
    public static CCAction getRepeatForeverAction(ArrayList<CCSpriteFrame> frames,int num,String filePath,float interval){
        if(frames == null){
            frames = new ArrayList<CCSpriteFrame>();
            for (int i = 1; i <= num; i++) {
                CCSpriteFrame frame = CCSprite.sprite(String.format(filePath, i)).displayedFrame();
                frames.add(frame);
            }
        }
        CCAnimation animation = CCAnimation.animation("",interval,frames);
        CCAnimate animate = CCAnimate.action(animation);
        return CCRepeatForever.action(animate);
    }
    public static boolean isClick(MotionEvent event,CCLayer layer,CCNode node) {
        CGPoint touchPos = layer.convertTouchToNodeSpace(event);
        if(CGRect.containsPoint(node.getBoundingBox(), touchPos)){
            return true;
        }
        return false;
    }
    //replace scene
    public static void replaceScene(CCLayer layer){
        CCScene scene = CCScene.node();
        scene.addChild(layer);
        CCFadeTransition transition = CCFadeTransition.transition(1, scene);
        CCDirector.sharedDirector().replaceScene(transition);
    }
    public static CCTMXTiledMap loadMap(String map){
        CCTMXTiledMap tiledMap = CCTMXTiledMap.tiledMap(map);
        return tiledMap;
    }
    public static ArrayList<CGPoint> loadPoint(CCTMXTiledMap map,String name){
        CCTMXObjectGroup objectGroupNamed = map.objectGroupNamed(name);
        ArrayList<HashMap<String, String>> objects = objectGroupNamed.objects;
        ArrayList<CGPoint> list = new ArrayList<CGPoint>();
        for (HashMap<String, String> item : objects) {
            Float x = Float.parseFloat(item.get("x"));
            Float y = Float.parseFloat(item.get("y"));
            list.add(CGPoint.ccp(x, y));
        }
        return list;
    }
}

 

GameController.java

public class GameController {
    private static final String TAG = "GameController";
    private static GameController instance = new GameController();
    private boolean isStart = false;
    private FightLayer layer;
    private CCTMXTiledMap gameMap;
    private CGPoint[][] towers = new CGPoint[5][9];
    private static ArrayList<FightLine> fightLines;
    private List<ShowPlant> chosePlantList;
    static {
        fightLines = new ArrayList<FightLine>();
        for (int i = 0; i <= 4; i++) {
            FightLine fightLine = new FightLine(i);
            fightLines.add(fightLine);
        }
    }

    public static GameController getInstance() {
        return instance;
    }

    public boolean isStart() {
        return isStart;
    }

    public void setStart(boolean isStart) {
        this.isStart = isStart;
    }
    public void gameOver(){
//        isStart = false;
        //切换界面
    }
    public void start(CCTMXTiledMap gameMap,List<ShowPlant> chosePlantList) {
        isStart = true;
        this.gameMap = gameMap;
        this.chosePlantList = chosePlantList;
        this.layer = (FightLayer) gameMap.getParent();
        loadPlantPos();
        // false  表示不停止              addZombies 是 this 中的方法
        CCScheduler.sharedScheduler().schedule("addZombies", this, 5, false);
    }

    private void loadPlantPos() {
        for (int i = 1; i <= 5; i++) {
            CCTMXObjectGroup objectGroupNamed = gameMap.objectGroupNamed(String
                    .format("tower%02d", i));
            for (int j = 0; j < objectGroupNamed.objects.size(); j++) {
                HashMap<String, String> item = objectGroupNamed.objects.get(j);
                towers[i - 1][j] = CGPoint.ccp(Integer.parseInt(item.get("x")),
                        Integer.parseInt(item.get("y")));
            }
        } 
    }

    public void addZombies(float t) {
        Random random = new Random();
        int lineNum = random.nextInt(5);
        int startIndex = lineNum * 2;
        int endIndex = lineNum * 2 + 1;
        ArrayList<CGPoint> pos = CommonUtil.loadPoint(gameMap, "road");
 
        PrimaryZombies zombie = new PrimaryZombies(pos.get(startIndex), pos.get(endIndex));
        this.layer.addChild(zombie,1);
        fightLines.get(lineNum).addZombies(zombie);
    }
    private ShowPlant currentShowPlant ;
    private Plant currentPlant ;
    public void handlerTouch(MotionEvent event) {
        //选择植物
        if(CommonUtil.isClick(event, layer, (CCSprite) layer.getChildByTag(FightLayer.TAG_CHOSE))){
            for(ShowPlant item : chosePlantList){
                if(CommonUtil.isClick(event, layer, item.getDefaultImg())){
                    currentShowPlant = item;
                    currentShowPlant.getDefaultImg().setOpacity(100);
                    switch (item.getId()) {
                    case 4:
                        currentPlant = new PlantNut();
                        break;
                    case 2:
                        currentPlant = new PlantSun();
                        break;
                    case 1:
                        currentPlant = new PlantPease();
                        break;
                    }
                }
            }
        }else{
            //安放植物
            if(currentShowPlant!=null){
                // 第一层判断:安放区域(水平方向1-9;垂直方向1-5)
                if(isBuild(layer.convertTouchToNodeSpace(event))){
                    addPlant();
                }
            }
        }
        //收集阳光
    }
    private boolean isBuild(CGPoint touchPos) {
        int blockColumn = (int) (touchPos.x/46);
        int blockRow = (int) ((CCDirector.sharedDirector().getWinSize().height-touchPos.y)/54);
        Log.i(TAG, blockRow+"--"+blockColumn);
        if(blockRow>=1&&blockRow<=5){
            if(blockColumn>=1&&blockColumn<=9){
                int row = blockRow - 1;
                int column = blockColumn -1;
                currentPlant.setRow(row);
                currentPlant.setColumn(column);
                currentPlant.setPosition(towers[row][column]);
                return true;
            }
        }
        return false;
    }

    private void addPlant() {
        int row = currentPlant.getRow();
        FightLine fightLine = fightLines.get(row);
        //第二层判断 重叠植物
        if(fightLine.isAdd(currentPlant)){
            fightLine.addPlant(currentPlant);
            this.layer.addChild(currentPlant);
            currentShowPlant.getDefaultImg().setOpacity(255);
            currentShowPlant = null;
            currentPlant = null;
        }
    }
}

FightLine.java

public class FightLine implements DieListener {
    private static final String TAG = "FightLine";
    private int lineNum;
    private List<Zombie> zombieList;
    private List<AttackPlant> attackPlantList;
    private HashMap<Integer, Plant> plants;

    public FightLine(int lineNum) {
        this.lineNum = lineNum;
        zombieList = new ArrayList<Zombie>();
        plants = new HashMap<Integer, Plant>();
        attackPlantList = new ArrayList<AttackPlant>();

        CCScheduler.sharedScheduler()
                .schedule("attackPlant", this, 0.5f, false);
        
        CCScheduler.sharedScheduler().schedule("attackZombie", this, 0.5f, false);
        CCScheduler.sharedScheduler().schedule("checkBullet", this,0.2f, false);
    }
    public void checkBullet(float t){
        if(zombieList.size()>0&&attackPlantList.size()>0){
            for (AttackPlant item : attackPlantList) {
                ArrayList<Bullet> bullets = item.getBullets();
                for (Bullet bullet : bullets) {
                    for (Zombie zombie : zombieList) {
                        float left = zombie.getPosition().x-20 ;
                        float right = zombie.getPosition().x+20 ;
                        float x = bullet.getPosition().x;
                        if(x>=left && x<=right){
                            bullet.destroy();
                            zombie.attacked(bullet.getAttack());
                        }
                    }
                }
            }
        }
    }
    public void addZombies(PrimaryZombies zombie) {
        zombie.setDieListener(this);
        zombieList.add(zombie);
    }

    public void addPlant(Plant plant) {
        plant.setDieListener(this);
        Log.i(TAG, "" + plant.getColumn());
        plants.put(plant.getColumn(), plant);
        if (plant instanceof AttackPlant) {
            attackPlantList.add((AttackPlant) plant);
        }
    }
    
    public boolean isAdd(Plant plant) {
        return !plants.containsKey(plant.getColumn());
    }
    
    public void attackZombie(float t){
        if(zombieList.size()>0&&attackPlantList.size()>0){
            for(AttackPlant item:attackPlantList){
                item.createBullet();
            }
        }
    }
    // 僵尸攻击植物
    public void attackPlant(float t){
        if(plants.size()>0&&zombieList.size()>0){
            for (Zombie item : zombieList) {
                int key = (int) item.getPosition().x/46 -1 ;
                Plant plant = plants.get(key);
                if(plant != null){
                    item.attack(plant);
                }
            }
        }
    }
    @Override
    public void onDie(BaseElement element) {
        if(element instanceof Plant){
            int key =((Plant) element).getColumn();
            plants.remove(key);
            if(element instanceof AttackPlant){
                attackPlantList.remove(element);  //为什么上面不能直接 remove(element)
            }
        }else{
            zombieList.remove(element);
        }
    }
}

 

DieListener.java

public interface DieListener {
    void onDie(BaseElement baseElement);
}

PrimaryZombies.java

public class PrimaryZombies extends Zombie {
    private static final String TAG = "PrimaryZombies";
    private static ArrayList<CCSpriteFrame> shakeFrame;
    private static ArrayList<CCSpriteFrame> moveFrame;
    private static ArrayList<CCSpriteFrame> attackFrame;

    public PrimaryZombies() {
        super("image/zombies/zombies_1/walk/z_1_01.png");
        baseAction();
    }

    public PrimaryZombies(CGPoint startIndex, CGPoint endIndex) {
        super("image/zombies/zombies_1/walk/z_1_01.png");
        startPoint = startIndex;
        endPoint = endIndex;
        this.setPosition(startIndex);
        move();
    }

    @Override
    public void baseAction() {
        CCAction repeatForeverAction = CommonUtil.getRepeatForeverAction(
                shakeFrame, 2, "image/zombies/zombies_1/shake/z_1_%02d.png",
                0.2f);
        this.runAction(repeatForeverAction);
    }

    @Override
    public void move() {
        float t = CGPointUtil.distance(getPosition(), this.endPoint) / speed;
        Log.i(TAG, t + "");
        CCMoveTo moveTo = CCMoveTo.action(t, this.endPoint);
        CCSequence sequence = CCSequence.actions(moveTo,
                CCCallFunc.action(this, "gameOver"));
        this.runAction(sequence);
        this.runAction(CommonUtil.getRepeatForeverAction(moveFrame, 7,
                "image/zombies/zombies_1/walk/z_1_%02d.png", 0.2f));
    }

    public void gameOver() {
        destroy();
        GameController.getInstance().gameOver();
    }

    private boolean isAttack = false;
    private BaseElement target;

    @Override
    public void attack(BaseElement element) {
        isAttack = true;
        target = element;
        this.stopAllActions();

        CCAction repeatForeverAction = CommonUtil.getRepeatForeverAction(
                attackFrame, 10,
                "image/zombies/zombies_1/attack/z_1_attack_%02d.png", 0.2f);
        this.runAction(repeatForeverAction);
        CCScheduler.sharedScheduler()
                .schedule("attackPlant", this, 0.5f, false);

    }

    public void attackPlant(float t) {
        if (target instanceof Plant) {
            Plant plant = (Plant) target;
            plant.attacked(attack);
            if (plant.getLife() < 0) {
                CCScheduler.sharedScheduler().unschedule("attackPlant", this);
                this.stopAllActions();
                move();
            }
        }
    }

    private boolean isDie = false;

    private static ArrayList<CCSpriteFrame> headFrame;// 头掉下来
    private static ArrayList<CCSpriteFrame> dieFrame;// 趴着地上
    private static String headRes = "image/zombies/zombies_1/head/z_1_head_%02d.png";
    private static String dieRes = "image/zombies/zombies_1/die/z_1_die_%02d.png";

    @Override
    public void attacked(int attack) {
        life-= attack;
        if(life<0&&!isDie){
            isDie = true;
            this.stopAllActions();
            CCAnimate head = CommonUtil.getAnimate(headFrame, 6, headRes, 0.2f);
            CCAnimate die = CommonUtil.getAnimate(headFrame, 6, dieRes, 0.2f);
            CCSequence sequence = CCSequence.actions(head, die,CCCallFunc.action(this, "destroy"));
            this.runAction(sequence);
        }
    }

}

 

PlantPease

public class PlantPease extends AttackPlant {
    private ArrayList<CCSpriteFrame> shakeFrames;
    public PlantPease() {
        super("image/plant/pease/p_2_01.png");
        baseAction();
    }

    @Override
    public void baseAction() {
        
        CCAction repeatForeverAction = CommonUtil.getRepeatForeverAction(shakeFrames, 8, "image/plant/pease/p_2_%02d.png", 0.2f);
        this.runAction(repeatForeverAction);
    }

    @Override
    public void createBullet() {
        if(bullets.size()<1){
            CommonPease pease = new CommonPease();
            pease.setPosition(getPosition().x+20,getPosition().y+35);
            pease.setDieListener(this);
            this.getParent().addChild(pease);
            bullets.add(pease);
            pease.move();
        }
        
    }

}

 

PlantNut.java

public class PlantNut extends DefencePlant {
    private ArrayList<CCSpriteFrame> shakeFrame;
    public PlantNut() {
        super("image/plant/nut/p_3_01.png");
    }
    @Override
    public void baseAction() {
        this.runAction(CommonUtil.getRepeatForeverAction(shakeFrame, 11, "image/plant/nut/p_3_%02d.png", 0.2f));
    }
}

 

转载于:https://www.cnblogs.com/cherryhimi/p/4115553.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值