在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android 疯狂足球源码

android 疯狂足球源码

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:1.58M
  • 下载次数:21
  • 浏览次数:322
  • 发布时间:2015-08-24
  • 实例类别:Android平台开发
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: Android 源码 足球

实例介绍

【实例简介】Android 疯狂足球游戏源码,虽然界面很丑,但好赖功能实现了,自己可以美化一下界面.

【实例截图】

【核心代码】


package wyf.wpf;			//声明包语句
import java.util.ArrayList;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/*
 * 该类是游戏的主视图类,负责游戏画面的绘制,菜单的绘制绘制等等
 * 成员方法多为绘制方法,同时也有修改游戏数据的方法,如关卡数据等。为实现
 * SurfaceHolder.Callback接口重写了一些方法
 */
public class GameView extends SurfaceView implements SurfaceHolder.Callback{
	Ball ball;			//小球对象
	int fieldLeft=27;		//球场的左边界在屏幕中的位置	
	int fieldRight=293;		//球场的右边界在屏幕中的位置
	int fieldUp = 68;		//球场的上边界在屏幕中的位置
	int fieldDown = 470;	//球场的下边界在屏幕中的位置
	int barDistance = 50;		//两个摇杆的间距
	int playerSize = 18;		//运动员图片的大小
	int maxLeftPosition = 115;		//守门员最左能走到的地方=
	int maxRightPosition = 205;		//守门员最右能走到的地方=
	int aiDirection = -1;			//记录AI的运动方向,4为左,12为右=
	int level=1;				//游戏的难度
	int MaxLevel = 3;		//最高等级
	int [] scores = {0,0};	//比分,前我后敌
	int scoreLeft = 80;		//绘制左边比分时的参考X坐标
	int scoreRight = 240;	//绘制右边比分时的参考X坐标
	int timeCounter=0;		//计时器,用于显示
	int winPoint = 8;			//获胜点,谁的进球数先达到该值获胜
	int AIGoalLeft;				//AI球门左边=
	int AIGoalRight;			//AI球门右边=
	int myGoalLeft;				//玩家的球门左边=
	int myGoalRight;			//玩家的球门右边=
	
	boolean isScoredAGoal;	//若进了球则暂时会置为true
	boolean isGameOver;		//一局比赛结束
	boolean isGameWin;		//是否赢了
	boolean isShowDialog;	//是否显示对话框
	boolean isGamePassAll;	//是否打赢了所有等级的比赛

	ArrayList<Bonus> balLive = new ArrayList<Bonus>();//这个用于碰撞检测,里面全是活动态的Bonus=
	ArrayList<Bonus> balForDraw = new ArrayList<Bonus>();//这个用于绘制,里面既有活动态,也有生效态的Bonus=
	ArrayList<Bonus> balAdd = new ArrayList<Bonus>();			//存放待添加Bonus对象的临时集合=
	ArrayList<Bonus> balDelete = new ArrayList<Bonus>();		//存放待删除Bonus对象的临时集合=
	BonusManager bm;											//BonusManager对象引用=
	
	FootballActivity father;		//FootballActivity对象引用
	DrawThread dt;				//后台刷屏线程
	AIThread ait;				//控制AI移动的线程	
	ArrayList<Player> alMyPlayer = new ArrayList<Player>(11);	//玩家的运动员集合
	ArrayList<Player> alAIPlayer = new ArrayList<Player>(11);	//AI 的运动员集合

	Bitmap bmpMyPlayer;		//玩家的球员图片	
	Bitmap bmpAIPlayer;		//AI的球员图片
	Bitmap bmpGoalBanner;	//进球后显示的图片
	Bitmap [] bmpScores;	//表示比分的数字图片
	Bitmap bmpWinBanner;	//游戏胜利的图片
	Bitmap bmpWinText;		//游戏胜利的文字
	Bitmap bmpLoseBanner;	//游戏失败的图片
	Bitmap bmpLoseText;		//游戏失败的文字
	Bitmap bmpPassAll;		//打赢所有比赛提示的图片
	Bitmap bmpMyClub;		//记录玩家所选的俱乐部
	Bitmap bmpAIClub;		//记录AI的俱乐部
	Bitmap bmpMenu;			//菜单图片
	Bitmap bmpDialog;		//对话框图片
	Bitmap bmpBackField;	//球场背景图片
	//Rect对象,用来与点击事件发生的位置进行匹配
	Rect rectMenu = new Rect(134,0,186,60);		//代表菜单的矩形框,
	Rect rectYesToDialog = new Rect(75,271,100,292);	//代表返回主菜单对话框中的是按钮
	Rect rectNoToDialog = new Rect(223,271,248,292);	//代表返回主菜单对话框中的否按钮
	int clubID;//存放俱乐部logo的图片ID
		
