显示给定某一点所能达到的距离范围.
仿机器人大战的移动力及射程范围计算.
思路:
– 四边形方格地图上, 给定两个点的距离差值其实是两个点格子坐标差的绝对值的和.
鼠标位置:选择中心点
[F]:改变移动力
[Q]:退出程序
在2.0内制作, 用3.0以上运行可能会报错:
int pbScale= 12;
int pbGridScale =16;
int pbGridFill =16;
//--
int pbTargetX =0;
int pbTargetY =0;
int pbMAbility=4;
//--
ArrayList<EcMask> pbMaskList;
public void setup() {size(320, 240);noStroke();frameRate(16);textAlign(LEFT, TOP);ellipseMode(CENTER);
frame.setTitle("...UnitMap");
//--
pbMaskList=new ArrayList<EcMask>();
int lpCapa=pbScale*pbScale;
for(int i=0;i<lpCapa;i++){
int lpX=i%pbScale;
int lpY=i/pbScale;
pbMaskList.add(new EcMask(lpX, lpY));
}
//--
}//+++
public void draw(){background(0);
//--
for(EcMask it:pbMaskList){
if(it.ccIsMouseOver()){
pbTargetX=it.cmGridX;
pbTargetY=it.cmGridY;
}
it.ccUpdate();
}
}//+++
public void keyPressed(){switch(key){
//--
case 'f':
pbMAbility++;pbMAbility&=0x07;
pbMAbility=pbMAbility==0?1:pbMAbility;
break;
//--
case 'q':fsPover();
default:break;
}}//+++
void fsPover(){
exit();
}//+++
class EcMask{
int cmGridX, cmGridY;
int cmAbsoX, cmAbsoY;
int cmGridDist;
//--
EcMask(int pxGridX, int pxGridY){
cmGridX=pxGridX;cmAbsoX=0;
cmGridY=pxGridY;cmAbsoY=0;
cmGridDist=0;
}
//--
void ccUpdate(){
cmAbsoX=cmGridX*pbGridFill;
cmAbsoY=cmGridY*pbGridFill;
cmGridDist=
(int)abs(pbTargetX-cmGridX)+
(int)abs(pbTargetY-cmGridY);
int lpColor=ccIsMouseOver()?color(0xEE,0xEE,0x33):
(cmGridDist<=pbMAbility?0xAA:0x55);
fill(lpColor); rect(cmAbsoX, cmAbsoY, pbGridScale, pbGridScale);
}
//--
boolean ccIsMouseOver(){return ccIsContaining(mouseX, mouseY);}
//--
boolean ccIsContaining(int pxX, int pxY){
return (pxX>cmAbsoX)&&(pxX<cmAbsoX+pbGridScale)&&
(pxY>cmAbsoY)&&(pxY<cmAbsoY+pbGridScale);
}
}//+++
//EOF
- 本文固定链接: http://iprocessing.cn/2018/10/31/习作da_四边方格地图的距离计算/
- 转载请注明: constrain 于 Processing编程艺术 发表