ogengine 橙子虚幻4引擎安装2.1.4怎么安装

OGEngine开发2048游戏及完整源代码揭秘和下载 (一) - Java,游戏,游戏引擎,OGEngine,橙子游戏 - mobile - ITeye论坛
OGEngine开发2048游戏及完整源代码揭秘和下载 (一)
锁定老帖子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
等级: 初级会员
来自: 填写香港或选择
发表时间:&&
使用OGEngine开发2048游戏机源码解析
最近有一款的游戏非常火,本文将来介绍一下使用OGEngine游戏引擎开发游戏2048。
OGEngine引擎是开源的,我们很容易找到,搭建起来也很方便,我们只需在工程下添加的包或者直接引用源码就可以了。
1.创建游戏的主类
创建的游戏主入口类继承于类,需要重写相关方法。
(1) 重写此类主要是设置引擎相关参数。
protected PixelPerfectEngineOptions onCreatePixelPerfectEngineOptions() {
PixelPerfectEngineOptions pixelPerfectEngineOptions = new PixelPerfectEngineOptions(
this, ZoomCamera.class);
// 设置竖屏
pixelPerfectEngineOptions
.setScreenOrientation(ScreenOrientation.PORTRAIT_FIXED);
// 适配模式,这里设置为“保持宽度不变,改变高”
pixelPerfectEngineOptions
.setPixelPerfectMode(PixelPerfectMode.CHANGE_HEIGHT);
// 参考尺寸
pixelPerfectEngineOptions.setDesiredSize(ConstantUtil.DESIRED_SIZE);
return pixelPerfectEngineO
① 根据游戏本身的需要设置竖屏或者横屏;这个参数表示竖屏,这参数表上横屏,我这里设置成了竖屏。
② 设置适配模式,表上“保持宽度不变,改变高”。
③ 屏幕参考尺寸,我这里是竖屏上面又设置了“保持宽度不变,改变高”,所以我这里的参考尺寸设为,表示保持镜头的宽为不变,根据实际手机屏幕分辨率的宽高比改变镜头的高。
(2) 重写 此类主要用于在此加载相关资源。
protected void onLoadResources() {
// 加载图片资源
RegionRes.loadTexturesFromAssets(Res.ALL_XML);
// 加载字体资源
FontRes.loadFont(128, 128, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.BLACK, ConstantUtil.FONT_CARD_NUM);
FontRes.loadFont(128, 128, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL), 25, true, Color.WHITE, ConstantUtil.FONT_SCORE_NUM);
// 加载音效资源
SoundFactory.setAssetBasePath("mfx/");
SoundRes.loadSoundFromAssets(ConstantUtil.SOUND_SELECT, "select.mp3");
SoundRes.loadSoundFromAssets(ConstantUtil.SOUND_SETPOS, "setpos.mp3");
SoundRes.loadSoundFromAssets(ConstantUtil.SOUND_MERGE, "merge.mp3");
(3) 重写 此类在上面方法中加载资源完成后执行,通常此时可以跳转到相关游戏场景。
protected void onLoadComplete() {
// 加载资源完成后
this.startScene(GameScene.class);
2.创建游戏场景 类
创建场景的类可以继承于类,场景是的子类,该类用来创建游戏中的场景。是屏幕上所有对象的根容器。
在方法里面创建各种实体,比如 、、、。
public void onSceneCreate(SceneBundle bundle) {
super.onSceneCreate(bundle);
initView();
private void initView() {
// 游戏背景
AnimatedSprite game_bg = new AnimatedSprite(0, 0, Res.GAME_BG,
getVertexBufferObjectManager());
this.attachChild(game_bg);
// 中间游戏主体部分
mGameGroup = new GameGroup(this);
// 设置改Group的中心位置在镜头的中心点上
mGameGroup.setCentrePosition(this.getCameraCenterX(),
this.getCameraCenterY());
this.attachChild(mGameGroup);
// 2048 LOGO
AnimatedSprite game_logo = new AnimatedSprite(20, 20, Res.GAME_LOGO,
getVertexBufferObjectManager());
this.attachChild(game_logo);
// 最佳得分背景
bestScoreBg = new AnimatedSprite(0, 20, Res.GAME_SCORE_BG_BEST,
getVertexBufferObjectManager());
// 设置bestScoreBg右边x坐标的位置在镜头的右边减20的位置
bestScoreBg.setRightPositionX(this.getCameraRightX() - 20);
this.attachChild(bestScoreBg);
tBestScore = new Text(0, bestScoreBg.getY() + 50,
FontRes.getFont(ConstantUtil.FONT_SCORE_NUM),
SharedUtil.getBestScore(getActivity()) + "", 4,
getVertexBufferObjectManager());
// 设置 tBestScore 的X坐标上的中点在bestScoreBg的X坐标中点上
tBestScore.setCentrePositionX(bestScoreBg.getCentreX());
this.attachChild(tBestScore);
// 当前得分背景
currScoreBg = new AnimatedSprite(0, bestScoreBg.getY(),
Res.GAME_SCORE_BG_NOW, getVertexBufferObjectManager());
// 设置currScoreBg的右边X坐标点在bestScoreBg左边的X坐标减20的位置上
currScoreBg.setRightPositionX(bestScoreBg.getLeftX() - 20);
this.attachChild(currScoreBg);.....
(1) Scene 类是游戏中非常重要的一个类,在场景中,利用来添加实体。
(2) 由类跳转到或者于 之间的跳转使用
public Scene startScene(Class&? extends Scene& pSceneCls)
public Scene startScene(Class&? extends Scene& pSceneCls, SceneBundle bundle)
pSceneCls:需要跳转的场景的
bundle用于传递场景之间的数据
(3) Scene中包含生命周期,在被添加到引擎渲染后、执行对应生命周期时、会重新显示时执行
public void onSceneCreate(SceneBundle bundle)
public void onSceneResume()
public void onScenePause()
public void onSceneDestroy()
(4) 要关闭一个使用 方法即可。
(5) 需要灵活运用实体中有关设置坐标位置和获取坐标位置的方法来设定实体的位置。下面是部分相关方法。
//获取左X坐标
public float getLeftX() ;//获取右X坐标
public float getRightX();
//设置右上X位置
public void setRightPositionX(float pX);//获取底部Y位置
public float getBottomY();//设置底部Y位置
public void setBottomPositionY(float pY) ;
// 获取中心X坐标
public float getCentreX() ;
// 获取中心Y坐标
public float getCentreY() ;
// 设置中心X位置
public void setCentrePositionX(float pCentreX) ;
// 设置中心Y位置
public void setCentrePositionY(float pCentreY);
// 设置中心位置
public void setCentrePosition(float pCentreX, float pCentreY) ;
(6) 显示、更新分数。这里显示分数使用到了文本类 tBestScore、tBestScore均为
* 更新最高纪录
* @param pBestScore
private void updateBestScore(int pBestScore) {
tBestScore.setText(pBestScore + "");// 设置居中
tBestScore.setCentrePositionX(bestScoreBg.getCentreX());
* 增加当前分数
* @param pAddScore
所增加的分数
public void addCurrScore(int pAddScore) {
if (pAddScore != 0) {
// 播放音效
SoundRes.playSound(ConstantUtil.SOUND_MERGE);
currScore += pAddS
tCurrScore.setText(currScore + "");
tCurrScore.setCentrePositionX(currScoreBg.getCentreX());
// 当前分数大于所保存的最佳分数时,更新最佳分数
if (currScore & SharedUtil.getBestScore(getActivity())) {
SharedUtil.setBestScore(getActivity(), currScore);
updateBestScore(currScore);
() 按钮及按钮点击事件监听,btnHelp 和 btnExit 均为,通过
setOnClickListener(onClickListener); 设置点击事件监听。
* 按钮点击监听
private OnClickListener onClickListener = new OnClickListener() {
public void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,
float pTouchAreaLocalY) {
if (pButtonSprite == btnHelp) {
// 点击了帮助按钮
attachChild(helpLayer);
} else if (pButtonSprite == btnExit) {
// 点击了退出游戏按钮
showDialog();
3.创建卡片类
手游中,卡片是一个重要的单元体,移动的其实是卡片,下面我们来介绍一下卡片类的实现。
(1) 稍微扩展一下卡片精灵
我们知道,在游戏中,每种数字所对应的卡片颜色不一样,这里我们使用卡片的原图是一白色的方块图,通过相关设置颜色的方法可以改变卡片的颜色。观察引擎源码可以发现类里有个 的方法,它可以使设定的颜色值叠加在原图上形成新的颜色,我们这里的原图使用的是白色的方块图,所以我们可以找到想要变成的颜色的图,拿到它的值就好办了。
我们可以看一下中的
* @param pRed
from &code&0.0f&/code& to &code&1.0f&/code&
* @param pGreen
from &code&0.0f&/code& to &code&1.0f&/code&
* @param pBlue
from &code&0.0f&/code& to &code&1.0f&/code&
public void setColor(final float pRed, final float pGreen, final float pBlue) {
if (this.mColor.setChecking(pRed, pGreen, pBlue)) {
this.onUpdateColor();
由上面的源码可以看到,各个颜色值的范围是如下面的源码注释,而我们用取色器获取得到的是的,不太方便使用,所以我们扩展一下。这里我们在卡片精灵类中扩展一下。
public class CardSprite extends AnimatedSprite {
public CardSprite(VertexBufferObjectManager pVertexBufferObjectManager) {
super(0, 0, Res.GAME_ROUNDRECT, pVertexBufferObjectManager);
* 设置RGB 0 到 255
public void setRGB(float pRed, float pGreen, float pBlue) {
this.setColor(pRed / 255, pGreen / 255, pBlue / 255);
* 设置数组形式的 RGB 0 到 255
* @param pRGBs 数组形式的RGB
public void setRGB(float[] pRGBs) {
this.setColor(pRGBs[0] / 255, pRGBs[1] / 255, pRGBs[2] / 255);
(2) 创建卡片精灵和卡片上面显示的数字的组合类
在中要把精灵、文本实体等组合成一个整体我们通常使用到类。
public class CardGroup extends EntityGroup {
private CardSprite cardS// 卡片背景
private int number = 0;// 数字
private Text tN // 数字文本
// ============get&set===================
// 获取数字
public int getNumber() {
// 设置数字
public void setNumber(int number) {
this.number =
onDrawNum(number);
// ======================================
public CardGroup(float pX, float pY, Scene pScene) {// 卡片资源原图的大小为90*90,所以这个组合的宽高可以设置为90*90
super(pX, pY, 90, 90, pScene);
// 初始化View
initView();
// 自动计算成自适应宽高
this.setWrapSize();
}private void initView() {
// 创建卡片精灵
cardSprite = new CardSprite(this.getVertexBufferObjectManager());
this.attachChild(cardSprite);
// 创建文本实体用于显示卡片上的数字,文本是可变的,这里设置文本的默认值为空字符串,最大的显示位数为4
tNum = new Text(0, 0, FontRes.getFont(ConstantUtil.FONT_CARD_NUM), "",
4, this.getVertexBufferObjectManager());
// 设置文本的中心Y坐标在cardSprite的Y坐标中点上
tNum.setCentrePositionY(cardSprite.getCentreY());
this.attachChild(tNum);
// 画卡片上的数字并根据数字显示颜色,默认值为0
onDrawNum(0);
// 画卡片上的数字,并根据数字设置卡片的颜色
private void onDrawNum(int number) {
float[] mRGBs;
switch (number) {
mRGBs = ConstantUtil.RGBS_0;
mRGBs = ConstantUtil.RGBS_2;
mRGBs = ConstantUtil.RGBS_4;
mRGBs = ConstantUtil.RGBS_8;
// 此次省略了16、32、64、128、256、512 的设置
case 1024:
mRGBs = ConstantUtil.RGBS_1024;
case 2048:
mRGBs = ConstantUtil.RGBS_2048;
mRGBs = ConstantUtil.RGBS_0;
// 设置精灵颜色,传入的是RGB的数组形式
cardSprite.setRGB(mRGBs);
// 设置文本显示,设置数字相对于卡片精灵X坐标居中
if (number == 0) {
tNum.setText("");
tNum.setText(number + "");
tNum.setCentrePositionX(cardSprite.getCentreX());
// 对比当前卡片与传进来的卡片上的数字是否相等
public boolean equals(CardGroup pCardGroup) {
return getNumber() == pCardGroup.getNumber();
这样整个卡片类就创建好了,代码注释得比较详细,就不再多解析了。
4.把卡片添加到游戏主体界面部分()
上面我们已经创建了卡片类 ,下面我们再把它组合成一个整体。
(1) 建立类,声明一些常量,构造器。
public class GameGroup extends EntityGroup {
private GameScene mGameS
/**手指滑动的最小响应距离**/
private final static int FLING_MIN_DISTANCE =10;
/**卡片之间的间隔**/
private static final float INTERVAL = 15;
/**卡片行列数量**/
private final static int mCount = 4;
/**卡片尺寸**/
private final static float CARD_SIZE = 90;
/**卡片数组**/
private CardGroup[][] cardArrays = new CardGroup[4][4];
/**用于标记还有哪些空的位置**/
private List&Point& emptyPoints = new ArrayList&Point&();/**随机生成的数字2**/
private final static int mSamllNum = 2;/**随机生成的数字4**/
private final static int mBignum = 4;
public GameGroup(GameScene pGameScene) {
super(0, 0, 435, 435, pGameScene);
// 设置可以监听触碰事件
this.setIgnoreTouch(false);
this.mGameScene = pGameS
initView();
(2)具体实现创建卡片函数,代码如下:
private void initView() {
// 创建背景
AnimatedSprite rectBg = new AnimatedSprite(0, 0, Res.GAME_RECT_BG, this.getVertexBufferObjectManager());
this.attachChild(rectBg);
// 创建 4*4 单元格 卡片
for (int row = 0; row & mC row++) {
for (int column = 0; column & mC column++) {
cardArrays[row][column]=new CardGroup((column+1)*INTERVAL+column*CARD_SIZE, (row+1)*INTERVAL+row*CARD_SIZE, getScene());
this.attachChild(cardArrays[row][column]);
// 在随机一处剩余的空白单元随机生成数字,2或者4
addRandomNum();
addRandomNum();
(3)游戏生成随机卡片数字addRandomNum()
* 在随机一处剩余的空白单元随机生成数字,2或者4
private void addRandomNum() {
// 播放音效
SoundRes.playSound(ConstantUtil.SOUND_SETPOS);
emptyPoints.clear();
for (int x = 0; x & mC x++) {
for (int y = 0; y & mC y++) {
if (cardArrays[x][y].getNumber() &= 0) {
emptyPoints.add(new Point(x, y));
Point p = emptyPoints
.remove((int) (Math.random() * emptyPoints.size()));
cardArrays[p.x][p.y].setNumber(Math.random() & 0.1f ? mSamllNum
: mBignum);// 生成卡片的一些动作效果,就是一个由0到1倍的缩放过程
cardArrays[p.x][p.y].registerEntityModifier(new ScaleModifier(0.2f, 0.0f, 1.0f));
(4)在游戏场景类中创建
// 中间游戏主体部分
mGameGroup = new GameGroup(this);
// 设置改Group的中心位置在镜头的中心点上
mGameGroup.setCentrePosition(this.getCameraCenterX(),
this.getCameraCenterY());
this.attachChild(mGameGroup);
(5)运行效果
运行效果如下,中间部分则为中展示的界面
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术该项目还没有主人、 该项目的管理员
深圳市/创业期
他们不是管理层,走的是技术专家路线,也受新人的尊重。对新人来说,他们也不是单纯的打工者。按照常青树计划,360每年都会维持总股本5%的比例,...让体制内一线教师集体“触网”,是一项艰难的世纪工程,教务繁忙的他们是否愿意抽出时间和精力耕耘线上教育?平台如何对教学内容如何甄别?半成品生鲜电商是一门上游关联到基地,中间控制物流,末端围绕用户群,在降低损耗提高配送体验的同是控制物流成本提升收益的活儿,参与其中的企业需要...随时随地,快速访问
只要手机在手,您都可以快速、方便地看贴发帖,与论坛好友收发短消息。
极致优化,畅快"悦"读
独有的论坛界面和触屏设计,手机论坛也变得赏心悦目,操作自如。
即拍即发,分享生活
不管是风景图画,还是新闻现场,拍照发帖一气呵成,让您在论坛出尽风头。
下载客户端后,拍摄二维码快速访问本站:
或者通过以下地址访问:
Copyright &.All right reserved我们是一个充满激情与梦想的团队,团队的每一个人都把微米支付作为我们奋斗目标的起点。
我们的工作充满了创意,充满了欢笑却又充满压力。
我们在轻松的氛围下工作,却可以将我们每个人的潜力发挥到极致。
我们的目标是将我们为之奋斗的事业做成一种文化、一种潮流、一种生活。
学历不是我们衡量人才的标准,我们更看重的是你所表现出来的能力和你完成自我超越的魄力。
如果你有能力、有梦想、有激情、有创意、敢于承担、敢于挑战自我,那么欢迎加入我们,我们会给你创造奇迹的机会。
在这里,你将有机会领略到一家业内领先的互联网技术公司的创业魅力,感受分秒必争、时刻创新的精神氛围,在这个优秀的平台上,
我们相信你一定能充分发掘自身潜力,尽情展示自己的才华。

我要回帖

更多关于 虚幻4引擎安装教程 的文章

 

随机推荐