首页 > 代码库 > 游戏中使用圆弧地图的坐标设置问题(Cocos2dx 2.2.2)
游戏中使用圆弧地图的坐标设置问题(Cocos2dx 2.2.2)
这一篇为大家介绍下怎样解决在游戏中使用圆弧形地图所带来的坐标设置问题。有错误的地方希望大家指出来,谢谢!先上一个地图的效果图,图中的灰色区域就是我们需要的地图部分,这里设置的正好是半圆,不是半圆的类似处理:
图1
一 , 分析
可以看到图中显示的屏幕部分只会同时显示地图的一部分,如果直接按照普通坐标系直接来计算,那么在往地图上添加角色或者其他的物件时设置坐标会非常不直观,而且就算添加好了,一旦到了计算角色的位置移动计算起来就非常麻烦。所以我们必须得建立一个新的坐标,当我们使用新的坐标之后,事先写好的程序接口自动转换为系统的坐标。
二, 实现原理
新的坐标以内圆的弧长为X轴(看成把弧拉直成一条直线),Y轴比较特殊,我们设定垂直与内圆弧线的任何一条线都为Y轴方向,起点线是AO。Y轴的高度是内圆圆边向外延伸的高度再加上内圆的半径,例如图2中的DB + CD。但是CD这段是固定的,所以在设置的时候CD直接放在转换坐标的函数里面,设置坐标时我们只设置DB这段,这也更加直观了。
图2
三, 使用
有了新的坐标,现在我们只要把地图看成是图2这样的矩形地图即可。假如我们要在图1的B点添加一个角色,那么只要把这个角色的坐标设置成pB(x4, y4)即可在图1中的B点显示,是不是很直观。
四, 转换过程及程序实现
根据我们的定义,x4的值是和弧长AD的值是一样的。x4起的作用是确定α角的大小,已知半径求弧长对应的角度很容易求出。y4的值是来确定|AB|, |AC|的值的。这样就可以求得B点的坐标。
α = (x4/ (2 *π*r) * 360.0f;
|BC| = |BD| + |DC|
|AB| = |BC| * sin(α) // AB的值就是我们的实际的Y轴的值
|AC| = |BC| * cos(α) // R – |AC| 就是我们的实际的X轴的值
通过以上步骤我们可以求的B点的坐标(|AB|, R - |AC);
程序代码如下:
#define OUT_CIRCLE_RADIUS xxx // R#define INNER_CIRCLE_RADIUS xxx // rvoid setArcPosition(float x, float y){ // (point.x / 2 * PI * R) * 360 float angle = (x / (2 * PI * INNER_CIRCLE_RADIUS)) * 360.0f; y += INNER_CIRCLE_RADIUS; // add radius setRotation(angle - 90.0f); setCurPosRotate(angle); setPosition(ccp(OUT_CIRCLE_RADIUS - y * cosf(CC_DEGREES_TO_RADIANS(angle)), y * sinf(CC_DEGREES_TO_RADIANS(angle))));}void setArcPosition(CCPoint point){ setArcPosition(point.x, point.y);}void setArcPositionX(float x){ float showPosY = getArcPositionY(); setArcPosition(ccp(x, showPosY));}void setArcPositionY(float y){ float realPosX = getArcPositionX(); setArcPosition(ccp(realPosX, y)); }CCPoint getArcPosition(){ return ccp(getArcPositionX(), getArcPositionY());}float getArcPositionX(){ float curRotate = getCurPosRotate(); // percent * 2* PI * R = curRotate / 360 * 2 * PI * R float realPosX = (curRotate / 360.0f) * (2 * PI * INNER_CIRCLE_RADIUS); return realPosX;}float getArcPositionY(){ CCPoint curPos= getPosition(); float curRotate = getCurPosRotate(); float realPosY; float angleSinValue =http://www.mamicode.com/ sinf(CC_DEGREES_TO_RADIANS(curRotate)); if (angleSinValue != 0) { realPosY = curPos.y / angleSinValue - INNER_CIRCLE_RADIUS; } else if(curPos.x == 0 && curPos.y == 0){ realPosY = 0; } else { realPosY = INNER_CIRCLE_RADIUS - curPos.x; } return realPosY;}
整个过程就是这样,希望对大家有所帮助,谢谢!
游戏中使用圆弧地图的坐标设置问题(Cocos2dx 2.2.2)