zoukankan      html  css  js  c++  java
  • 多分辨率适配(下)

    五.多分辨率自适应的实现QQ图片20130801205452

    首先我们要设置我们的适配模式为kResolutionFixedHeight:

    假定我们的游戏为分辨率(960,720)的横版游戏,至于为什么是960×720,最后再告诉大家,这里且让小弟卖个关子!

    1.背景层

    对于背景层来说这个问题So Easy,我们只用准备一张比设计分辨率长很多(或高很多,取决于你游戏的方向,另一个方向的尺寸和设计尺寸相同!)的图片即可!

    这里我们随便找张素材:

    background

    大家在hellocpp工程中的HelloWorld::init函数末尾加入如下代码:

    下图是的main.cpp中设置的窗口大小为标准960×720和其他分辨率下的效果:

    QQ截图20130731171046

    QQ截图20130731171943

    QQ截图20130731172220

    哈哈哈,看我们的设计区域是不是都被完整的显示出来了呢?大家可以用(上)文章中提到的分辨率挨个试一遍,都是没有问题的!(Yes,妈妈再也不用担心我的多分辨率适配了!)

    2.游戏内容

    关于这部分的内容,太多太复杂,真的不好讲啊!我简单讲来一下,要有什么不懂得,请在评论中说明或者@justbilt私信给我,我会在第一时间回复的!我们需要一个节点(CCNode),用来将游戏的所有内容都添加到上面,再将这个节点添加到屏幕的中心! 这个节点可以是CCLayer,CCNode,或者CCTMXTiledMap都行!这里要注意以下几点:

    1).选择根节点

    如果根节点选择的是CCLayer,CCNode之类的,要去设置它们的setContentSize(designResolutionSize);

    如果根节点是自身CCTMXTiledMap(注:这里我们地图的内容不要超过设计尺寸),就不用进行上边的操作了!

    2).坐标设置

    游戏中尽量不要用绝对坐标(其实绝对坐标木任何问题),让我们加入几个精灵试试:

    让我们看下效果:

    QQ截图20130731195113

    QQ截图20130731195222

    QQ截图20130731195437

    游戏中的我们尽量使用相对坐标,可以通过以下几种方式求得:

    ①.相对于父亲的尺寸比例
    ②.相对于另一个精灵的坐标的偏移
    ③.相对于屏幕的尺寸的比例

    这样日后修改起来了会很方便!

    哈哈哈,大家可以把上段代码中的pGameRoot->getContentSize().width,pGameRoot->getContentSize().height换成960×720的绝对坐标试下,结果是没有任何问题的!

    3).介绍几个坐标转换的函数

    将UI坐标(左上角为原点)转化为OpenGL(左下角为原点)坐标,CCTouch中的坐标为UI坐标,我们使用时要转换为OpenGL坐标

    将OpenGL坐标转化为UI坐标,主要用在设置CCTouch的触点(讲触摸的那篇文章有提到)!

    世界坐标空间和Node空间的转化,请看下图:

    QQ截图20130801141405

    如图,我们用中间的小人getPosition()得到的是相对与父亲的坐标(即红框),如果我们想得到它相对于原点的坐标,就可以这样:

    如下图:

    QQ截图20130801142709

    假如我们在红色圆圈位置点击,想判断落点在哪一格,但是我们从pTouch->getLocation();得到的坐标是相对于原点的,这样我们要减去红框(pGameRoot)的左下角坐标才行,很麻烦的,我们可以这个样子做:

    哈哈哈,这样子是不是很简单?这样子touchInGameRoot就是以pGameRoot左下角的偏移量了!

    游戏内容部分就讲到这里!

    3.UI层

    UI层的实现相对来说比较简单,目前来说大概有两种实现方式:

    ①.根据”米”来设设置UI控件的位置.
    ②.根据屏幕的%来这设置UI控件的位置.

    1).让我们直接上代码吧:

    这个是按照比例去设置UI位置的,下面是效果图,大家注意不同分辨率下红色圆饼的位置:

    QQ截图20130801153356

    QQ截图20130801153541

    关于如何用”米”子来布局的实现,大家去这里看http://dualface.github.io/blog/2012/08/17/cocos2d-x-2-dot-0-multi-resolution/,这个不是我要讲的重点,毕竟手写坐标的人不会很多,我们主要讲如何在编辑器中实现UI布局的自适应!

    2).在cocosbuilder中如何实现自适应

    如果你用过cocosbuilder的话,你一定对下图不陌生:

    QQ图片20130801172046

    这个是我们设置物体坐标的一个界面,功能介绍我引用K.C的文章中的一段话:

    QQ截图20130801180024

    他讲的非常好,我就不赘述了,我们一般情况下只会使用第一个,当时为了适配多分辨率,我们不能这么做了!在这里我们还是有两种做法来实现,一个是相对布局,一个是%比,但是我推荐将两种方案结合起来.

    .相对位置负责四个角落的位置,即:左下,左上,右下.右上!
    .而中间的几个位置就只能交给%,即:上,下,左,右,中!

    这里我们要注意几点(都是血淋淋的坑啊):

    .对于CCMenu,CCNode,CCSprite都能够实用上边的两个方法来设置坐标,唯独CCMenuItem不行,只能使用绝对坐标,这点大家一定要注意.那么对于下面的情况该怎么办呢:

    QQ截图20130801181052

    我的解决方案是给”每一堆”按钮都添加一个CCMenu,然后CCMenuItem按照相对位置来,上图中我就使用了3个CCMenu!

    .对于要”扎堆”的控件(即控件间的相对位置保持不变),一定要加入到一个公共的父亲上!

    ③.灵活使用AnchorPoint属性!

    六.设计尺寸的设定QQ图片20130801205612

    之前文章中有提到设置游戏的分辨率为(960,720),那么为什么呢?

    首先我们来考虑选择什么样的宽高比,宽高比越小,画面就越方,比如ipad(4:3=1.33)的宽高比就比iphone(3:2=1.5)的小,所以ipad的屏幕更方一些!因此我们设计游戏是应该按照最小的宽高比去设计,这样在大的宽高比的机型上都能够看到完整的画面,从表1中可知宽高比最小的是4:3!

    下面我们来考虑分辨率,分辨率要符合大多数设备的要求,经过分析960的宽是最符合要求的,转为4:3就是960×720!.

    (全文完)

  • 相关阅读:
    线程间的通信
    高速排序算法
    LightOJ 1205 Palindromic Numbers
    java异常处理
    Android Bundle类
    Linux守护进程的编程实现
    深入浅出JMS(一)——JMS简单介绍
    Maven安装与配置
    matlab学习------------普通dialog对话框,错误对话框errordlg,警告对话框warndlg
    读书笔记:计算机网络4章:网络层
  • 原文地址:https://www.cnblogs.com/fuland/p/3628676.html
Copyright © 2011-2022 走看看