PVS实战02

搭建游戏架子

GameCotroller 游戏开始后的控制类
FightLine 把一行的操作 抽取出来 每一行可以添加僵尸 安放植物 僵尸攻击植物 植物攻击僵尸

游戏开始

 public void stratGame(CCTMXTiledMap map, List<ShowPlant> selectPlants){
    this.map = map;
    this.selectPlants = selectPlants;
    loadMap();
    // 添加僵尸

    // 定时器
    // 参数1 方法名(方法带float类型的参数) 参数2 调用方法的对象 参数3 间隔时间 参数4 是否暂停
    CCScheduler.sharedScheduler().schedule("addZombies", this, 1,false);
    // CCCallFunc.action(target, selector)
    // addZombies();

    // 安放植物
    // 僵尸攻击植物
    // 植物攻击僵尸
    progress();
}

解析地图

 private void loadMap() {
    roadPoints = CommonUtils.getMapPoints(map, "road");
    for (int i = 1; i <= 5; i++) {
        List<CGPoint> mapPoints = CommonUtils.getMapPoints(map,
                String.format("tower%02d", i));
        for (int j = 0; j < mapPoints.size(); j++) {
            towers[i - 1][j] = mapPoints.get(j);
        }
    }

}

安放植物

 //判断游戏是否已经开始 开始后就将
    if (GameCotroller.isStart){
        GameCotroller.getInstance().handleTouch(point);
        //返回  下面的逻辑不再执行
        return super.ccTouchesBegan(event);
    }

 public void handleTouch(CGPoint point) {
    //根据标签获得精灵
    CCSprite chose = (CCSprite) map.getParent().getChildByTag(
            FightLayer.TAG_CHOSE);
    //判断是否点击的是选择框
    if (CGRect.containsPoint(chose.getBoundingBox(),point)){
        //判断点击的是那个植物
        for (ShowPlant plant:selectPlants) {
            if (CGRect.containsPoint(plant.getShowSprite().getBoundingBox(),point)){
                // 玩家选择了植物
                selectPlant = plant;
                selectPlant.getShowSprite().setOpacity(150);
                //新建一个即将要安放的植物
                int id = selectPlant.getId();
                switch (id) {
                    case 1:
                        installPlant =new PeasePlant();
                        break;
                    case 4:
                        installPlant = new Nut();
                        break;
                    default:
                        break;
                }
            }

        }

    }else {//说明要安放植物了
        // 玩家有可能安放植物
        if (selectPlant != null) {
            int row = (int) (point.x / 46) - 1; // 1-9 0-8
            int line = (int) ((CCDirector.sharedDirector().getWinSize().height - point.y) / 54) - 1;// 1-5
            // 0-4
            // 限制安放的植物的范围
            if (row >= 0 && row <= 8 && line >= 0 && line <= 4) {

                // 安放植物
                // selectPlant.getShowSprite().setPosition(point);
                // installPlant.setPosition(point); // 坐标需要修改
                installPlant.setLine(line);// 设置植物的行号
                installPlant.setRow(row); // 设置植物的列号

                installPlant.setPosition(towers[line][row]); // 修正了植物的坐标
                FightLine fightLine = lines.get(line);
                if (!fightLine.containsRow(row)) {  // 判断当前列是否已经添加了植物 如果添加了 就不能再添加了
                    fightLine.addPlant(installPlant);// 把植物记录到了行战场中
                    map.addChild(installPlant);
                }
            }
            installPlant = null;
            selectPlant.getShowSprite().setOpacity(255);
            selectPlant = null;// 下次安装需要重新选择
        }

    }



}

对战的实现

package com.sdh.pvzhm.engine;
import com.sdh.pvzhm.bean.AttackPlant;
import com.sdh.pvzhm.bean.BaseElement;
import com.sdh.pvzhm.bean.Bullet;
import com.sdh.pvzhm.bean.Plant;
import com.sdh.pvzhm.bean.Zombies;
import org.cocos2d.actions.CCScheduler;
import org.cocos2d.types.CGPoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by hnedpc008 on 2016/9/18.
 */
public class FightLine {
    private int lineNum;

    public FightLine(int lineNum) {
        this.lineNum = lineNum;
        CCScheduler.sharedScheduler()
                .schedule("attackPlant", this, 0.2f, false);
        CCScheduler.sharedScheduler().schedule("createBullet", this, 0.2f,
                false);

        CCScheduler.sharedScheduler().schedule("attackZombies", this, 0.1f,
                false);
    }
    // 判断子弹和僵尸是否产生了碰撞
    public void attackZombies(float t){
        if (zombiesLists.size() > 0 && attackPlants.size() > 0) {
            for(Zombies zombies:zombiesLists){
                float x = zombies.getPosition().x;
                float left=x-20;
                float right=x+20;
                for(AttackPlant attackPlant:attackPlants){
                    List<Bullet> bullets = attackPlant.getBullets();
                    for(Bullet bullet:bullets){
                        float bulletX = bullet.getPosition().x;
                        if(bulletX>left&&bulletX<right){
                            //产生了碰撞
                            zombies.attacked(bullet.getAttack());// 僵尸被攻击, 参数 攻击力
//                          bullet.removeSelf()
                            bullet.setVisible(false);
                            bullet.setAttack(0);
                        }
                    }
                }

            }

        }


    }

