植物大战僵尸

来源:互联网 发布:编程软件能赚钱吗 编辑:程序博客网 时间:2024/04/29 19:10

前阵子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);// 设置太上老君发射标志}// 如果僵尸碰到太上老君,则僵尸吃太上老君,太上老君减hpif (zb.hitPeaShooter(ps)) {ps.hitZombie();PeaShooterDie = false;}// 遍历太上老君中的子弹,如果子弹击中僵尸,则僵尸减hpfor (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);//}// 如果僵尸碰到太上老君,则僵尸吃太上老君,太上老君减hpif (wk.hitPeaShooter(ps)) {ps.hitZombie();oldkun_Die = false;}// 遍历太上老君中的子弹,如果子弹击中僵尸,则僵尸减hpfor (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}}// 放置太上老君@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubfor (Iterator iter = suns.iterator(); iter.hasNext();) {Sun s = (Sun) iter.next();s.click(event);}plantsPlaces.Click(event, sunShines);click(event);return true;}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// TODO Auto-generated method stubif (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

原创粉丝点击