`
archy123
  • 浏览: 28731 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

libgdx学习笔记系列(四) Action动作及游戏开发的“MVC”

阅读更多
这篇笔记少写点。
因为学习到现在我发现了一个重要的问题。
问题稍后再说,先让我那个原地跑的小人会自己在屏幕中跑动吧。
查看官方开发者手册,按照示例写吧。然后被作者坑了。好像手册好久没更新了。(估计作者顾不上),我完全找不到手册中的方法。你妹的 ,还是直接API吧。先看下Actions类的API
长长的一串静态方法。好了,我也不贴API的东西了。大家可以自己去看。
大概看了下,其实主要三类action
关于动画的action,综合的action,还有一些其他的action
然后主要的就是对这些action的控制的一些类。

找找控制移动的Action,我看到了个MoveToAction,OK直接去源码看看
/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.scenes.scene2d.actions;

/** Moves an actor from its current position to a specific position.
 * @author Nathan Sweet */
public class MoveToAction extends TemporalAction {
	private float startX, startY;
	private float endX, endY;

	protected void begin () {
		startX = actor.getX();
		startY = actor.getY();
	}

	protected void update (float percent) {
		actor.setPosition(startX + (endX - startX) * percent, startY + (endY - startY) * percent);
	}

	public void setPosition (float x, float y) {
		endX = x;
		endY = y;
	}

	public float getX () {
		return endX;
	}

	public void setX (float x) {
		endX = x;
	}

	public float getY () {
		return endY;
	}

	public void setY (float y) {
		endY = y;
	}
}



Moves an actor from its current position to a specific position
把一个演员从当前位置移动到一个指定的位置。找对了。就是我们需要的。
估计大家看方法名称就可以看出作用了。begin,end神马的。

好了修改下create的方法
    @Override
    public void create() {
        //加载字体文件从电脑上拷贝的华文琥珀字体,当然你可以使用任意一种中文字体。
        FreeTypeFontGenerator freeTypeFontGenerator =
                new FreeTypeFontGenerator(Gdx.files.internal("data/font/STHUPO.TTF"));

        //关于字体的一些配置参数,详细的可以看官方API和FreeTypeFontGenerator的源码
        FreeTypeFontGenerator.FreeTypeFontParameter fontParameter =
                new FreeTypeFontGenerator.FreeTypeFontParameter();

        //注意这不是我们要显示的文字,其实相当于我们上篇使用的文字工具编辑的字符串内容,
        // 这里是默认的字符串加上了我们要使用的汉字。
        fontParameter.characters = FreeTypeFontGenerator.DEFAULT_CHARS + "你好";

        //根据参数设置生成的字体数据,这就相当于上篇的myfont.fnt文件和myfont.png
        FreeTypeFontGenerator.FreeTypeBitmapFontData fontData =
                freeTypeFontGenerator.generateData(fontParameter);

        //及时释放资源,避免内存泄漏,因为中文字体文件一般都比较大
        freeTypeFontGenerator.dispose();

        //从字面看,其实也是加载的图片
        bitmapFont = new BitmapFont(fontData, fontData.getTextureRegions(), false);
        batch = new SpriteBatch();

        texture = new Texture(Gdx.files.internal("data/image/girl.png"));
        Texture[] girlTextures = new Texture[16];
        //加载人物动作的16幅图片
        for (int i = 0; i < 16; i++) {
            girlTextures[i] = new Texture(Gdx.files.internal("data/image/" + (i + 1) + ".png"));
        }
        //初始化演员类
        GirlActor girlActor = new GirlActor(girlTextures);
        girlActor.setPosition(0,0);
        //初始化舞台,舞台大小为屏幕大小
        stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);

        //黑色显示
        Label.LabelStyle labelStyle = new Label.LabelStyle(new BitmapFont(), Color.BLACK);
        //显示内容
        fps = new Label("FPS:", labelStyle);
        fps.setName("fps");
        //显示在左上角位置,减去显示字体的高度,要不然会跑到屏幕外面,根本看不到
        fps.setY(Gdx.graphics.getHeight() - fps.getHeight());
        fps.setX(0);

        //初始化下,反正是静态的,直接赋值吧,直接跑到屏幕右边,别忘了减去人物的宽度。要不然跑没影了。
        //最后一个参数跑到目的地需要的时间,时间越短,移动越快
        MoveToAction moveTo = Actions.moveTo(Gdx.graphics.getWidth()-texture.getWidth(), 0, 5);
        // SequenceAction是顺序执行,并且可以执行多个action,我们现在先让她跑到右边,然后倒退回起点
        //往回跑
        MoveToAction goBack = Actions.moveTo(0, 0, 5);
        //先执行跑到右边的action,然后执行跑回来的action
        SequenceAction sequenceAction = Actions.sequence(moveTo,goBack);
        sequenceAction.setActor(girlActor);

        //无限循环不停来回跑
        RepeatAction repeatAction = Actions.repeat(RepeatAction.FOREVER,
                sequenceAction);


        girlActor.addAction(repeatAction);
        //把演员放入舞台
        stage.addActor(girlActor);
        stage.addActor(fps);

    }

因为action类主要作用是改变演员的一些状态,它不会自动帮我们把人物从左边移动到右边,所以我们还需要修改下演员类。注释都写的很清楚了。就不解释了。
package com.me.mygdxgame;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;


public class GirlActor extends Actor {
    TextureRegion[] girlRegion;
    float stateTime;
    //当前帧
    TextureRegion currentFrame;
    Animation animation;

    public GirlActor(Texture[] texture) {
        girlRegion = new TextureRegion[16];
        //把Texture转换下
        for (int i = 0; i < 16; i++) {
            girlRegion[i] = new TextureRegion(texture[i]);
        }
        //动画播放,参数为动画播放速度。和纹理数组
        //0.06*16=0.96 大概就是1秒钟播放完这个动画。
        animation = new Animation(0.06f, girlRegion);
    }


    @Override
    public void draw(Batch batch, float parentAlpha) {

        stateTime += Gdx.graphics.getDeltaTime();
        //下一帧
        currentFrame = animation.getKeyFrame(stateTime, true);
        //2,3参数还记得吧,就是我注释掉的下边的代码,这个帧绘制的位置信息。我们现在修改为实时获取演员位置信息。这样才会动起来
        //4,5参数这个是定义原点的。我还默认左下角为起始原点。
        //6,7是对当前帧大小的改变,我用的还是原来大小,如果你修改它的值会发现,人物大小形状会发生变化
        //8,9人物动态缩放,暂时我没用,其实就是逐渐放大或者缩小
        //10,人物旋转暂时也不用
        batch.draw(currentFrame,getX(),getY(),0,0,currentFrame.getRegionWidth(),currentFrame.getRegionHeight(),getScaleX(),getScaleY(),getRotation());
//          batch.draw(currentFrame,0,0);

    }
}





只是简单的介绍了下动作类,如果还不是很清楚,建议看这篇文章。
http://blog.sina.com.cn/s/blog_940dd50a0101d0ho.html
介绍的很详细。

好了说下开发中的问题。
因为之前一直在做web开发,手机开发自己做着玩过,游戏是第一次。
经过几天的学习我发现一个很重要的问题。游戏代码写的很混乱。随着代码量不断膨胀,都不知道会写成什么样子。
  想想以前web开发中一般会使用MVC模式开发。也就是模型,视图,控制三层结构。在这个结构上我们甚至会进一步解耦、分层。游戏中可不可以呢。答案当然是可以的。
  MVC是一种软件模式。适用于大部分编程领域。怎么实现呢,如何分层呢。
  先分析下libgdx游戏开发的特征,创建演员,加入舞台,然后显出给玩家,与玩家进行交互式操作。
然后我们和web MVC结构进行简单对比。演员,舞台,就像是pojo模型对象,当然实际上这并不是简单的pojo。渲染显示就相当于我们的web中的view层,交互操作。就类似于web开发中的控制层。
恩,大概就是这个样子。
很可能大家已经都这么做了,只是咱不是菜鸟吗,刚刚发现,明天整理下代码。
本篇代码改动很少,就不提供源码了。
  • 大小: 29.5 KB
分享到:
评论

相关推荐

    使用LibGDX开发一个完整游戏 教程全集

    在这一系列的教程中,你将逐步学习如何使用上述技术和工具,从创建基本的Game类开始,搭建游戏结构,到设计游戏逻辑,直至完成一个功能完备的游戏。每个文档(game1至game11)都将深入讲解一个具体主题,帮助你逐步...

    libGDX游戏开发入门指南_13845649 高清扫描版

    libGDX游戏开发入门指南_13845649 高清扫描版

    libgdx游戏引擎开发指南

    根据提供的文件信息,我们可以生成以下知识点: 1. libgdx游戏引擎介绍: libgdx是一个开源的Java游戏...以上内容覆盖了文件中提供的信息,并结合了对libgdx游戏引擎的基本理解,以及对游戏开发学习资源的一般知识。

    libgdx引擎开发的游戏

    《使用libgdx引擎开发游戏:深度探索Cuboc Demo》 libgdx是一个强大的开源游戏开发框架,专为跨平台游戏设计,支持Windows、Linux、Mac OS X、Android以及HTML5等多种平台。它提供了丰富的功能,包括图形渲染、音频...

    LibGDX Game Development Essentials

    本书“LibGDX Game Development Essentials”致力于为读者提供LibGDX游戏开发框架的核心知识,引导读者了解并掌握如何使用LibGDX来制作游戏。LibGDX是一个开放源码的Java游戏开发框架,它为游戏开发者提供了跨平台...

    libGDX 1.10.0 开发包

    LibGDX 是一个开源的游戏开发框架,主要用于构建跨平台的2D和3D游戏。它为开发者提供了丰富的功能,使得游戏开发变得更加高效和便捷。在提供的"libGDX 1.10.0 开发包"中,包含了以下几个关键组件: 1. **gdx-1.10.0...

    libgdx学习资料

    LibGDX是一个强大的开源Java框架,专为跨平台游戏开发设计。它允许开发者使用单一代码库创建游戏,这些游戏可以在Android、iOS、HTML5、Windows、Linux和Mac等多个平台上运行。这个“libgdx学习资料”压缩包包含了...

    libgdx引擎开发的游戏 demo gif图

    通过分析GIF,我们可以看到游戏的动画流畅性、角色动作、特效等,从而评估和学习LibGDX在实际项目中的应用。 总之,LibGDX是一个功能丰富的游戏开发框架,提供了全面的游戏开发工具和组件。通过研究提供的代码示例...

    android游戏开发框架libgdx的使用9.pdf

    Android 游戏开发框架 LibGDX 的使用 —— 在 LibGDX 中使用 Box2D LibGDX 是一个流行的 Android 游戏开发框架,它提供了许多实用的功能和工具帮助开发者快速创建游戏。然而,在游戏开发中难免会需要模拟现实情况,...

    libgdx游戏引擎API

    libgdx游戏引擎开发文档,游戏开发学习文档。

    libgdx 模仿忍者突袭的跑酷游戏(源码)

    开发者在接触LibGDX不久后,便尝试通过自学完成了这款游戏的源码编写,旨在分享游戏开发经验与学习成果。 首先,我们要理解LibGDX的基本架构。LibGDX由多个模块组成,包括Scene2D、Box2D、Input处理等,为开发者...

    libgdx游戏

    "demo 例子"意味着压缩包可能包含了演示如何使用LibGDX开发游戏的示例代码。例如,"BalanceBall"可能是一个基于Box2D的平衡球游戏,玩家需要控制一个球在各种复杂地形上滚动,避免掉落。 - **物理模拟**:...

    用的libgdx引擎写的ACE 弹幕射击游戏设计与开发.zip

    《ACE弹幕射击游戏设计与开发》是一款基于libGDX引擎开发的游戏,libGDX是一个强大的开源游戏开发框架,适用于创建跨平台的游戏。本项目涵盖了从游戏设计到实际编码的全过程,是学习游戏开发和libGDX应用的宝贵资源...

    libgdx 小游戏 消除游戏 源码 亲测可以使用

    这个压缩包中的“消除游戏”源码提供了一个使用LibGDX实现的消除类游戏实例,非常适合初学者或者有经验的开发者研究学习。 在源码中,我们可以看到以下几个关键知识点: 1. **游戏架构**:LibGDX 提供了基本的游戏...

    Libgdx开发丛书之 Learning LibGDX Game Development, 2nd Edition

    《Libgdx开发丛书之 Learning LibGDX Game Development, 2nd Edition》是一本专为游戏开发者准备的图书,旨在帮助读者深入理解并熟练运用LibGDX这一强大的跨平台游戏开发框架。LibGDX是一个开源的Java库,支持在...

    libgdx,桌面/ Android /HTML5/IOS Java游戏开发框架.zip

    LibGDX是一个强大的开源Java游戏开发框架,专为跨平台游戏设计,支持桌面(Windows、Linux、Mac OS X)、Android、HTML5以及iOS操作系统。它为开发者提供了丰富的工具集和库,使得创建高质量的游戏变得更加简单高效...

    Libgdx开源游戏 【蚂蚁回家】libgdx实现

    《蚂蚁回家》是一款基于Libgdx框架开发的开源游戏,展示了Libgdx的强大功能和灵活性。Libgdx是一个跨平台的游戏开发库,支持Windows、Linux、MacOS、Android以及iOS等多个操作系统,它提供了丰富的功能,使得开发者...

    Libgdx 跨平台游戏开发手册 的示例代码_java_代码_下载

    Libgdx是一个强大的开源框架,专为...总之,"Libgdx Cross-platform Game Development Cookbook"的示例代码是一个宝贵的学习资源,它涵盖了Libgdx的各个方面,帮助开发者快速掌握游戏开发技能,实现跨平台的游戏创作。

Global site tag (gtag.js) - Google Analytics