	//构造器,初始化成员变量
	public GameView(FootballActivity father,int clubID) {
		super(father);		//调用父类构造器
		getHolder().addCallback(this);//添加Callback接口
		this.father = father;
		this.clubID = clubID;//获得俱乐部logo		
		ball = new Ball(this);		//创建足球线程	
		initPlayerInstance();//初始化双方队员		
		initGame();//初始化游戏		
		initBitmap(father);	//初始化图片资源			
		ait = new AIThread(this);//创建AI分析线程		
		bm = new BonusManager(this);//初始化BonusManager		
		dt = new DrawThread(this,getHolder());//创建后台刷屏线程
	}
	//启动线程
	public void startGame(){
		ait.start();			//启动AI分析线程
		bm.start();				//启动BonusManager线程
		ball.start();			//启动足球线程
	}
	//初始化位图
	public void initBitmap(Context context){
		Resources r = context.getResources();		//获得Resources对象
		bmpMyPlayer = BitmapFactory.decodeResource(r,R.drawable.player18);		//玩家球员图片初始化
		bmpAIPlayer = BitmapFactory.decodeResource(r, R.drawable.ai_player);	//AI球员图片初始化
		bmpScores = new Bitmap[10];										 		//数字图片初始化
		bmpScores[0] = BitmapFactory.decodeResource(r, R.drawable.digit_0);		//数字图片0
		bmpScores[1] = BitmapFactory.decodeResource(r, R.drawable.digit_1);		//数字图片1
		bmpScores[2] = BitmapFactory.decodeResource(r, R.drawable.digit_2);		//数字图片2
		bmpScores[3] = BitmapFactory.decodeResource(r, R.drawable.digit_3);		//数字图片3
		bmpScores[4] = BitmapFactory.decodeResource(r, R.drawable.digit_4);		//数字图片4
		bmpScores[5] = BitmapFactory.decodeResource(r, R.drawable.digit_5);		//数字图片5
		bmpScores[6] = BitmapFactory.decodeResource(r, R.drawable.digit_6);		//数字图片6
		bmpScores[7] = BitmapFactory.decodeResource(r, R.drawable.digit_7);		//数字图片7 
		bmpScores[8] = BitmapFactory.decodeResource(r, R.drawable.digit_8);		//数字图片8  
		bmpScores[9] = BitmapFactory.decodeResource(r, R.drawable.digit_9);		//数字图片9
		bmpGoalBanner = BitmapFactory.decodeResource(r, R.drawable.game_goal);	//进球后的标语		
		bmpWinText = BitmapFactory.decodeResource(r, R.drawable.game_win);	//比赛胜利时的提示文字
		bmpLoseBanner = BitmapFactory.decodeResource(r, R.drawable.game_over);	//比赛失败时的提示图片
		bmpLoseText = BitmapFactory.decodeResource(r, R.drawable.game_lose);	//比赛失败时的提示文字
		Matrix m = new Matrix();			//创建Matrix对象,用于裁剪图片以适合游戏界面中俱乐部图片的大小
		Bitmap bmpTemp = BitmapFactory.decodeResource(r,(int) clubID);	//拿到指定的俱乐部图片
		int width = bmpTemp.getWidth();				//获得俱乐部图片宽度
		int height = bmpTemp.getHeight();			//获取俱乐部图片高度
		m.postScale(60.0f/width,60.0f/height);		//设置Matrix
		bmpMyClub = Bitmap.createBitmap(bmpTemp, 0, 0, width,height , m, true);		//玩家俱乐部logo
		bmpAIClub = BitmapFactory.decodeResource(r, R.drawable.ai_club);		//AI的俱乐部logo		
		bmpMenu = BitmapFactory.decodeResource(r, R.drawable.menu);//菜单按钮图片
		bmpDialog = BitmapFactory.decodeResource(r, R.drawable.dialog);	//菜单对话框	 
		bmpBackField = BitmapFactory.decodeResource(r, R.drawable.field);//足球场背景
		bmpPassAll = BitmapFactory.decodeResource(r, R.drawable.game_pass);	//打赢所有比赛的提示图片
	}	
	//初始化游戏参数,通关后会调用这个方法,包含initRound方法
	public void initGame(){
		scores[0]=0;		//玩家比分归零
		scores[1]=0;		//AI比分归零
		AIGoalLeft = maxLeftPosition;		//初始化AI的球门左边坐标
		AIGoalRight = maxRightPosition;		//初始化AI的球门右边坐标
		myGoalLeft = maxLeftPosition;		//初始化玩家的球门左边坐标
		myGoalRight = maxRightPosition;		//初始化玩家的球门左边坐标
		initRound();
	}
	//屏幕渲染方法
	protected void doDraw(Canvas canvas) {
		canvas.drawBitmap(bmpBackField, 0, 0, null);		//画球场背景
		//画出小球
		ball.drawSelf(canvas);
		//画出双方玩家
		drawBothPlayers(canvas);
		//画出比分
		drawScores(canvas);
		//检查并绘制活的Bonus
		checkAndDrawBonus(canvas);
		//画出双方的logo
		drawLogo(canvas);
		//画出菜单
		canvas.drawBitmap(bmpMenu, 134, 0, null);
		if(isScoredAGoal){		//如果进了一球,绘制进球图片
			canvas.drawBitmap(bmpGoalBanner, (fieldLeft fieldRight)/2-bmpGoalBanner.getWidth()/2, (fieldUp fieldDown)/2-bmpGoalBanner.getHeight()/2, null);
			timeCounter  ;		//每画一次,计时器增加
			if(timeCounter > 50){	//如果计时器增加到50
				isScoredAGoal = false;		//设置进球标志位为false
				initRound();				//初始化游戏回合
				timeCounter = 0;			//清空计时器
				ball.isPlaying = true;		//小球运动标志位设为true
			}
		}
		if(isGameOver){//一场比赛结束,根据胜负,绘制相应图片	
			if(isGamePassAll){	//是否打赢了最强的AI
				canvas.drawBitmap(bmpPassAll,(fieldLeft fieldRight)/2-bmpPassAll.getWidth()/2, (fieldUp fieldDown)/2-bmpPassAll.getHeight()/2, null);
				timeCounter  ;//每画一次,计时器增加
				if(timeCounter >50){//如果计时器增加到50
					isGameOver = false;					//设置游戏结束标志位为false
					isShowDialog = true;				//设置显示对话框为true				
				}
			}
			else if(isGameWin){			//获得胜利				
				canvas.drawBitmap(bmpLoseBanner, (fieldLeft fieldRight)/2-bmpWinBanner.getWidth()/2, (fieldUp fieldDown)/2-bmpWinBanner.getHeight()/2-20, null);
				canvas.drawBitmap(bmpWinText, (fieldLeft fieldRight)/2-bmpWinText.getWidth()/2, (fieldUp fieldDown)/2-bmpWinText.getHeight()/2, null);
				timeCounter  ;//每画一次,计时器增加
				if(timeCounter >50){//如果计时器增加到50
					isGameOver = false;//设置游戏结束标志位为false
					initGame();			//初始化游戏
					levelUp();			//升级
					timeCounter = 0;	//计时器清零
					ball.isPlaying = true;	//足球运动标志位为true
				}
			}
			else{
				canvas.drawBitmap(bmpLoseBanner, (fieldLeft fieldRight)/2-bmpWinBanner.getWidth()/2, (fieldUp fieldDown)/2-bmpWinBanner.getHeight()/2-20, null);
				canvas.drawBitmap(bmpLoseText, (fieldLeft fieldRight)/2-bmpWinText.getWidth()/2, (fieldUp fieldDown)/2-bmpWinText.getHeight()/2, null);
				timeCounter  ;//每画一次,计时器增加
				if(timeCounter >50){//如果计时器增加到50
					isGameOver = false;					//设置游戏结束标志位为false
					isShowDialog = true;				//设置显示对话框为true				
				}
			}
		}
		if(isShowDialog){
			canvas.drawBitmap(bmpDialog, 60, 200, null);	//画出返回主菜单对话框
		}
	}	
	//把横杆画出来
	public void drawBars(Canvas canvas){
		Paint paint = new Paint();
		paint.setStrokeWidth(2.5f);
		for(int i=0;i<8;i  ){
			canvas.drawLine(fieldLeft, fieldUp barDistance/2 i*barDistance, fieldRight, fieldUp barDistance/2 i*barDistance, paint);
		}
	}
	//方法:初始化球员对象
	public void initPlayerInstance(){
		for(int i=0;i<11;i  ){
			Player p1 = new Player();	//创建一个Player对象
			p1.attackDirection = 0;		//设置球员的进攻方向
			alMyPlayer.add(p1);			//把Player对象添加到玩家的球员集合中
			Player p2 = new Player();	//创建一个Player对象
			p2.attackDirection = 8;		//设置球员的进攻方向
			alAIPlayer.add(p2);			//把Player对象添加到AI的球员集合中
		}
	}
	//方法:根据用户的选择排兵布阵,direction为进攻方向,0为向上,1为向下
	public void initPlayerPositions(ArrayList<Player> al,int [] pos,int direction){
		int index = 0;
		for(int i=0;i<3;i  ){			//一共有3条进攻线
			int playerNumber = pos[i];	//取出每个进攻线上有多少队员
			int segmentNumber = playerNumber   1;		//根据进攻线上的奇偶性分段
			int segmentSpan = (fieldRight - fieldLeft)/segmentNumber;		//求出每段段长
			for(int j=1;j<=playerNumber;j  ){
				Player p = al.get(index  );
				p.x = fieldLeft   j*segmentSpan;
				if(direction == 0){		//进攻方向向上
					p.y = fieldUp   barDistance/2   barDistance*2*(i 1);
				}
				else{					//进攻方向向上
					p.y = fieldDown - barDistance/2 - barDistance*2*(i 1);
				}
			}
		}
		//确定守门员的位置
		Player p = al.get(index);		//守门员为球员列表中的最后一个
		p.x = (fieldLeft   fieldRight)/2;		//守门员的X坐标为球场的
		if(direction == 0){			//如果进攻方向向上
			p.y =  fieldUp   barDistance/2   7*barDistance;
		}
		else{		//如果进攻方向向下
			p.y = fieldUp   barDistance/2;
		}
	}
	//方法:初始化游戏回合,每次进球后调用该方法一次
	public void initRound(){
		//复位小球位置,随机产生方向
		ball.x = (fieldLeft   fieldRight)/2;//指定小球X坐标
		ball.y = (fieldUp   fieldDown)/2;//指定小球Y坐标
		ball.direction = (int)(Math.random()*100)%16;	//随机指定小球的方向
		//复位双方运动员		
		int [] layoutArray = father.layoutArray;		//玩家球员的占位数组
		initPlayerPositions(alMyPlayer,layoutArray,0);		//为己方队员站位
		int [] tempArray2 = {3,3,4};					//AI球员的占位数组		
		initPlayerPositions(alAIPlayer,tempArray2,1);		//为AI方队员站位
	}
	//方法:画足球运动员
	public void drawBothPlayers(Canvas canvas){
		for(Player p:alMyPlayer){	//遍历玩家球员列表
			canvas.drawBitmap(bmpMyPlayer, p.x-playerSize/2, p.y-playerSize/2, null);//绘制球员
		}
		for(Player p:alAIPlayer){		//遍历AI球员列表
			canvas.drawBitmap(bmpAIPlayer, p.x-playerSize/2, p.y-playerSize/2, null);//绘制球员
		}
	}
	//方法:画双方比分
	public void drawScores(Canvas canvas){
		//画左边比分从左往右画
		String score = scores[0] "";	
		int l = score.length();	//获得比分字符串长度
		for(int j=0;j<l;j  ){	//根据字符串内容绘制数字图片
			canvas.drawBitmap(bmpScores[score.charAt(j)-'0'], scoreLeft j*32, 2, null);
		}
		//画右边比分,从右往左画
		String scoreR = scores[1] "";
		int l2 = scoreR.length();//获得比分字符串长度
		for(int i=l2-1;i>=0;i--){//根据字符串内容绘制数字图片
			canvas.drawBitmap(bmpScores[scoreR.charAt(i)-'0'], scoreRight-(l2-i)*32, 2, null);
		}
	}
	//方法:检查并绘制Bonus
	public void checkAndDrawBonus(Canvas canvas){
		if(balForDraw.size() != 0){		//检查是否有可画的Bonus
				for(Bonus b:balForDraw){
					if(b.status == Bonus.LIVE){		//判断Bonus的状态是否为LIVE
						b.drawSelf(canvas);	//画Bonus
					}
					else if(b.status == Bonus.EFFECTIVE){//判断Bonus的状态是否为EFFECTIVE
						b.drawEffect(canvas);		//画Bonus的作用效果
					}					
				}				
		}
		//检查balAdd有没有需要添加的Bonus
		if(balAdd.size() != 0){	//
			balForDraw.addAll(balAdd);		//将balAdd中的Bonus添加到balForDraw中
			balAdd.clear();					//清空balAdd
		}
		//检查balDelete有没有需要删除的Bonus
		if(balDelete.size() != 0){
			balForDraw.removeAll(balDelete);	//从balForDraw删除balDelete中的Bonus
			balDelete.clear();					//清空balDelete
		}
	}
	//方法:画双方俱乐部logo
	public void drawLogo(Canvas canvas){
		canvas.drawBitmap(bmpMyClub, 0, 0, null);		//画玩家俱乐部的图片
		canvas.drawBitmap(bmpAIClub, 240, 0, null);		//画AI俱乐部的图片
	}
	//方法:移动运动员,传入的参数可以为12(左),4(右),如果传入其他则将球员方向设为-1
	public void movePlayers(ArrayList<Player> al,int direction){
		switch(direction){					//对传入的方向参数进行判断
		case 12:			//12为左
			Player pl1 = al.get(al.size()-1);
			if(pl1.x - pl1.movingSpan  >= maxLeftPosition){	//判断是否还能向左走
				for(Player p: al){
					p.x -= p.movingSpan;		//向左移动指定距离
					p.movingDirection = 12;		//记录移动方向
				}				
			}			
			break;
		case 4:			//4为右
			Player pl2 = al.get(al.size()-1);
			if(pl2.x   pl2.movingSpan  <= maxRightPosition){//判断是否还能向右走
				for(Player p: al){
					p.x  = p.movingSpan;		//向右移动指定的距离
					p.movingDirection = 4;		//记录移动方向
				}				
			}	
			break;
		default:		//如果传入的参数既不是4也不是12
			for(Player p: al){
				p.movingDirection = -1;			//将球员的移动方向设为-1
			}
			break;
		}
	}
	//方法:检查是否比赛结束,原则是谁先得到指定分谁就赢
	public void checkIfLevelUp(){
		if(Math.max(scores[0], scores[1]) == winPoint){	//如果两队中有一队的比分达到了胜利点
			isGameOver = true;							//将游戏结束标志位置为true
			if(scores[0] == winPoint){					//判断是否是玩家赢得比赛
				if(this.level >= MaxLevel){		//达到最高等级
					isGamePassAll = true;			//设置游戏打通所有等级标志位
				}
				else{
					isGameWin = true;				//设置比赛胜利标志位
				}				
				if(father.wantSound && father.mpCheerForWin!= null){					//如需要,播放相应声音
					father.mpCheerForWin.start();
				}				
			}
			else{										//是AI赢得比赛
				isGameWin = false;
				if(father.wantSound && father.mpCheerForLose!=null){					//如需要,播放相应声音
					father.mpCheerForLose.start();
				}				
			}
		}
		else{											//如果只是单纯的进了一个球
			isScoredAGoal = true;						//将进球标志位设为true
			if(father.wantSound && father.mpCheerForGoal!=null){						//如需要,播放相应声音
				father.mpCheerForGoal.start();
			}			
		}
	}
	//方法:游戏升级,改变参数增加难度
	public void levelUp(){
		ball.levelUp();	//调用小球升级方法
		for(Player p:alMyPlayer){		//遍历玩家球员列表
			p.levelUp();				//调用玩家的升级方法
		}
		this.level  ;
	}
	@Override
	protected void finalize() throws Throwable {
		System.out.println("############ FieldView  is dead##########");
		super.finalize();
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {		//重写surfaceChanged方法
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {//重写surfaceCreated方法
		if(!dt.isAlive()){
			dt.start();
		}			 
        father.pmt = new PlayerMoveThread(father);//初始化并启动球员的移动处理线程
        father.pmt.start();
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {//重写surfaceDestroyed方法
		dt.isGameOn = false;	//停止刷屏线程的执行
		father.pmt.flag = false;
	}
}


标签: Android 源码 足球

实例下载地址

android 疯狂足球源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警