Android实战 * 游戏之无限循环的背景图(2)
作者:liudao7994 时间:2023-11-11 23:33:44
首先分析下游戏界面内的元素:
无限滚动的背景图, 可以操作的主角,主角的 * , 主角的血量,两种怪物(敌机),一个boss, boss的 * 效果.
先看效果图
1、首先实现无限滚动的背景图 原理: 定义两个位图对象 当第一个位图到末尾是 第二个位图从第一个位图的末尾跟上.
public class GameBg {
// 游戏背景的图片资源
// 为了循环播放,这里定义两个位图对象,
// 其资源引用的是同一张图片
private Bitmap bmpBackGround1;
private Bitmap bmpBackGround2;
// 游戏背景坐标
private int bg1x, bg1y, bg2x, bg2y;
private int speed = 3;
public GameBg(Bitmap bmpBackGround) {
this.bmpBackGround1 = bmpBackGround;
this.bmpBackGround2 = bmpBackGround;
// 首先让第一张填满屏幕
bg1y = -Math.abs(bmpBackGround.getHeight() - MySurfaceView.screenH);
bg2y = bg1y - bmpBackGround1.getHeight() +50;
}
public void draw(Canvas canvas,Paint paint){
canvas.drawBitmap(bmpBackGround1, bg1x, bg1y, paint);
canvas.drawBitmap(bmpBackGround2, bg2x, bg2y, paint);
}
public void logic(){
bg1y +=speed;
bg2y +=speed;
if(bg1y > MySurfaceView.screenH){
bg1y = bg2y - bmpBackGround1.getHeight() +50;
}
if(bg2y > MySurfaceView.screenH){
bg2y = bg1y - bmpBackGround1.getHeight() +50;
}
}
}
然后再在MySurfaceview里面调用方法
public class MySurfaceView extends SurfaceView implements Callback, Runnable {
private SurfaceHolder sfh;
private Paint paint;
private Thread th;
private boolean flag;
private Canvas canvas;
// 1 定义游戏状态常量
public static final int GAME_MENU = 0;// 游戏菜单
public static final int GAMEING = 1;// 游戏中
public static final int GAME_WIN = 2;// 游戏胜利
public static final int GAME_LOST = 3;// 游戏失败
public static final int GAME_PAUSE = -1;// 游戏菜单
// 当前游戏状态(默认初始在游戏菜单界面)
public static int gameState = GAME_MENU;
// 声明一个Resources实例便于加载图片
private Resources res = this.getResources();
// 声明游戏需要用到的图片资源(图片声明)
private Bitmap bmpBackGround;// 游戏背景
private Bitmap bmpBoom;// * 效果
private Bitmap bmpBoosBoom;// Boos * 效果
private Bitmap bmpButton;// 游戏开始按钮
private Bitmap bmpButtonPress;// 游戏开始按钮被点击
private Bitmap bmpEnemyDuck;// 怪物鸭子
private Bitmap bmpEnemyFly;// 怪物苍蝇
private Bitmap bmpEnemyBoos;// 怪物猪头Boos
private Bitmap bmpGameWin;// 游戏胜利背景
private Bitmap bmpGameLost;// 游戏失败背景
private Bitmap bmpPlayer;// 游戏主角飞机
private Bitmap bmpPlayerHp;// 主角飞机血量
private Bitmap bmpMenu;// 菜单背景
public static Bitmap bmpBullet;// *
public static Bitmap bmpEnemyBullet;// 敌机 *
public static Bitmap bmpBossBullet;// Boss *
public static int screenW;
public static int screenH;
//
private GameMenu gameMenu;
private GameBg gameBg;
/**
* SurfaceView初始化函数
*/
public MySurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
setFocusable(true);
}
/**
* SurfaceView视图创建,响应此函数
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
screenW = this.getWidth();
screenH = this.getHeight();
initGame();
flag = true;
// 实例线程
th = new Thread(this);
// 启动线程
th.start();
}
/**
* 加载游戏资源
*/
private void initGame() {
// 加载游戏资源
bmpBackGround = BitmapFactory
.decodeResource(res, R.drawable.background);
bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom);
bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom);
bmpButton = BitmapFactory.decodeResource(res, R.drawable.button);
bmpButtonPress = BitmapFactory.decodeResource(res,
R.drawable.button_press);
bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck);
bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly);
bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig);
bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin);
bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost);
bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player);
bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp);
bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu);
bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet);
bmpEnemyBullet = BitmapFactory.decodeResource(res,
R.drawable.bullet_enemy);
bmpBossBullet = BitmapFactory
.decodeResource(res, R.drawable.boosbullet);
//菜单类实例化
gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress);
gameBg = new GameBg(bmpBackGround);
}
/**
* 游戏绘图
*/
public void myDraw() {
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);
// 绘图函数根据游戏状态不同进行不同绘制
switch (gameState) {
case GAME_MENU:
gameMenu.draw(canvas, paint);
break;
case GAMEING:
gameBg.draw(canvas, paint);
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
case GAME_PAUSE:
break;
default:
break;
}
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
/**
* 触屏事件监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (gameState) {
case GAME_MENU:
gameMenu.onTouchEvent(event);
break;
case GAMEING:
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
case GAME_PAUSE:
break;
}
return true;
}
/**
* 按键事件监听
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (gameState) {
case GAME_MENU:
break;
case GAMEING:
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
case GAME_PAUSE:
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (gameState) {
case GAME_MENU:
break;
case GAMEING:
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
case GAME_PAUSE:
break;
}
return super.onKeyUp(keyCode, event);
}
/**
* 游戏逻辑
*/
private void logic() {
switch (gameState) {
case GAME_MENU:
break;
case GAMEING:
gameBg.logic();
break;
case GAME_WIN:
break;
case GAME_LOST:
break;
case GAME_PAUSE:
break;
}
}
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* SurfaceView视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
}
标签:Android, , ,游戏
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
JAVA List和Map切割工具详解
2023-01-27 11:32:42
Java求1+2!+3!+...+20!的和的代码
2021-12-16 10:55:23
JavaMail实现带附件的邮件发送
2021-10-21 15:00:09
![](https://img.aspxhome.com/file/2023/9/61919_0s.jpg)
SpringBoot+Nacos+Kafka微服务流编排的简单实现
2023-03-21 10:34:53
![](https://img.aspxhome.com/file/2023/3/72293_0s.jpg)
Java实现AOP功能的封装与配置的小框架实例代码
2022-12-27 10:57:45
C#将PPT文件转换成PDF文件
2022-09-08 20:33:21
Spring boot热部署devtools过程解析
2022-06-21 13:12:09
java编程下字符串的16位,32位md5加密实现方法
2023-07-29 21:34:28
java调用淘宝api联网查询ip归属地
2022-06-11 12:21:20
JAVA中实现原生的 socket 通信机制原理
2021-08-08 03:06:01
![](https://img.aspxhome.com/file/2023/4/60484_0s.png)
Android RecyclerView网格布局示例解析
2023-03-04 00:49:44
![](https://img.aspxhome.com/file/2023/4/117134_0s.png)
Shiro 控制并发登录人数限制及登录踢出的实现代码
2023-09-18 02:03:56
![](https://img.aspxhome.com/file/2023/5/68515_0s.jpg)
Android操作SQLite基本用法
2022-04-28 20:42:02
![](https://img.aspxhome.com/file/2023/7/113277_0s.jpg)
在Android中使用WebSocket实现消息通信的方法详解
2022-06-10 06:26:18
![](https://img.aspxhome.com/file/2023/4/98664_0s.png)
Java保留两位小数的几种写法总结
2022-04-19 06:53:06
Java遍历Map对象的四种方式
2022-05-07 14:30:04
IDEA查看Scala的源码的教程图解
2023-12-13 22:50:45
![](https://img.aspxhome.com/file/2023/6/105946_0s.png)
Spring Cloud升级最新Finchley版本的所有坑
2021-09-02 07:21:51
![](https://img.aspxhome.com/file/2023/3/88593_0s.png)
Flutter添加页面过渡动画实现步骤
2023-08-20 09:06:20
![](https://img.aspxhome.com/file/2023/1/94991_0s.png)
Android自定义View实现钟摆效果进度条PendulumView
2022-07-04 15:50:14
![](https://img.aspxhome.com/file/2023/1/126751_0s.gif)