您的位置:首页 > 编程语言 > Java开发

java小游戏开发,完整版 (初学者正在努力中)

2016-12-21 09:29 323 查看
在公司学习当中,按照任务写了小小游戏,但是不是我的最终想实现的能容,功能也没有完全达到我的要求,由于别的事情,目前不能继续做了,所以只能提前发出来,希望对大家有帮助。。。。。。

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();//打印堆栈信息
}
}
}


}(<a href="http://www.dztcsd.com/">资质代办</a>)

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();
}

}

}


}

作者: 哈哈哈_3 
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: