Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> PVS實戰02

PVS實戰02

編輯:關於Android編程

搭建游戲架子

GameCotroller 游戲開始後的控制類
FightLine 把一行的操作 抽取出來 每一行可以添加僵屍 安放植物 僵屍攻擊植物 植物攻擊僵屍

游戲開始

 public void stratGame(CCTMXTiledMap map, List 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 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 bullets = attackPlant.getBullets();
                    for(Bullet bullet:bullets){
                        float bulletX = bullet.getPosition().x;
                        if(bulletX>left&&bulletX 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 zombiesLists = new ArrayList();
    private Map plants = new HashMap();// 管理添加的植物
    // key當前植物所對應的列號
    private List attackPlants = new ArrayList();

    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

    }

}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved