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

释放双眼,带上耳机,听听看~!

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

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

    }

}

}

【转自慕课】https://www.imooc.com

JAVA

Eclipse那么多快捷键,这几个你却不一定知道

2022-3-3 13:59:03

JAVA

SpringBoot使用异步线程池实现生产环境批量数据推送

2022-3-3 14:02:18

搜索