植物大战僵尸

前阵子android游戏开发实训,做植物大战僵尸,培训时间太短,做的时间也太短,功能很多不齐全,不过还是辛苦健哥把图片都p给我,减少了很多负担,挺喜欢这感觉的,大家都肯付出。之前没接触过游戏开发,一开始挺棘手

这是整个文件的目录结构,

对于植物拖动,将其放在草坪格子的分析:


草坪要预留一定的高度给植物卡槽(顶部红色区域) 高度设置为ExtraTopPlaceHeight,左边红色区域预留位置放推车 设置为ExtraLeftPlaceWidth

每次拖动要判断植物落在那个格子里面,每个格子的大小是 80*80,每次拖动后都要调整植物的位置,以下是判断函数:

public Point GetPlaceAdjust(Point p){     //获取调整后网格位置
int x=(p.x-ExtraLeftPlaceWidth)/80*80+ExtraLeftPlaceWidth;
int y=(p.y-ExtraTopPlaceHeight)/80*80+ExtraTopPlaceHeight;  

Point p2=new Point(x,y);
return p2;
}


View类都是继承SurfaceView,当surfaceCreated时,启动线程画出人物,其实也不难。整个游戏画面的代码就在这里

package com.li.pz.view;


import java.util.Iterator;
import java.util.Vector;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PointF;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;


import com.li.pz.MainActivity;
import com.li.pz.entity.Nut;
import com.li.pz.entity.Knife;
import com.li.pz.entity.OldKun;
import com.li.pz.entity.Sun;
import com.li.pz.entity.Rulai;
import com.li.pz.entity.Czombie;
import com.li.pz.entity.WuKun;
import com.li.pz.resourse.Resource;
import com.li.pz.thread.CreatWukun;
import com.li.pz.thread.CreateSunThread;
import com.li.pz.thread.CreateZomBieThread;
import com.li.pz.thread.DrawThread;
import com.li.pz.R;


public class Game extends SurfaceView implements Callback {
private SurfaceHolder holder;
// 控制线程的运行
public boolean run = true;


// 资源类
Resource res = new Resource(this);


// 僵尸数组
private Vector<Czombie> zombies = new Vector<Czombie>();
//悟空数组
private Vector<WuKun> wukuns=new Vector<WuKun>();
// 太上老君数组
private Vector<OldKun> oldkun = new Vector<OldKun>();
// 向日葵数组
private Vector<Rulai> sunFlowers = new Vector<Rulai>();
// 坚果数组 比如这里增加了坚果
private Vector<Nut> nuts = new Vector<Nut>();
// 太阳数组
private Vector<Sun> suns = new Vector<Sun>();
// 坐标图
private Places place = new Places();
// 拖动栏
private PlantsPlaces plantsPlaces;
// 阳光数
private int sunShines = 1000;
// 阳光数字符串
private String sunShinesText;
// 阳光数字符串画笔
private Paint mPaint = new Paint();


//退出按钮
private Bitmap exitBitmap;

// 背景
private Bitmap bg;
private Bitmap bg1;





private MainActivity activity;

//僵尸数量
private int czm_number;
private int wk_number;


//僵尸波数字符串控制
private int flag =0;


public Game(Context context) {
super(context);
activity = (MainActivity) context;
holder = this.getHolder();
// 设置回调对象
holder.addCallback(this);
// 坐标图初始化
place.setExtraLeftPlaceWidth(50);
place.setExtraTopPlaceHeight(70);
mPaint.setTextSize(20);


mPaint.setColor(Color.BLUE);
mPaint.setAntiAlias(true);



// 资源初始化
res.init();
// 初始化位图,entity包中的类的图片都在这里初始化
Czombie.moveBitmap = res.getZombieMove();
Czombie.eatBitmap = res.getZombieEat();
Czombie.dieBitmap = res.getZombieDie();

WuKun.moveBitmap=res.getWuKunMove();
WuKun.eatBitmap=res.getWuKunEat();


Rulai.bitmap = res.getSunflower();


Sun.bitmap = res.getSun();


OldKun.bitmap = res.getPeashooter();


Knife.bitmap = res.getPea();


Nut.bitmap = res.getNutFull();
Nut.bitmap1 = res.getNutHalf();
Nut.bitmap2 = res.getNutLittle();









Rulai.cards = res.getSunflowerCards();
OldKun.cards = res.getPeashoooterCards();


Nut.cards = res.getNutCards();
exitBitmap = res.getExitBitmap();



bg = BitmapFactory.decodeResource(this.getResources(),
R.drawable.background1);
bg1 = BitmapFactory.decodeResource(this.getResources(),
R.drawable.background1);

plantsPlaces = new PlantsPlaces(this);
}


public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub


}


public void surfaceCreated(SurfaceHolder holder) {
new Thread(new DrawThread(this)).start();
new Thread(new CreatWukun(this, 24)).start();
new Thread(new CreateZomBieThread(this, 24)).start();
new Thread(new CreateSunThread(this)).start();
setRun(true);



}


public void surfaceDestroyed(SurfaceHolder holder) {
setRun(false);
}


// 绘制阳光数字符串方法
public void drawSunShines(Canvas canvas) {
sunShinesText = sunShines + "";
float textX = 30 + (40 - sunShinesText.length() * 10) / 2;
canvas.drawText(sunShinesText, textX, 75, mPaint);

}


// 绘制游戏画面
public void GameDraw() {
Canvas canvas = null;
try {
if (holder != null) {
canvas = holder.lockCanvas();


synchronized (holder) {


// 绘制背景
canvas.drawBitmap(bg, 0, 0, null);


// 绘制工具栏
plantsPlaces.draw(canvas);





// 绘制阳光数字符串
drawSunShines(canvas);





// 绘制僵尸
for (Iterator iter = zombies.iterator(); iter.hasNext();) {

Czombie zb = (Czombie) iter.next();


zb.draw(canvas);
}
//绘制悟空
for(Iterator iter = wukuns.iterator();iter.hasNext();){
WuKun wk=(WuKun)iter.next();
wk.draw(canvas);
}
// 绘制太上老君
for (Iterator iter = oldkun.iterator(); iter.hasNext();) {
OldKun ps = (OldKun) iter.next();
ps.draw(canvas);
}


// 绘制阳光
for (Iterator iter = suns.iterator(); iter.hasNext();) {
Sun ps = (Sun) iter.next();
ps.draw(canvas);
}


// 绘制太阳花
for (Iterator iter3 = sunFlowers.iterator(); iter3
.hasNext();) {
Rulai sf = (Rulai) iter3.next();
sf.draw(canvas);
}


// 绘制坚果
for (Iterator iter4 = nuts.iterator(); iter4.hasNext();) {
Nut nt = (Nut) iter4.next();
nt.draw(canvas);
}



//设置僵尸的波数
if(czm_number == 1 && flag <8 ){
canvas.drawBitmap(res.getText1(), 250, 230, null);
flag ++;
}
if(czm_number == 6 &&flag <16){
canvas.drawBitmap(res.getText1(), 250, 230, null);
flag ++;
}
if(czm_number == 14 && flag <24){
canvas.drawBitmap(res.getText2(), 275, 205, null);
flag ++;
}



}


}
} catch (Exception e) {
e.printStackTrace();
} finally {


if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}


// 坐标改变和状态改变
public void GameChange() {
try {


// 遍历太上老君
for (Iterator iter2 = oldkun.iterator(); iter2.hasNext();) {
OldKun ps = (OldKun) iter2.next();
ps.change();
if (ps.getState() == 0) {
iter2.remove();
place.SetPlaceStatus(
new Point((int) ps.getX(), (int) ps.getY()), false);
}
ps.setFireFlag(false);
}




// 遍历太阳花


for (Iterator iter3 = sunFlowers.iterator(); iter3.hasNext();) {
Rulai sf = (Rulai) iter3.next();
sf.change();
if (sf.isCreate()) {
float x = sf.getX();
float y = sf.getY();
suns.add(new Sun(x, y, Game.this));
}
if (sf.getState() == 0) {
iter3.remove();
place.SetPlaceStatus(
new Point((int) sf.getX(), (int) sf.getY()), false);
}
}


// 遍历坚果


for (Iterator iter8 = nuts.iterator(); iter8.hasNext();) {
Nut ps = (Nut) iter8.next();
ps.change();
if (ps.getState() == 0) {
iter8.remove();
place.SetPlaceStatus(
new Point((int) ps.getX(), (int) ps.getY()), false);
}
ps.setFireFlag(false);
}


// 遍历僵尸
for (Iterator iter1 = zombies.iterator(); iter1.hasNext();) {
// 先假设死了,如果碰撞到就代表没死,还不能走
boolean PeaShooterDie = true;// 吃完要走
boolean SunFlowerDie = true;
boolean NutDie = true;


Czombie zb = (Czombie) iter1.next();
float liney = zb.getY();


// 如果僵尸是死亡状态,则把该僵尸移除
if (zb.getState() == 4) {
iter1.remove();
}


// 如果僵尸是走进房子状态,切换到失败界面
if (zb.getState() == 5) {
iter1.remove();
activity.getHandler().sendEmptyMessage(4);
}
// 僵尸中遍历太上老君
for (Iterator iter4 = oldkun.iterator(); iter4.hasNext();) {
OldKun ps = (OldKun) iter4.next();
Log.d("---------", ps.getY()+"-"+liney+"");
if (ps.getY() == liney-50) {

if (zb.getX() >= ps.getX()) {
// 只有僵尸在画面中才会受到攻击
if (zb.getX() <= 800) {


ps.setFireFlag(true);// 设置太上老君发射标志
}
// 如果僵尸碰到太上老君,则僵尸吃太上老君,太上老君减hp
if (zb.hitPeaShooter(ps)) {



ps.hitZombie();


PeaShooterDie = false;


}
// 遍历太上老君中的子弹,如果子弹击中僵尸,则僵尸减hp
for (Iterator iter5 = ps.getPeas().iterator(); iter5
.hasNext();) {
Knife p = (Knife) iter5.next();
zb.hitPea(p);
}
}
}
}





// 僵尸中遍历太阳花
for (Iterator iter6 = sunFlowers.iterator(); iter6.hasNext();) {
Rulai sf = (Rulai) iter6.next();

if (sf.getY() == liney-30) {
if (zb.hitSunFlower(sf)) {
sf.hitZombie();
SunFlowerDie = false;
}
}


}
// 僵尸中遍历坚果
for (Iterator iter9 = nuts.iterator(); iter9.hasNext();) {
Nut nut = (Nut) iter9.next();
if (nut.getY() == liney) {
if (zb.hitNut(nut)) {
nut.hitZombie();
NutDie = false;
}
}


}


if (zb.getState() == 2
&& (PeaShooterDie && SunFlowerDie && NutDie)) {
//Log.i("walk", zb.getState() + "");
activity.getSp().play(
activity.getSpMap().get(1), 1, 1, 1, 0,
1);
zb.setState(1);


}


zb.change();
}

//-----------------------------------------------------------------------------------//
// 遍历悟空
for (Iterator iter8 = wukuns.iterator(); iter8.hasNext();) {
// 先假设死了,如果碰撞到就代表没死,还不能走
boolean oldkun_Die = true;// 吃完要走
boolean rulai_Die = true;
boolean nutDie = true;

WuKun wk = (WuKun) iter8.next();
float line_y = wk.getY();


// 如果僵尸是死亡状态,则把该僵尸移除
if (wk.getState() == 4) {
iter8.remove();
}


// 切换到失败界面
if (wk.getState() == 5) {
iter8.remove();
activity.getHandler().sendEmptyMessage(4);
}
// 僵尸中遍历
for (Iterator iter4 = oldkun.iterator(); iter4.hasNext();) {
OldKun ps = (OldKun) iter4.next();

if (ps.getY() == line_y-50) {

if (wk.getX() >= ps.getX()) {
ps.setFireFlag(true);
//}
// 如果僵尸碰到太上老君,则僵尸吃太上老君,太上老君减hp
if (wk.hitPeaShooter(ps)) {



ps.hitZombie();


oldkun_Die = false;


}
// 遍历太上老君中的子弹,如果子弹击中僵尸,则僵尸减hp
for (Iterator iter5 = ps.getPeas().iterator(); iter5
.hasNext();) {
Knife p = (Knife) iter5.next();
wk.hitPea(p);
}
}
}
}



// 僵尸中遍历太阳花
for (Iterator iter6 = sunFlowers.iterator(); iter6.hasNext();) {
Rulai sf = (Rulai) iter6.next();
if(sf.getY()==line_y-30){
if(wk.hitSunFlower(sf)){
sf.hitZombie();
oldkun_Die=false;
}
}
}
// 僵尸中遍历坚果
for (Iterator iter9 = nuts.iterator(); iter9.hasNext();) {
Nut nut = (Nut) iter9.next();
if(nut.getY()==line_y){
if(wk.hitNut(nut)){
nut.hitZombie();
nutDie=false;
}
}
}




if(wk.getState()==2
&&(oldkun_Die && rulai_Die && nutDie)){
wk.setState(1);
}


wk.change();
}


for (Iterator iter7 = suns.iterator(); iter7.hasNext();) {
Sun s = (Sun) iter7.next();
s.change();
if (s.getState() == 2 || s.getState() == 3) {
if (s.getState() == 3) {
sunShines += s.getSunNum();
}
iter7.remove();
}
}
if(flag == 24&&zombies.isEmpty()){
activity.getHandler().sendEmptyMessage(3);
flag ++;
}}catch (Exception e) {
// TODO: handle exception
}
}


// 放置太上老君
@Override
public boolean onTouchEvent(MotionEvent event) {


// TODO Auto-generated method stub
for (Iterator iter = suns.iterator(); iter.hasNext();) {
Sun s = (Sun) iter.next();
s.click(event);
}
plantsPlaces.Click(event, sunShines);

click(event);
return true;


}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
run = false;
setRun(false);
}
return super.onKeyDown(keyCode, event);
}


