【问题标题】:OpenGL, C++ -> How do you lay out objects on screen?OpenGL, C++ -> 你如何在屏幕上布置对象?
【发布时间】:2013-06-04 20:25:30
【问题描述】:

我以前写java代码的时候,有“grid bag”和box之类的布局管理器。

我正在使用 Cocos2D-X 开发一款游戏,但在屏幕上布置对象时遇到了问题,因此它们不是硬编码位置,而是基于布局。设备之间的像素差异是导致我的问题的原因。

我知道 Cocos2D 有办法解决这个问题,但我的作品很大且质量很高,我想根据设备调整它的大小。

所以我想只使用原生 OpenGL,但我可能无法确定是否有可用的布局管理器。

谁能讨论在 OpenGL 中布局对象的方式? C++

【问题讨论】:

  • OpenGL 本身没有这方面的功能。而且永远不会。这完全属于附加库的范畴。
  • 该死,我担心我必须自己写。可能更糟! :-)
  • 你说的是什么对象?图片?
  • 是的,图像,精灵等.您不能对 x-y 进行硬编码,因为该位置因设备而异。
  • 确保您的 (x,y) 坐标系一开始就是正确的,这样一个正方形才能真正绘制成一个正方形。很久以前,我为我的引擎制作了快速而肮脏的窗口和容器系统,只是为了绘制调试信息和制作一些简单的工具。无论屏幕分辨率的纵横比如何,它都适用于 [-1,1] x 和 y 范围。工作简直是一场噩梦! :D

标签: c++ opengl layout cocos2d-iphone cocos2d-x


【解决方案1】:

OpenGL 具有视口的概念。这是您将要绘制的屏幕/窗口坐标中的框。设置视口后,您现在就可以使用有时称为相机坐标的东西。

相机坐标从视口最左侧的 -1.0 到最右侧的 1.0。类似地,对于 Y 坐标 -1.0 在极端底部,1.0 在极端顶部。位于视口之外的任何东西都不会被绘制。

您的模型可以存在于您喜欢的任何坐标系中。然后,您可以使用转换矩阵将对象转换为相机坐标。

【讨论】:

  • 对不起,我完全不明白这个:-(我看了4遍。
【解决方案2】:

无需为此使用 Opengl,而无需使用像素来定位您的作品;您实际上可以根据屏幕百分比定位它们。

如果它的背景图片你可以定位它 CCSize 大小 = CCDirector::....->getWinSize(); x = 尺寸.宽度/2; y = 尺寸.高度/2; 图像->setPosition(x,y); 如果图像的锚点是中心,则图像将居中。

如果你有很多艺术品,那就不一样了。

添加更多(更新)

retina = 2048×1536  
normal = 1024×768
retinaWidth = normal.width * 2;//(2048)
retinaHeight = normal.height * 2;//(1536)


spriteInNormalRes{
    x = 250px(which you will define with the percentage, in my first answer)
    y = 264px(which you will define with the percentage, in my first answer)
}
spriteInRetinaRes{
    x = spriteInNormalRes.x * 2 
    y = spriteInNormalRes.x * 2 
}

您可以将 x,y 加倍来定位精灵。 + 自定义 scaleRatio 以将它们调整为您想要的大小。

注意:您不一定要将值加倍,为您测试正确的值。

【讨论】:

  • 背景很好。我明白了。我正在努力解决的是其他精灵,比如角色等。我可以让它们在 iPad Mini 上看起来不错,但移动到视网膜显示器时,精灵可以更大,并且由于分辨率更高,屏幕上的位置也不同。 ...
  • 在答案中添加了更多内容。 :D
  • 你确实有一个错字,在spriteInRetinaResy = spriteInNormalRes.x * 2 应该是y*2?
  • 是的,我错字了。是的,我的意思是 (0.5, 0.5) 这是默认值,所以不需要设置它。
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多