Java[伪]寻径追踪实现(由Loonframework提供)
我们都知道,在诸如魔兽的很多战略游戏中,会出现要求某A角色接近某B角色的情况(攻击或是怎么着咱不考虑……),玩家很简单的一步操作,却会引发开发者“怎么走过去”这个“复杂”的算法问题,也就是所谓的“Path-finding”——寻径。
好的寻径算法,不但能避免不必要的资源损耗,而且能令游戏友好度增加。反之则会严重影响游戏的可玩性或诸如GIS等系统的可靠性。
在本次,我以Java为例,演示一个最简单的寻径系统——甚至可以说是伪寻径系统的实现。 (^^)
首先,我们建立一个追踪者(一说到这里我就想起了生化里的掠食者……)
packageorg.test.tracker;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMi82ODEwMzU1YzJmNzhjMTJlOTFiNzk5N2E4ZThjNTgzYS5naWY=)
importjava.awt.Color;
importjava.awt.Graphics;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMi82ODEwMzU1YzJmNzhjMTJlOTFiNzk5N2E4ZThjNTgzYS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1Mi9hNDE5NTRhMjdkNmFkOTZmYTJjMmNmODE2ZTY3NzQ0OC5naWY=)
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:追踪者。
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:[email protected]
*@version0.1
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1Mi9hNDE5NTRhMjdkNmFkOTZmYTJjMmNmODE2ZTY3NzQ0OC5naWY=)
publicclassTracker...{
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintSIZE=TrackerPanel.SIZE;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
publicintx;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
publicinty;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*析构函数,默认坐标为0,0
*
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicTracker()...{
this(0,0);
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*析构函数,设定x,y坐标
*
*@paramx
*@paramy
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicTracker(intx,inty)...{
this.x=x;
this.y=y;
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*设定追踪对象
*
*@paramprey
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidchase(Objectiveobjective)...{
//始终以目标坐标矫正追踪者坐标。
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
if(x>objective.x)...{
x--;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
}elseif(x<objective.x)...{
x++;
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
if(y>objective.y)...{
y--;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
}elseif(y<objective.y)...{
y++;
}
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*绘制追踪者
*
*@paramg
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoiddraw(Graphicsg)...{
g.setColor(Color.RED);
g.fillRect(x*SIZE,y*SIZE,SIZE,SIZE);
}
}
而后,我们建立一个被追踪的目标。
packageorg.test.tracker;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMi82ODEwMzU1YzJmNzhjMTJlOTFiNzk5N2E4ZThjNTgzYS5naWY=)
importjava.awt.Color;
importjava.awt.Graphics;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMi82ODEwMzU1YzJmNzhjMTJlOTFiNzk5N2E4ZThjNTgzYS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1Mi9hNDE5NTRhMjdkNmFkOTZmYTJjMmNmODE2ZTY3NzQ0OC5naWY=)
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:被跟踪的目标对象。
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:[email protected]
*@version0.1
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1Mi9hNDE5NTRhMjdkNmFkOTZmYTJjMmNmODE2ZTY3NzQ0OC5naWY=)
publicclassObjective...{
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintSIZE=TrackerPanel.SIZE;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintUP=0;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintDOWN=1;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintLEFT=2;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintRIGHT=3;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
publicintx;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
publicinty;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*析构函数,内部转换x,y坐标。
*
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicObjective()...{
x=TrackerPanel.COL/2;
y=TrackerPanel.ROW/2;
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*析构函数,设定x,y坐标。
*
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicObjective(intx,inty)...{
this.x=x;
this.y=y;
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*移动目标
*
*@paramdir
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidmove(intdir)...{
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
switch(dir)...{
caseUP:
y--;
break;
caseDOWN:
y++;
break;
caseLEFT:
x--;
break;
caseRIGHT:
x++;
break;
}
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*绘制目标
*
*@paramg
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoiddraw(Graphicsg)...{
g.setColor(Color.BLUE);
g.fillOval(x*SIZE,y*SIZE,SIZE,SIZE);
}
}
最后,我们建立一个面板,用以绘制图形。
packageorg.test.tracker;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMi82ODEwMzU1YzJmNzhjMTJlOTFiNzk5N2E4ZThjNTgzYS5naWY=)
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Panel;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.awt.image.BufferedImage;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMi82ODEwMzU1YzJmNzhjMTJlOTFiNzk5N2E4ZThjNTgzYS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1Mi9hNDE5NTRhMjdkNmFkOTZmYTJjMmNmODE2ZTY3NzQ0OC5naWY=)
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:追踪演示面板。
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:[email protected]
*@version0.1
*/
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1Mi9hNDE5NTRhMjdkNmFkOTZmYTJjMmNmODE2ZTY3NzQ0OC5naWY=)
publicclassTrackerPanelextendsPanelimplementsRunnable,KeyListener...{
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
//设定窗体宽与高
privatestaticfinalintWIDTH=480;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintHEIGHT=480;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
//描绘的正方体大小
staticfinalintSIZE=8;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
//获得对应列数,即将frame转化为类数组的存在。
publicstaticfinalintROW=HEIGHT/SIZE;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
publicstaticfinalintCOL=WIDTH/SIZE;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
//获得对应行数
privatestaticfinalintUP=0;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintDOWN=1;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintLEFT=2;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privatestaticfinalintRIGHT=3;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
//追踪者
privateTrackertracker;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
//目标
privateObjectiveobjective;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privateThreadthread;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privateImagescreen=null;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
privateGraphicsbg=null;
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicTrackerPanel()...{
setPreferredSize(newDimension(WIDTH,HEIGHT));
setFocusable(true);
addKeyListener(this);
screen=newBufferedImage(WIDTH,HEIGHT,1);
bg=screen.getGraphics();
//追踪者初始位置,0行,0列
tracker=newTracker(0,0);
//目标初始位置,50行,50列
objective=newObjective(50,50);
thread=newThread(this);
thread.start();
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidpaint(Graphicsg)...{
//设定底色为白色,并清屏
bg.setColor(Color.white);
bg.fillRect(0,0,WIDTH,HEIGHT);
//绘制追踪者
tracker.draw(bg);
//绘制目标
objective.draw(bg);
g.drawImage(screen,0,0,this);
g.dispose();
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidupdate(Graphicsg)...{
paint(g);
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidrun()...{
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
while(true)...{
//设定追击的目标。
tracker.chase(objective);
repaint();
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
try...{
Thread.sleep(110);
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
}catch(InterruptedExceptione)...{
e.printStackTrace();
}
}
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidkeyTyped(KeyEvente)...{
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidkeyPressed(KeyEvente)...{
intkey=e.getKeyCode();
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
switch(key)...{
caseKeyEvent.VK_UP:
objective.move(UP);
break;
caseKeyEvent.VK_DOWN:
objective.move(DOWN);
break;
caseKeyEvent.VK_LEFT:
objective.move(LEFT);
break;
caseKeyEvent.VK_RIGHT:
objective.move(RIGHT);
break;
}
repaint();
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicvoidkeyReleased(KeyEvente)...{
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxMS8zN2M4YmY2OGNkYzNjYzgxNzU5YzM0MTYwNzc2YmM1My5naWY=)
publicstaticvoidmain(String[]args)...{
Framefrm=newFrame();
frm.setTitle("简单的Java图形寻径追踪实现(由Loonframework提供)");
frm.setSize(WIDTH,HEIGHT);
frm.setResizable(false);
frm.add(newTrackerPanel());
frm.setVisible(true);
}
![Java[伪]寻径追踪实现(由Loonframework提供) Java[伪]寻径追踪实现(由Loonframework提供)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzczNy82YTljMDcxYTA4ZjFkYWUyZDNlMWM1MTIwMDBlZWY0MS5naWY=)
}
这时,画面上显示的红色正方体为追踪者,蓝色圆球为被追踪目标,而无论篮球如何移动,红色正方体都将始终向篮球靠拢。
实际上,通过代码我们就可以知道,这时两者间的移动路径,被没有经过复杂的方法演算,而是以目标的坐标来决定的,颇有独孤九剑那种,敌人若是只有一招,我也只有一招,他若是有千招万招,我也自是千招万招。但是,这种方法在实际的寻径处理中,并不能很好的解决如障碍物,区域转换等问题,所以只是一种[伪]寻径,
或者说是在无障碍情况下的简单解决方案。
如果关注寻径算法在Java中的进一步实现,还请继续关注我的blog……
好的寻径算法,不但能避免不必要的资源损耗,而且能令游戏友好度增加。反之则会严重影响游戏的可玩性或诸如GIS等系统的可靠性。
在本次,我以Java为例,演示一个最简单的寻径系统——甚至可以说是伪寻径系统的实现。 (^^)
首先,我们建立一个追踪者(一说到这里我就想起了生化里的掠食者……)
而后,我们建立一个被追踪的目标。
最后,我们建立一个面板,用以绘制图形。
这时,画面上显示的红色正方体为追踪者,蓝色圆球为被追踪目标,而无论篮球如何移动,红色正方体都将始终向篮球靠拢。
实际上,通过代码我们就可以知道,这时两者间的移动路径,被没有经过复杂的方法演算,而是以目标的坐标来决定的,颇有独孤九剑那种,敌人若是只有一招,我也只有一招,他若是有千招万招,我也自是千招万招。但是,这种方法在实际的寻径处理中,并不能很好的解决如障碍物,区域转换等问题,所以只是一种[伪]寻径,
或者说是在无障碍情况下的简单解决方案。
如果关注寻径算法在Java中的进一步实现,还请继续关注我的blog……