比方说定义格子的长度(W=80像素),高度(H=40像素)
Constants.TILE_WIDTH = 80;
Constants.TILE_HEIGHT= 40;
Constants.TILE_WIDTH_2 = 80/2;
Constants.TILE_HEIGHT_2= 40/2;
1:格子坐标与像素坐标的互相转换公式
1.1:格子坐标转像素坐标
/**
* 像素坐标转换成斜45度的格子坐标
* @param px 像素X坐标
* @param py 像素Y坐标
* @return
*/
public static short[] pixToTile(int px,int py){
int cx = (px/Constants.TILE_WIDTH)*Constants.TILE_WIDTH+Constants.TILE_WIDTH_2;
int cy = (py/Constants.TILE_HEIGHT)*Constants.TILE_HEIGHT+Constants.TILE_HEIGHT_2;
int rx = (px-cx)*Constants.TILE_HEIGHT_2;
int ry = (py-cy)*Constants.TILE_WIDTH_2;
int tx,ty;
if((Math.abs(rx)+Math.abs(ry))<=(Constants.TILE_WIDTH*Constants.TILE_HEIGHT/4)){
tx = px/Constants.TILE_WIDTH;
ty = (py/Constants.TILE_HEIGHT)*2;
}else{
px = px-Constants.TILE_WIDTH_2;
tx = px/Constants.TILE_WIDTH+1;
py = py-Constants.TILE_HEIGHT_2;
ty = (py/Constants.TILE_HEIGHT)*2+1;
}
tx = tx-(ty&1);
return new short[]{(short)tx,(short)ty};
}
1.2:像素坐标转格子坐标
/**
* 斜45度的格子坐标转换成像素坐标
* @param tx 斜45度的格子X坐标
* @param ty 斜45度的格子Y坐标
* @return
*/
public static short[] tileToPix(int tx,int ty){
int px=(tx*Constants.TILE_WIDTH+((ty&1)+1)*(Constants.TILE_WIDTH/2));
int py=(ty+1)*(Constants.TILE_HEIGHT/2);
return new short[]{(short)px,(short)py};
}
2:两格子坐标四方向相差的格子数计算
/**
* 忽略地图地形(计算两个格子之间经过的格子数)
* @param bx 开始格子X坐标
* @param by 开始格子Y坐标
* @param ex 目标格子X坐标
* @param ey 目标格子Y坐标
* @return
*/
public static int getTileNumFromTile(short bx,short by,short ex,short ey){
short[] beginPix = tileToPix(bx,by);
short[] endPix = tileToPix(ex,ey);
int subX = Math.abs(endPix[0]-beginPix[0])/(Constants.TILE_WIDTH/2);
int subY = Math.abs(endPix[1]-beginPix[1])/(Constants.TILE_HEIGHT/2);
return Math.max(subX, subY);
}
3:靠近某目标格子的相关计算
/**
* 获取以此格子坐标(x,y)为中心的四个方向的其他格子坐标
* @param x
* @param y
* @return
*/
public static short[][] getNext4(short x,short y){
short[][] nextXy= new short[4][2];
//Y坐标偶数时 X坐标减1
if(y%2==0){
short preX = (short)(x-1);
short preY = (short)(y-1);
short nexY = (short)(y+1);
nextXy[0]=new short[]{preX,preY};
nextXy[1]=new short[]{preX,nexY};
nextXy[2]=new short[]{x,preY};
nextXy[3]=new short[]{x,nexY};
}else{
short preY = (short)(y-1);
short nexY = (short)(y+1);
short nextX = (short)(x+1);
nextXy[0]=new short[]{x,preY};
nextXy[1]=new short[]{x,nexY};
nextXy[2]=new short[]{nextX,preY};
nextXy[3]=new short[]{nextX,nexY};
}
return nextXy;
}
/**
* 找出最短格子路线
* @param map 地图数据
* @param begin 起点位置数据
* @param end 目标位置格子坐标
* @param moveAbility 可移动的格子数
* @param areaNum 所占格子数
* @param isOmit 忽略地形
* @return
*/ public static Object[] findMinTileLine(byte[][]map,SlgNode begin,short[] end,byte moveAbility,byte areaNum,boolean isOmit){
//最小格子数
int minNums = getTileNumFromTile(begin.getTx(),begin.getTy(),end[0],end[1]);
if(minNums<2)return null;
if(areaNum>1){
short[][] infos = getTopArea(begin.getTx(),begin.getTy(),areaNum);
for(int i=1;i<infos.length;i++){
int tmpNums = getTileNumFromTile(infos[i][0],infos[i][1],end[0],end[1]);
if(tmpNums<minNums){
minNums = tmpNums;
if(minNums < 2) return null;
}
}
}
int curr=0;
SlgNode node = begin;
while(curr<moveAbility){
//找出周围四个格子离目标的位置
short[][] data = getNext4(node.getTx(),node.getTy());
SlgNode minNode = null;
int omit = (isOmit?2:1);
for(int i=0;i<data.length;i++){
short tx =data[i][0],ty =data[i][1];
//格子位置是否合法(没有被障碍物阻止)
if(ty>=0&&ty<map.length&&tx>=0&&tx<map[0].length&&map[ty][tx]<omit){
int tmpNums = getTileNumFromTile(tx,ty,end[0],end[1]);
boolean isFlag = true;
//如果是占用多格子的检测其他的格子是否合法
if(areaNum>1){
short[][] infos = getTopArea(tx,ty,areaNum);
for(int j=1;j<infos.length;j++){
short tx0 = infos[j][0],ty0=infos[j][1];
if(ty0<map.length&&tx0 <map[0].length && ty0>=0&&tx0>=0&&map[ty0][tx0]<omit){
if(tmpNums>1){
int tmpNums0 = getTileNumFromTile(tx0,ty0,end[0],end[1]);
if(tmpNums0<tmpNums)tmpNums = tmpNums0;
}
}else{
isFlag = false;break;
}
}
}
if(tmpNums<minNums && isFlag){
minNode= new SlgNode(tx,ty,(byte)(node.getLen()+1));
minNode.setParent(node);
if(tmpNums<2)return new Object[]{minNode,tmpNums};
minNums = tmpNums;
}
}
}
if(minNode==null)return curr==0?null:new Object[]{minNode,minNums};
curr++;
node = minNode;
}
return new Object[]{node,minNums};
}
/**
* SLG移动格子坐标数据定义
* @author Administrator
*
*/
public class SlgNode implements Comparable<SlgNode>{
//格子坐标
private short tx;
private short ty;
//父节点
private SlgNode parent;
//步长
private byte len;
public SlgNode(){
}
public SlgNode(short tx,short ty,byte len){
this.tx = tx;
this.ty= ty;
this.len = len;
}
public short getTx() {
return tx;
}
public void setTx(short tx) {
this.tx = tx;
}
public short getTy() {
return ty;
}
public void setTy(short ty) {
this.ty = ty;
}
public SlgNode getParent() {
return parent;
}
public void setParent(SlgNode parent) {
this.parent = parent;
}
public byte getLen() {
return len;
}
public void setLen(int len) {
this.len = (byte)len;
}
public static String getCode(int x,int y){
return x+"_"+y;
}
public String getCode(){
return getCode(tx,ty);
}
public String toString(){
StringBuilder path = new StringBuilder().append("[").append(tx).append(",").append(ty).append("][").append(len).append("]");
if(this.parent!=null){
path.append("->").append(this.parent.toString());
}
return path.toString();
}
public int compareTo(SlgNode o) {
if(len>0 && o.getLen()>0){
return len-o.getLen();
}else if(o.getLen()>0){
return 1;
}
return 0;
}
}
分享到:
相关推荐
这涉及到计算当前玩家位置对应的屏幕坐标,并更新地图显示。在AS3.0中,可以使用DisplayObject容器来管理这些动态变化。 4. **碰撞检测**:45度斜角地图的碰撞检测比正交地图更为复杂。需要考虑物体在斜角方向上的...
【45度角游戏开发指南】是一篇关于游戏制作的文章,专注于探讨斜视角游戏的实现技术。斜视角游戏,以其独特的视觉效果,给人一种立体感,是很多策略和角色扮演游戏的首选视角。以下是对文章主要内容的详细说明: 1....
总的来说,A*寻路算法在斜45度地图中的应用涉及到地图的抽象、节点的表示、启发式函数的选择以及数据结构的优化。理解这些概念并能够灵活应用,对于解决复杂环境中的路径规划问题至关重要。在实际项目中,根据具体...
在本文中,我们将深入探讨基于ActionScript3(AS3)的Flash游戏开发,特别是针对斜45度视角的游戏设计,AStar寻路算法的应用以及地图场景中的穿梭门机制。这些技术是开发像DOTA这样的打怪游戏的关键组成部分,能够...
而"J2ME斜45度引擎"则是一种专门用于创建45度角视角的游戏引擎,这种视角常见于像素风格的冒险、动作和策略类游戏。 45度角引擎的设计主要目的是为了解决在有限的屏幕空间内展示更广阔的游戏世界,并提供更好的视觉...
在Flash ActionScript3(AS3)游戏开发中,创建斜45度视角的移动物品以及实现高效的路径寻找算法是至关重要的技术。本压缩包提供的资源着重于AS3中如何实现这些功能,特别是A*(A-Star)寻路算法的应用。 ...
标题中的“斜角tmx地图”指的是使用Tiled Map Editor(TMX)创建的一种地图格式,它支持45度角的斜向视角,通常用于2D游戏开发中,以实现类似3D效果的视觉表现。TMX是XML为基础的文件格式,用于存储地图的结构、图块...
例如,当用户在屏幕上点击一个位置时,我们需要将这个2D屏幕坐标转换为45度网格中的坐标,这涉及到勾股定理的应用。同时,我们还要考虑缩放和滚动操作,确保用户在不同视图下仍能精确地编辑地图。 编辑器的界面设计...
在Java游戏开发中,斜视角(也称为45度视角或等轴投影)是一种常见的视觉表现手法,它为玩家提供了比正交视角更广阔的视野,同时又保留了比3D视角更简单的图形处理。这个资源包"Java游戏中斜视角编辑器及引擎源代码...
《RPG游戏45度视角地图与A*寻路算法详解》 在计算机游戏开发领域,尤其是角色扮演游戏(Role-Playing Game,简称RPG)中,45度角地图渲染和寻路算法是两个至关重要的技术。本资源“RGP游戏人物45度地图+A星寻路算法...
《Visual C++与HGE游戏引擎:构建斜45度视角的伪2.5D世界》 在游戏开发领域,Visual C++(VC++)是一种常用的语言,它结合了Microsoft的MFC库和C++的强大功能,使得开发者能够创建高性能的应用程序,包括游戏。HGE...
实现斜等测投影通常涉及计算每个顶点的二维坐标。这需要编写计算函数,根据物体的三维坐标和预设的投影参数(如投影平面与坐标轴的夹角)进行转换。这些代码可能会使用如OpenGL的顶点着色器来处理。 6. **学习资源...
在游戏开发领域,45度角地图人物行走寻路是一个重要的技术点,它涉及到游戏引擎、图形渲染以及路径规划算法等多个方面。在这个场景下,人物角色需要在一个45度倾斜的地图上进行移动,并且能够自动寻找到达目标点的...
这涉及到矩阵运算,例如使用透视投影或轴对齐的投影矩阵,将3D空间的物体投射到2D屏幕上,从而营造出斜角视角。 2. **贴图技术**:DDraw允许开发者使用纹理贴图来给游戏对象上色。在斜角游戏中,每个物体可能需要多...
在45度地图编辑器中,菱形绘制可能涉及到以下几个关键技术点: 1. **坐标系统**:为了在45度角度下正确地渲染菱形,需要重新定义坐标系统,使得每个菱形的边与屏幕的对角线平行。 2. **图形渲染**:AS3的`Graphics`...
这通常涉及到数学变换,例如使用旋转和缩放来将正方形地图转换为45度倾斜视角。 二、3D模型集成 在LayaAir中,我们可以导入3D模型资源,这些模型可以来自Blender、Maya等3D建模软件。LayaAir支持FBX、OBJ等多种3D...
这里提到的“斜45度寻路实现函数”是针对特定的游戏或图形环境设计的,它涉及到坐标系统转换,以便在45度角度网格上进行寻路计算。下面我们将详细探讨这两个核心函数`xy45`和`rot45`的工作原理以及它们在寻路算法中...
综上所述,"网络游戏-利用自拍杆实现的游戏控制方法、装置及计算设备"是一个将现实世界中的物理动作与虚拟游戏世界相结合的创新尝试,它涉及到传感器技术、数据处理、硬件兼容性以及用户体验等多个方面的综合考量。...
加速度计在倾斜检测中的应用是一个重要的知识点,这个知识点不仅涉及到了物理传感器的基本原理,还涉及到了信号处理、误差校准以及在不同领域中的应用。以下是根据所提供的文件内容进行的详细解释。 首先,加速度计...
在本资源"基于Java的游戏中斜视角编辑器及引擎源代码.zip"中,我们主要探讨的是使用Java编程语言实现的游戏开发技术,特别是涉及到斜视角(Isometric)游戏编辑器和引擎。这种视角常用于策略游戏、模拟游戏以及部分...