在公司学习当中,按照任务写了小小游戏,但是不是我的最终想实现的能容,功能也没有完全达到我的要求,由于别的事情,目前不能继续做了,所以只能提前发出来,希望对大家有帮助。。。。。。
package com.example.amu;
public class ScoreThread extends Thread {
GameView gameView;//GameView 的引用
int highest=60; //胜利值,游戏的最高得分
public boolean flag=true; //线程释放执行的标志位
public ScoreThread(GameView gameView) { //构造器
this.gameView=gameView;
// TODO Auto-generated constructor stub
}
public void run() {
while(flag){
//gameView.score++;//得分增加
if(gameView.score==highest){ //判断时间是否达到胜利时间
gameView.status=3; //游戏胜利
//gameView.scoreThread.stop();
gameView.scoreThread.flag=false; //停止TimeThread执行
gameView.coinThread.flag=false; //停止coinThread执行
}
try {
Thread.sleep(1000); //休眠1S
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
-
*/
package com.example.amu;
import java.security.PublicKey;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
public static int run_flag = 0; //硬币运动的标志位,等于0时运动
/*声明该项目开发过程中用到的变量*/
MainActivity mainActivity; //activity 的引用
ScoreThread scoreThread; //TimeThread的引用
CoinGoThread coinThread; //CoinGoThread的引用
int screenWidth=480; //屏幕宽
int screenHeight=700;//屏幕高
int carWidth=40; //负责接硬币的小车的宽
int carHeight=10;//负责接硬币的小车的高
int bottomSpance=20;//低下空白
//int coinSize=16;
int carSpan=5; //小车步进
int coinSpan=8; //硬币步进
int coinSize=16;//硬币的尺寸
int hintWidth=100;//提示宽度
int hintHeight=20;//提示高度
/*记录游戏的状态变量 0->等待开始,1->进行中,2->游戏结束,3->游戏胜利*/
int status=0;
int score=0;//得分
int coinx;//硬币的X坐标
int coiny;//硬币的Y坐标
int carx;//负责接硬币的小车的X坐标
int cary;//负责接硬币的小车的Y坐标
int richManX;//土豪的X坐标
int richManY; //土豪的Y坐标
int richManSpan=5; //土豪的移动速度
int richManWidth=20; //土豪的宽度
int richManHeight=20; //土豪的高度
int scoreWith=32;//数字图片的宽度
Bitmap [] iscore=new Bitmap[10]; //得分图片组的声明
Bitmap icoin;//硬币图片的声明
Bitmap icar;//小车的声明
Bitmap iRichMan; //土豪的声明
Bitmap ibegin; //开始图片的声明
Bitmap igameover;//游戏结束图片的声明
Bitmap iwin;//游戏胜利图片的声明
Bitmap iexit;//退出游戏图片的声明
Bitmap ireplay;//重玩游戏图片的声明
GameViewDrawThread gameViewDrawThread; //构造方法,对图片资源初始化
int direction=0;
private int backSize=16;
private Bitmap iback;
private int x;
public GameView(MainActivity mainActivity) {
super(mainActivity);
getHolder().addCallback(this); //注册接口
this.mainActivity=mainActivity;
initBitmap(); //调用初始化常用方法
gameViewDrawThread=new GameViewDrawThread(this);//启动后台刷屏线程
}
public void initBitmap() {//初始化图片资源的方法
/*对score图片组的初始化===========开始*/
iscore[0] = BitmapFactory.decodeResource(getResources(), R.drawable.d0);
iscore[1] = BitmapFactory.decodeResource(getResources(), R.drawable.d1);
iscore[2] = BitmapFactory.decodeResource(getResources(), R.drawable.d2);
iscore[3] = BitmapFactory.decodeResource(getResources(), R.drawable.d3);
iscore[4] = BitmapFactory.decodeResource(getResources(), R.drawable.d4);
iscore[5] = BitmapFactory.decodeResource(getResources(), R.drawable.d5);
iscore[6] = BitmapFactory.decodeResource(getResources(), R.drawable.d6);
iscore[7] = BitmapFactory.decodeResource(getResources(), R.drawable.d7);
iscore[8] = BitmapFactory.decodeResource(getResources(), R.drawable.d8);
iscore[9] = BitmapFactory.decodeResource(getResources(), R.drawable.d9);
/*对score图片组的初始化===========结束*/
iback = BitmapFactory.decodeResource(getResources(), R.drawable.back);
/*对游戏开始,游戏结束,胜利,重玩游戏以及退出游戏图片的初始化===========开始*/
ibegin = BitmapFactory.decodeResource(getResources(), R.drawable.begin);
igameover = BitmapFactory.decodeResource(getResources(), R.drawable.gameover);
iwin = BitmapFactory.decodeResource(getResources(), R.drawable.win);
iexit = BitmapFactory.decodeResource(getResources(), R.drawable.exit);
ireplay = BitmapFactory.decodeResource(getResources(), R.drawable.replay);
/*对游戏开始,游戏结束,胜利,重玩游戏以及退出游戏图片的初始化===========结束*/
//对硬币图片的初始化
icoin=BitmapFactory.decodeResource(getResources(), R.drawable.coin);
//对小车图片的初始化
icar=BitmapFactory.decodeResource(getResources(), R.drawable.car);
//对土豪图片的初始化
/*切忌drawable里面的资源名字必须小写或者数字,不能大写,不然R.java文件不能自动添加id,导致运行不稳定,*/
iRichMan=BitmapFactory.decodeResource(getResources(), R.drawable.richman);
initCoinAndCar(); //初始化硬币和小车的位置的方法
}
public void initCoinAndCar() {//初始化硬币和小车的位置的方法
coiny= 10; /*screenHeight-bottomSpance-carHeight-coinSize;*/ //计算硬币的y坐标
//硬币的x坐标为10~screenWith之间的随机数
coinx=screenWidth/2-carWidth/2; //(int) ((screenWidth-10)*Math.random())+10;
carx=screenWidth/2-carWidth/2; //计算小车的x坐标
cary=screenHeight-bottomSpance-carHeight;//计算小车的y坐标
richManX=screenWidth/2-carWidth/2-richManWidth-coinSize/2; //土豪的X坐标初始位置
richManY=10-richManHeight/2; //土豪的Y坐标
}
/*replay()方法功能是清除上次一轮游戏留下的数据*/
public void replay() {
if(status==2 || status==3){
coinSpan=8; //初始化硬币的速度
//2->游戏结束,3->游戏胜利*/
initCoinAndCar();//初始化硬币和小车的位置的方法
//score=0; //清零得分,在这里清零没有办好让玩家失败后看到成绩
run_flag=0; //
}
}
public void Automatic_replay() { //当小车接住硬币时调用这个方法,自动重新开始,
//但是不会把数据清零
/*这块调整成绩达到一定值后,更改硬币的下落速度 */
if(score>=2)
coinSpan=10;
if(score>=4)
coinSpan=20;
if(score>=6)
coinSpan=30;
if(score>=8)
coinSpan=40;
if(score>=10)
coinSpan=45;
if(score>=15)
coinSpan=50;
if(score>=20)
coinSpan=60;
//coiny= 10; /*screenHeight-bottomSpance-carHeight-coinSize;*/ //计算硬币的y坐标
//硬币的x坐标为10~screenWith之间的随机数
int random=(int) ((screenWidth-10)*Math.random())+10;
while(random>460 ||random<20){
random=(int) ((screenWidth-10)*Math.random())+10;
}
//richManX=random-richManWidth-coinSize/2;
richManY=10-richManHeight/2;
coiny= 20;
//coinx=random;
coinx=coinThread.father.richManX+15;
carx=x;///screenWidth/2-carWidth/2; //计算小车的x坐标
cary=screenHeight-bottomSpance-carHeight;//计算小车的y坐标
//initCoinAndCar();//初始化硬币和小车的位置的方法
coinThread.flag=true;
run_flag=0;
status=0; //
status=1;
}
/*绘制游戏界面的方法*/
@SuppressLint("WrongCall") public void doDraw(final Canvas canvas) {
//1.绘画背景
super.onDraw(canvas);
//清背景
int cols=screenWidth/backSize+((screenWidth%backSize==0)?0:1);//列数
int rows=screenHeight/backSize+((screenHeight%backSize==0)?0:1);//行数
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
canvas.drawBitmap(iback, 16*j,16*i, null);
}
}
//绘制游戏得分的整体图片
String scoreString=score+"";
int loop=3-scoreString.length();
//通过循环在分值得前面填加0,构成三位数得分图片组
for (int i = 0; i < loop; i++) {
scoreString="0"+scoreString;
}
//计算得分图片组绘制的开始x坐标
int startX=screenWidth-scoreWith*3-10;
for (int i = 0; i < 3; i++) {
//通过ASCII码计算,得出绘制的图片
int tempScore=scoreString.charAt(i)-'0';
canvas.drawBitmap(iscore[tempScore], startX+i*scoreWith, 5, null);
}
/*绘制硬币的图*/
canvas.drawBitmap(icoin, coinx, coiny, null);
//canvas.drawBitmap(icoin, coinx, coiny, null);
//绘制接硬币的小车
canvas.drawBitmap(icar, carx, cary-bottomSpance, null);
//绘制土豪
canvas.drawBitmap(iRichMan, richManX, richManY, null);
//绘制开始按钮,,,
/*记录游戏的状态变量 0->等待开始,1->进行中,2->游戏结束,3->游戏胜利*/
if(status==0){ //游戏处于等待状态,绘制开始按钮
canvas.drawBitmap(ibegin, screenWidth/2-hintWidth/2,
screenHeight/2-hintHeight/2, null);
}
//绘制失败图片
if(status==2){ //游戏结束的情况下,绘制失败图片
canvas.drawBitmap(igameover,screenWidth/2-hintWidth/2,
screenHeight/2-hintHeight/2, null);
}
//绘制胜利图片
if(status==3){ //游戏胜利的情况下,绘制胜利图片
canvas.drawBitmap(iwin,screenWidth/2-hintWidth/2,
screenHeight/2-hintHeight/2, null);
}
//绘制退出按钮,一直显示
canvas.drawBitmap(iexit,screenWidth-50,screenHeight/2,null);
//绘制重玩 按钮
if(status==2||status==3){//当游戏结束或者游戏胜利时绘制重玩按钮
canvas.drawBitmap(ireplay ,10,screenHeight/2,null);
}
}
@Override
//处理玩家点击屏幕的事件
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
x = (int) event.getX(); //获取被点击的x坐标
int y = (int) event.getY(); //获取被点击的y坐标
if(x<screenWidth && x>screenWidth-50 &&
y<screenHeight/2+20 && y>screenHeight/2){ //按下退出按钮
System.exit(0); //退出程序
}
if(status==0){ //游戏处于等待状态,按下屏幕任意地方,游戏会开始
status=1; //设置游戏进行状态
scoreThread=new ScoreThread(this); //创建新的计时线程
coinThread=new CoinGoThread(this); //创建新的CoinGoThread线程
scoreThread.start(); //启动线程
coinThread.start();
}
else if(status==1){ //游戏处于进行状态
/*分开处理触摸的时间*/
switch (event.getAction()) {
/*点屏幕*/
case MotionEvent.ACTION_DOWN :
carx=x;
break;
/*移动位置*/
case MotionEvent.ACTION_MOVE :
carx=x;
break;
/*离开屏幕*/
case MotionEvent.ACTION_UP :
carx=x;
break;
default:
break;
}
//carx=x; //移动小车的位置
}
else if(status==2 || status==3){ //游戏失败或者胜利的状态下
if(x<45 && x>0 && y<screenHeight/2+20 && y>screenHeight/2){//按下重玩按钮
status=0;
score=0; //在这里使清零得分会有助于玩家失败是看到自己的成绩
replay(); //调用重置的方法重新玩游戏
}
}
return super.onTouchEvent(event);
}
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public GameView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override //主要处理当Surface的尺寸发生变化时需要执行的代码放置在此处
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override //当Surface被创建后,将需要执行的代码放置在此处
public void surfaceCreated(SurfaceHolder arg0) { //创建时启动相应的线程
this.gameViewDrawThread.flag=true;
gameViewDrawThread.start();
// TODO Auto-generated method stub
}
@Override //当Surface被移除当前显示屏幕时回调的方法的代码放置在此处
public void surfaceDestroyed(SurfaceHolder arg0) { //摧毁释放相应的进程
boolean retry=true;
this.gameViewDrawThread.flag=false;
while(retry){
try {
gameViewDrawThread.join();
retry=false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// TODO Auto-generated method stub
}
}
package com.example.amu;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
public class GameViewDrawThread extends Thread{
boolean flag = true;
int sleepSpan = 100;
GameView gameView;
SurfaceHolder surfaceHolder;
public GameViewDrawThread(GameView gameView){
this.gameView = gameView;
this.surfaceHolder = gameView.getHolder();
}
public void run(){
Canvas c;
while (this.flag) {
c = null;
try {
// 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
c = this.surfaceHolder.lockCanvas(null);
synchronized (this.surfaceHolder) {
gameView.doDraw(c);//绘制
}
} finally {
if (c != null) {
//并释放锁
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
try{
Thread.sleep(sleepSpan);//睡眠指定毫秒数
}
catch(Exception e){
e.printStackTrace();//打印堆栈信息
}
}
}
}
package com.example.amu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
public class MainActivity extends Activity {
GameView gameView; //GameView 的引用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE); ///设置为无标题
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
//WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
gameView=new GameView(this); //创建GameView
setContentView(gameView);
WindowManager wm = this.getWindowManager();
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
package com.example.amu;
public class ScoreThread extends Thread {
GameView gameView;//GameView 的引用
int highest=60; //胜利值,游戏的最高得分
public boolean flag=true; //线程释放执行的标志位
public ScoreThread(GameView gameView) { //构造器
this.gameView=gameView;
// TODO Auto-generated constructor stub
}
public void run() {
while(flag){
//gameView.score++;//得分增加
if(gameView.score==highest){ //判断时间是否达到胜利时间
gameView.status=3; //游戏胜利
//gameView.scoreThread.stop();
gameView.scoreThread.flag=false; //停止TimeThread执行
gameView.coinThread.flag=false; //停止coinThread执行
}
try {
Thread.sleep(1000); //休眠1S
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
热门评论
这就叫天赋。。。。。
0.0这就是初学者???刚学完java第一季的菜鸡只能膜拜了