編輯:關於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
}
}
要想實現android手機通過掃描名片,得到名片信息,可以使用脈可尋提供的第三方SDK,即Maketion ScanCard SDK,脈可尋雲名片識別服務。他們的官方網站
本節引言: 我們前面學習了MaskFilter(面具),用它的兩個子類BlurMaskFilter弄了下模糊效果,EmbossMaskFilter
從上周把android ACHartEnginee的源碼check out出來後就一直在看這個東西是如何使用的,以及底層是如何實現的,把最近一周對這個東西的了解先發上來,
實現兩張圖片漸隱漸現的過渡效果Transition Drawable實現兩張圖片之間動態過度效果的方式。 運行如下所示:第一張為初始界面,第二張為過度中界面