关闭

android 游戏 实战打飞机游戏 实现无限循环的背景图(2)

标签: android游戏
1283人阅读 评论(0) 收藏 举报
分类:

分析下游戏界面内的元素 :
无限滚动的背景图, 可以操作的主角,主角的子弹, 主角的血量,两种怪物(敌机),一个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;
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Unity3D游戏开发之连续滚动背景

Unity3D游戏开发之连续滚动背景
  • weini_xiong
  • weini_xiong
  • 2014-04-27 00:19
  • 1987

Unity3D~2D游戏背景的循环滚动

unity3D的2D游戏背景循环滚动制作。
  • zzlyym
  • zzlyym
  • 2016-04-03 14:07
  • 2277

简单粗暴的实现背景图无限循环滚动

先上图,UI说了,这里要做动画,让小车感觉在奔跑的动画。UI的建议是背景图不停的移动,视觉上就是小车不停的在奔跑。那么,怎么实现呢?很简单,可能不是最佳的实现方式,但是很暴力。码代码:public c...
  • qq_28268507
  • qq_28268507
  • 2017-03-24 20:11
  • 1282

android 游戏 实战 打飞机 实现主角以及主角相关元素(3)

先看效果图新建player 类public class Player { private int playerHp = 3; private Bitmap bmpPlayerHP; ...
  • liudao7994
  • liudao7994
  • 2016-05-31 15:37
  • 994

Cocos2d-x 3.x学习笔记:猩先生带你打飞机(四)游戏场景:背景与我机的创建、敌机的创建、物理世界构建

注:未修改版 一、背景与我机的创建 现在我们要创建新的一个场景了。选择开始游戏即从菜单场景跳到游戏场景。现在先完善HelloWorldScene的代码 找到我们开始游戏的回调方法,添加代码: ...
  • Mr_xin321
  • Mr_xin321
  • 2015-03-06 01:42
  • 1525

学习实战三:基于Cocos2d-x引擎模仿微信打飞机游戏

学习Cocos2d-x游戏引擎有一个来月了,这一个来月的时间里,做了两个小游戏,一个是模仿的打地鼠游戏(做了大概十天);另一个是模仿的打飞机游戏(做了五天)。关于前一个,只是在网上下了个叫做疯狂地鼠的...
  • u011894560
  • u011894560
  • 2013-10-17 20:25
  • 1893

Android 打飞机小游戏 cocos2d

从cocos2d官网上下载合适的框架 导入自己的应用程序中。 1、CCDirector:导演类是游戏当中的组织者和领导者,负责调度游戏当中的一切对象和资源;       Director是一个单例...
  • liangdong2014
  • liangdong2014
  • 2015-04-08 19:07
  • 865

cocos2d-x简单游戏<打飞机>代码实现|第四部分:主场景<Helloworld.m>

#include "HelloWorldScene.h" #define WINDOWHEIGHT CCDirector::sharedDirector()->getWinSize().heig...
  • u011286702
  • u011286702
  • 2014-04-06 23:11
  • 2229

简易小游戏(类似打飞机)的简单实现cocos2d-x-2.1.5

之前制作的简单的一个小游戏,整理之后分享一下,
  • Nat_myron
  • Nat_myron
  • 2014-04-08 16:31
  • 2155

android 游戏 实战打飞机游戏 菜单页面(1)

目标 实现 控制 小飞机 左右移动 躲避子弹 打boss.本节 实现 开始菜单界面1 首先 资源文件拷过来2, 划分游戏状态 public static final int GAME_ME...
  • liudao7994
  • liudao7994
  • 2016-05-30 15:22
  • 4155
    个人资料
    • 访问:124524次
    • 积分:2631
    • 等级:
    • 排名:第16040名
    • 原创:131篇
    • 转载:27篇
    • 译文:0篇
    • 评论:87条
    github地址
    博客专栏
    最新评论