`
至尊Louis
  • 浏览: 3637 次
  • 性别: Icon_minigender_1
  • 来自: 填写香港或选择
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用OGEngine快速开发Flappy Bird

阅读更多
    《flappy bird》是由来自越南的独立游戏开发者DongNguyen所开发的作品,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。

 

本文将介绍使用OGEngine游戏引擎来做一个类似FlayppyBird 的游戏,游戏创意及资源属原作者所有,这里只做技术学习使用。



一、没图没真相,先来看看截图

     

 

游戏基本上模仿了原版的游戏过程。


二、游戏场景的设计

游戏场景(GameScene)是本游戏的重点,它包括三种元素:
    (1)
主角小鸟
    (2)障碍物水管
    (3)滚动的地板

GameScene所控制的操作:
    (1)游戏状态的表示
    (2)添加小鸟和水管
    (3)分数的实时统计
    (4)碰撞的检测


1、创建小鸟类(BirdSprite)

在整个游戏的过程当中,小鸟有三种不同的状态:
    (1)准备状态(挥动翅膀,不受重力约束)
    (2)飞行状态(飞行过程中,受重力的影响)
    (3)死亡状态(倒地的状态)

 

这里用几个常量来标示小鸟的状态
public static final int STATE_READY = 0;
        public static final int STATE_FLY = 1;
        public static final int STATE_DIE = 2;
小鸟三种状态下的设置:
/**
         * 刷新状态
         * @param state
         */
        public void refreshState(int state) {
                switch (state) {
                case STATE_READY:
                        this.setY(initY);
                        this.setRotation(0);
                        this.animate(180);
                        break;
                case STATE_FLY:
                        this.animate(100);
                        break;
                case STATE_DIE:
                        this.stopAnimation(0);
                        this.setRotation(90);
                        break;
                }
注:①小鸟在准备状态下是恢复初始坐标位置,恢复旋转角度为0,翅膀振动比较慢一些。
       ②小鸟在飞行过程中,翅膀振动快一些。
       ③小脑死亡时停止振动翅膀,旋转角度为90°。



2、创建水管类(BarSprite)

我们知道游戏中,小鸟是不停地由左往右飞,通过层层水管障碍物,事实上,我们只需要让水管和地板由右往左移动就可以实现小鸟由左往右飞的感觉了,呵呵。

 

我们可以使用 PhysicsHandler 来处理水管的移动问题,使得水管一生成的时候就以设定的速度由右往左匀速移动。

 

请看下面的代码:
public BarSprite(float pX, float pY, String pTextureRegionName,boolean isUpBar,
                        VertexBufferObjectManager pVertexBufferObjectManager) {
                super(pX, pY, pTextureRegionName, pVertexBufferObjectManager);

                this.isUpBar = isUpBar;
                mPhysicsHandler = new PhysicsHandler(this);
                this.registerUpdateHandler(mPhysicsHandler);
                // 设置移动方向和速度 
                mPhysicsHandler.setVelocityX(-150);
        }
        
        /**
         * 停止移动
         */
        public void stopMove(){
                this.unregisterUpdateHandler(mPhysicsHandler);
        }


3、创建地板类(FloorSprite)

    地板类主要是要实现控制地板的循环滚动状态。
public class FloorSprite extends AnimatedSprite {
        /** 视差值 **/
        private float mParallaxValue;
        /** 视差移动的因数 **/
        private float mParallaxFactor = 5;
        /** 每秒改变的视差值 **/
        private float mParallaxChangePerSecond;
        public void setParallaxChangePerSecond(float mParallaxChangePerSecond) {
                this.mParallaxChangePerSecond = mParallaxChangePerSecond;
        }
        public FloorSprite(float pX, float pY, String pTextureRegionName,
                        float mParallaxChangePerSecond,
                        VertexBufferObjectManager pVertexBufferObjectManager) {
                super(pX, pY, pTextureRegionName, pVertexBufferObjectManager);
                this.mParallaxChangePerSecond = mParallaxChangePerSecond;
        }
        @Override
        protected void onManagedUpdate(float pSecondsElapsed) {
                super.onManagedUpdate(pSecondsElapsed);
                // LogUtil.d("onManagedUpdate pSecondsElapsed-->"+pSecondsElapsed);
                this.mParallaxValue += this.mParallaxChangePerSecond * pSecondsElapsed;
        }
        @Override
        protected void onManagedDraw(GLState pGLState, Camera pCamera) {
                pGLState.pushModelViewGLMatrix();
                {
                        final float cameraWidth = pCamera.getWidth();
                        final float shapeWidthScaled = this.getWidthScaled();
                        float baseOffset = (mParallaxValue * this.mParallaxFactor)
                                        % shapeWidthScaled;

                        while (baseOffset > 0) {
                                baseOffset -= shapeWidthScaled;
                        }
                        pGLState.translateModelViewGLMatrixf(baseOffset, 0, 0);
                        float currentMaxX = baseOffset;
                        do {
                                super.onManagedDraw(pGLState, pCamera);
                                pGLState.translateModelViewGLMatrixf(shapeWidthScaled, 0, 0);
                                currentMaxX += shapeWidthScaled;
                        } while (currentMaxX < cameraWidth);
                }
                pGLState.popModelViewGLMatrix();
        }
}


4、添加小鸟

前面简单地封装了一下小鸟精灵类,在游戏场景类GameScene里添加小鸟及改变小鸟状态就比较简单了。

 

birdSprite = new BirdSprite(120, 370, pVertexBufferObjectManager);
                birdSprite.setZIndex(pZIndex_middle);
                birdSprite.refreshState(game_state);
                birdSprite.setScale(1.2f);
                this.attachChild(birdSprite);


5、添加水管

我们知道,水管在游戏中是源源不断地,水管的添加,主要是通过createBars(float pX) 来生成,每隔一段时间生产上下一对水管,中间留有小鸟通过的缝道。
/**
         * 创建一对bars
         * @param pX
         */
        private void createBars(float pX) {
                float pY = -new Random().nextInt(300);

                BarSprite upSprite = new BarSprite(pX, pY, Res.BAR_UP, true,
                                pVertexBufferObjectManager);
                BarSprite downSprite = new BarSprite(pX, upSprite.getBottomY() + 165,
                                Res.BAR_DOWN, false, pVertexBufferObjectManager);
                this.attachChild(upSprite);
                this.attachChild(downSprite);
                barSprites.add(upSprite);
                barSprites.add(downSprite);

                this.sortChildren();

        }
我们可以通过TimerHandler每隔一段时间创建一对水管。

 

mTimerHandler = new TimerHandler(pTimerSeconds, true,
                                new ITimerCallback() {

                                        @Override
                                        public void onTimePassed(TimerHandler pTimerHandler) {
                                                createBars(480);

                                        }
                                });



三、小鸟物理效果以及碰撞检测的设计

我们知道,游戏的一大特点就是玩家每点击一下小鸟就会飞高一点,不点击小鸟就会受到重力效果以一定的加速度往下掉。

 

我们使用OGEngine 引擎集合的Box2D功能,很容易地就可以实现这一的效果。

 

1、为小鸟添加物理效果

 

/**
         * 初始化物理效果
         */
        private void initPhysics() {
                this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, 50), false);
                // 参数 :密度、弹力、摩擦力
                FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0.0f, 0.0f);
                
                Body birdBody = PhysicsFactory.createBoxBody(mPhysicsWorld, birdSprite,
                                BodyType.DynamicBody, FIXTURE_DEF);
                birdSprite.setBody(birdBody);
                this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(birdSprite,
                                birdBody, true, true));
        }

 

2、在小鸟飞行的状态中,每点击一次屏幕小鸟会有一个向上的速度。
birdSprite.getBody().setLinearVelocity(0, -15); 这样就可以为小鸟设置一个向上的速度。
@Override
        public boolean onSceneTouchEvent(TouchEvent pSceneTouchEvent) {
                if (pSceneTouchEvent.isActionDown()) {

                        if (game_state == STATE_READY) {
                                gameStart();
                        }
                        if (!birdSprite.isCollisionFloor() && !birdSprite.isCollisionBar()) {
                                
                                if(birdSprite.getY()>0){
                                        // 不能飞过顶部
                                        birdSprite.getBody().setLinearVelocity(0, -15);
                                        // 播放音效
                                        SoundRes.playSound(SOUND_WING);
                                }
                        }
                }
                return super.onSceneTouchEvent(pSceneTouchEvent);
        }

 

3、检测碰撞

 

我们通过注册一个 IUpdateHandler 不停地监听小鸟跟水管或者地板有没发生碰撞,并根据实际情况做对应的逻辑处理。
/**
         * 不停检测用的 handler
         */
        private IUpdateHandler checkHandler = new IUpdateHandler() {

                @Override
                public void reset() {

                }
                @Override
                public void onUpdate(float pSecondsElapsed) {
                        // LogUtil.d("onUpdate--->"+pSecondsElapsed);
                        if (game_state == STATE_FLY) {
                                // 小鸟旋转
                                rotateBird();
                                if (!birdSprite.isCollisionBar() && isCollidesWithBar()) {
                                        birdSprite.setCollisionBar(true);
                                        // 停止水管的生成和移动
                                        barOver();
                                        
                                        // 播放音效
                                        SoundRes.playSound(SOUND_HIT);
                                        
                                }
                                // 小鸟是否碰撞到地板或者水管
//                                if (birdSprite.collidesWith(mFloorSprite) && !birdSprite.isCollisionFloor()) {
                                if ( !birdSprite.isCollisionFloor()&&isContact(birdSprite, mFloorSprite)) {
                                        birdSprite.setCollisionFloor(true);
                                        if(!birdSprite.isCollisionBar()){
                                                // 停止水管的生成和移动
                                                barOver();
                                                // 播放音效
                                                SoundRes.playSound(SOUND_HIT);
                                        }
                                        // 游戏结束
                                        gameOver();
                                }
                                // 迭代器遍历bar集合
                                Iterator<BarSprite> iterator = barSprites.iterator();
                                while (iterator.hasNext()) {
                                        BarSprite barSprite = iterator.next();
                                        // 检测小鸟是否通过水管
                                        if(barSprite.isUpBar() && !barSprite.isPass()){
                                                if(barSprite.getCentreX()<birdSprite.getX()){
                                                        barSprite.setPass(true);
                                                        score++;
                                                        updateScore(score);
                                                }

 

4、小鸟角度旋转逻辑
     小鸟在上飞或者下飞的情况下会有不同的角度,这个我们可以根据小鸟的Y速度调试出来。
/**
         * 小鸟角度旋转逻辑
         */
        private void rotateBird(){
                float speed_y = birdSprite.getBody().getLinearVelocity().y;
                
                float pRotation  = Math.min(Math.max(-30, (speed_y*4f)-45), 90);
                
                birdSprite.getBody().setRotation(pRotation);
        }


四、分数的处理

分数的处理比较简单,主要用到OGEngine 的 Text 类,以及安卓子身的SharedPreferences来保存每次的最高纪录即可。
<font color="#000000">public class SharedUtil {

        private static final String Shared_System = "Shared_og";

        private static final String BEST_SCORE = "best_score";

        public static void setBestScore(Context pContext, int pBestScore) {
                Editor edit = pContext.getSharedPreferences(Shared_System,
                                Context.MODE_PRIVATE).edit();
                edit.putInt(BEST_SCORE, pBestScore);
                edit.commit();
        }

        public static int getBestScore(Context context) {
                return context
                                .getSharedPreferences(Shared_System, Context.MODE_PRIVATE)
                                .getInt(BEST_SCORE, 0);
        }</font>
好了,分析就到这里,更多细节请各位自下载游戏源码研究: http://www.ogengine.com/download/doc.jsp

 

分享到:
评论

相关推荐

    unity 开发 flappy bird 源码和资源包

    unity 开发 flappy bird 源码和资源包,完整 可运行

    flappybird全套图片+音效

    本篇文章将深入剖析Flappy Bird的全套图片和音效,帮助你更好地理解游戏素材在游戏开发中的应用。 首先,我们来看看“gfx”文件夹,这是图形资源的集合。在Flappy Bird中,图像素材包括游戏背景、角色、管道、得分...

    flappybird图像音频资源包

    总的来说,"flappybird图像音频资源包"提供了开发类似《Flappy Bird》小游戏所需的关键素材,不仅包括游戏的核心视觉元素,还有增强游戏体验的音频效果。通过分析和利用这些资源,开发者能够更深入地理解游戏设计和...

    使用unity开发flappy bird游戏

    使用unity开发flappy bird游戏,实现了一个完整的Flappy Bird游戏的开发过程,包括游戏的开始、游戏进行的音效、计分、记录最高分以及游戏的终结等功能。该资源包括flappy bird游戏的完整代码,对应的文档以及录制的...

    FlappyBird素材.zip

    《flappy bird》是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红。2014年2月,《Flappy Bird》被开发者本人从苹果及谷歌应用商店撤下。2014年8月份正式...

    FlappyBird源码-java

    通过学习Flappy Bird的Java源码,开发者不仅可以掌握基础的游戏开发技能,还能了解如何利用Java实现游戏逻辑、图形渲染、用户交互等多个方面。这个过程对于提升Java编程能力和游戏设计思维具有极大的帮助。

    Flappy bird资源.zip

    Unity引擎支持C#编程语言,因此在开发Flappy Bird这样的游戏时,我们通常会使用C#编写游戏逻辑。例如,创建一个Bird类来管理小鸟的移动、跳跃和碰撞检测;使用Rigidbody2D组件处理物理行为;设置Trigger或Collider来...

    Flappy Bird 源代码 贴图 以及 音效

    《Flappy Bird源代码、贴图与音效详解——Unity游戏开发深度剖析》 Flappy Bird,这款在2014年风靡全球的小游戏,以其简单却极具挑战性的玩法吸引了无数玩家。对于长安大学的学生,尤其是那些正在学习游戏动画开发...

    flappyBird素材包

    《Flappy Bird游戏素材解析与应用》 Flappy Bird是一款风靡全球的休闲游戏,以其简单易上手的操作和极具挑战性的玩法深受玩家喜爱。在本文中,我们将深入探讨这款游戏中的一些关键素材,并通过提供的压缩包文件,...

    app inventor开发Flappy bird小游戏(北邮移动应用开发实验)

    本篇文章将深入探讨如何使用App Inventor开发经典游戏Flappy Bird,并通过分析压缩包内的五个实验文件,逐步揭示游戏的实现过程。 首先,我们要理解App Inventor的工作原理。它是基于积木式编程理念,用户可以通过...

    OpenCv制作的FlappyBird

    综上所述,"OpenCv制作的FlappyBird"项目展示了OpenCV在游戏开发中的创新应用,结合了图像处理、物体检测、机器学习等多个方面的知识,是学习和实践OpenCV技术的一个有趣案例。通过深入研究项目源码、观看成果视频并...

    flappy bird素材及源码

    Flappy Bird是一款简单却极具挑战性的移动平台游戏,由越南开发者Dong Nguyen开发。它以其独特的游戏机制和极高的难度在全球范围内引起了热潮。在这里,我们拥有的是自己制作的Flappy Bird游戏的完整源码以及相关的...

    flappy bird制作资源素材

    总结,Flappy Bird的制作资源素材包为游戏开发者提供了制作此类游戏的基础元素,通过理解和运用这些素材,开发者可以快速构建出类似的游戏框架,并在此基础上进行创新和个性化设计。无论你是初学者还是经验丰富的...

    FlappyBird 素材

    《Flappy Bird游戏开发:深度解析素材与学习资源》 Flappy Bird,这款看似简单却让人上瘾的小游戏,自2013年发布以来,就吸引了无数玩家和开发者的眼球。它的成功在于其直观的操作方式和极具挑战性的游戏机制。本篇...

    FlappyBird游戏源码

    通过对FlappyBird的cocos2dx和Unity版源码的解析,我们可以了解到游戏开发的基本流程和关键技术,同时也能看到不同开发工具的特性与优劣。无论是选择cocos2dx还是Unity,都需要开发者具备扎实的编程基础和良好的问题...

    flappy_bird 素材资源

    通过这些素材,你可以尝试使用Scratch来复刻或者创新Flappy Bird游戏。 1. **背景资源**:游戏中,背景通常是循环播放的图像,为玩家营造出一种飞行的感觉。Flappy Bird的背景通常包括蓝天白云或城市景观,这些图像...

    FlappyBird实训报告.docx

    本实训报告详细阐述了基于Android平台的《FlappyBird》小游戏的开发过程,旨在提升学员在移动游戏开发和多媒体技术应用方面的能力。游戏设计简单,玩家通过点击屏幕控制小鸟飞行,避开不断出现的固定间距管道,得分...

    FlappyBird美术及音频资源

    经典网红游戏FlappyBird美术及音频素材下载,包含音频和图片素材,仅用于学习和交流。Godot版FlappyBird开发教程CSDN地址:https://blog.csdn.net/ttm2d/article/details/104516098

    FlappyBird素材包

    这些元素在素材包中都有所体现,具体文件名为“flappybird”。 1. **小鸟素材**:小鸟的动画通常包含飞翔、上升、下降等状态,这些状态的变化构成了游戏的主要动态效果。开发者需要将这些帧动画合理地集成到游戏中...

    flappybird图片+音效

    flappybird游戏资源,图片+音效

Global site tag (gtag.js) - Google Analytics