// 返回键触发
public void click(MotionEvent event) {
float clickX = event.getX();
float clickY = event.getY();
if (clickX >= 700 && clickX <= 800 && clickY >= 0 && clickY <= 60) {
if(event.getAction() ==  MotionEvent.ACTION_DOWN) {
goToBegin();
}
}


}




// 返回主界面
public void goToBegin() {
((MainActivity) activity).getHandler().sendEmptyMessage(2);
}


// 下面是set、get方法


public MainActivity getActivity() {
return activity;
}


public void setActivity(MainActivity activity) {
this.activity = activity;
}


public boolean isRun() {
return run;
}


public void setRun(boolean run) {
this.run = run;
}

public Vector<WuKun> getWukuns() {
return wukuns;
}


public void setWukuns(Vector<WuKun> wukuns) {
this.wukuns = wukuns;
}


public Vector<Czombie> getZombies() {
return zombies;
}


public void setZoombies(Vector<Czombie> zoombies) {
this.zombies = zoombies;
}


public Vector<OldKun> getoldkun() {
return oldkun;
}


public void setoldkun(Vector<OldKun> oldkun) {
this.oldkun = oldkun;
}


public Places getPlace() {
return place;
}


public void setPlace(Places place) {
this.place = place;
}


public Vector<Rulai> getSunFlowers() {
return sunFlowers;
}


public void setSunFlowers(Vector<Rulai> sunFlowers) {
this.sunFlowers = sunFlowers;
}


public int getSunShines() {
return sunShines;
}


public void setSunShines(int sunShines) {
this.sunShines = sunShines;
}


public Vector<Nut> getNuts() {
return nuts;
}


public void setNuts(Vector<Nut> nuts) {
this.nuts = nuts;
}


public Vector<Sun> getSuns() {
return suns;
}


public void setSuns(Vector<Sun> suns) {
this.suns = suns;
}





public Resource getRes() {
return res;
}


public void setRes(Resource res) {
this.res = res;
}


public int getCzm_number() {
return czm_number;
}


public void setCzm_number(int czm_number) {
this.czm_number = czm_number;
}


public int getWk_number() {
return wk_number;
}


public void setWk_number(int wk_number) {
this.wk_number = wk_number;
}

}




附上下载地址,屏幕木有适配,480*800:  http://download.csdn.net/detail/li_zhuonan/6321371

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值