    // 需要一直判断
    public void attackPlant(float t) {
        if (zombiesLists.size() > 0 && plants.size() > 0) { // 保证当前行上既有僵尸又有植物
            for (Zombies zombies : zombiesLists) {
                CGPoint position = zombies.getPosition();
                int row = (int) (position.x / 46 - 1); // 获取到僵尸所在的列
                Plant plant = plants.get(row);
                if (plant != null) {
                    zombies.attack(plant);
                }
            }
        }
    }

    public void createBullet(float t) {
        if (zombiesLists.size() > 0 && attackPlants.size() > 0) {
            // 创建子弹
            for (AttackPlant attackPlant : attackPlants) {
                attackPlant.createBullet();// 遍历所有攻击类型植物 创建子弹
            }
        }
    }

    private List<Zombies> zombiesLists = new ArrayList<Zombies>();
    private Map<Integer, Plant> plants = new HashMap<Integer, Plant>();// 管理添加的植物
    // key当前植物所对应的列号
    private List<AttackPlant> attackPlants = new ArrayList<AttackPlant>();

    public void addZombies(final Zombies zombies) {
        zombiesLists.add(zombies);
        zombies.setDieListener(new BaseElement.DieListener() {

            @Override
            public void die() {
                zombiesLists.remove(zombies);
            }
        });
    }

    public void addPlant(final Plant plant) {
        plants.put(plant.getRow(), plant);
        if (plant instanceof AttackPlant) { // 如果发现植物是一个攻击类型的植物,添加到攻击类型植物的集合中
            attackPlants.add((AttackPlant) plant);
        }

        plant.setDieListener(new BaseElement.DieListener() {

            @Override
            public void die() {
                plants.remove(plant.getRow());
                if (plant instanceof AttackPlant) {
                    attackPlants.remove((AttackPlant) plant);
                }
            }
        });

    }

    /**
     * 判断该列上 是否有植物
     *
     * @param row
     */
    public boolean containsRow(int row) {
        return plants.containsKey(row);
    }
}

package com.sdh.pvzhm.bean;

import com.sdh.pvzhm.com.sdh.utils.CommonUtils;

import org.cocos2d.actions.CCScheduler;
import org.cocos2d.actions.base.CCAction;
import org.cocos2d.actions.instant.CCCallFunc;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.util.CGPointUtil;

/**
 * Created by hnedpc008 on 2016/9/18.
 */
public class PrimaryZombies extends Zombies{
    public PrimaryZombies(CGPoint startPoint, CGPoint endPoint) {
        super("image/zombies/zombies_1/walk/z_1_01.png");
        this.startPoint = startPoint;
        this.endPoint = endPoint;

        setPosition(startPoint);
        move();
    }

    @Override
    public void move() {
        CCAction animate = CommonUtils.getAnimate(
                "image/zombies/zombies_1/walk/z_1_%02d.png", 7, true);
        this.runAction(animate);
        float t = CGPointUtil.distance(getPosition(), endPoint) / speed;
        CCMoveTo moveTo = CCMoveTo.action(t, endPoint);
        CCSequence sequence = CCSequence.actions(moveTo,
                CCCallFunc.action(this, "endGame"));
        this.runAction(sequence);
    }

    public void endGame() {
        this.destroy();
    }





    Plant targetPlant;// 要攻击的目标

    @Override
    public void attack(BaseElement element) {

        if (element instanceof Plant) {
            Plant plant = (Plant) element;
            if (targetPlant == null) {//如果已经锁定目标了 就不要再调用下面的方法了
                targetPlant = plant;// 锁定目标

                stopAllActions();
                // 切换成攻击模式
                CCAction animate = CommonUtils.getAnimate(
                        "image/zombies/zombies_1/attack/z_1_attack_%02d.png",
                        10, true);
                this.runAction(animate);
                //  让植物持续掉血
                CCScheduler.sharedScheduler().schedule("attackPlant", this, 0.5f, false);
            }
        }
    }
    public void attackPlant(float t){

        // 调用植物被攻击的方法
        targetPlant.attacked(attack);
        if(targetPlant.getLife()<0){
            targetPlant=null;// 解锁目标
            CCScheduler.sharedScheduler().unschedule("attackPlant", this);//移除定时任务
            stopAllActions();
            move();// 继续前进
        }
    }

    @Override
    public void attacked(int attack) {
        life-=attack;
        if(life<0){
            destroy();
        }
    }

    @Override
    public void baseAction() {
        // TODO Auto-generated method stub

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值