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){ //是否打赢
评论6
最新资源