首页 > Sktech > 习作DA_四边方格地图的距离计算
2018
10-31

习作DA_四边方格地图的距离计算

习作DA_四边方格地图的距离计算 - 第1张  | Processing编程艺术

 


显示给定某一点所能达到的距离范围.
仿机器人大战的移动力及射程范围计算.


思路:
– 四边形方格地图上, 给定两个点的距离差值其实是两个点格子坐标差的绝对值的和.


鼠标位置:选择中心点
[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

 



最后编辑:
作者:constrain
constrain
nullpointerexception

留下一个回复

你的email不会被公开。