tilemapmouselistener.java
来自「mywork是rcp开发的很好的例子」· Java 代码 · 共 76 行
JAVA
76 行
package es.org.chemi.games.sokoban.events;
import java.util.List;
import net.sf.pim.game.util.AStar;
import net.sf.pim.game.util.DiamondMap;
import net.sf.pim.game.util.DiamondMap.IsoDirection;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import es.org.chemi.games.sokoban.ui.Tile;
import es.org.chemi.games.sokoban.ui.TileMap;
import es.org.chemi.games.sokoban.util.Constants;
/**
* 处理寻径
* 定义MoveHelper中step为static变量来防止在移动过程中再次点击
* @author levin
*/
public class TileMapMouseListener extends MouseAdapter {
private TileMap map = null;
public TileMapMouseListener(TileMap map) {
super();
this.map = map;
}
public void mouseUp(MouseEvent e) {
AStar star = new AStar(convertTilesMap(),new int[]{1});
final Point start=new Point(map.getBoyTile().getRow(),map.getBoyTile().getColumn());
//1.鼠标坐标转换为地图坐标
Point mouseMapper = DiamondMap.mouseMapper(new Point(e.x,e.y), Constants.TILE_SIZE, Constants.TILE_SIZE/2, map.getDeltaWidth(), map.getDeltaHeight());
//都向正北偏移一位,因为实际贴较长为48*48,而地板都分布在下半区
Point end = DiamondMap.tileWalker(new Point(mouseMapper.y,mouseMapper.x),IsoDirection.NORTH);
//2.寻径
final List<Point> list=star.searchPath(start, end);
//3.显示移动
showTrack(list);
new MoveHelper(map).move(list);
}
private void showTrack(List<Point> list) {
if(list == null)
return;
resetTrack();
for(Point p:list){
map.getTiles()[p.x][p.y].setTrack(true);
map.getTiles()[p.x][p.y].setModified(true);
}
map.redraw();
}
private void resetTrack(){
for(int i=0;i<map.getTiles().length;i++)
for(int j=0;j<map.getTiles()[0].length;j++)
if(map.getTiles()[i][j].isTrack())
map.getTiles()[i][j].setTrack(false);
}
//转换tiles数组为int数组
private int[][] convertTilesMap(){
Tile[][] tiles = map.getTiles();
int[][] searchMap=new int[tiles.length][tiles[0].length];
for(int i=0;i<tiles.length;i++)
for(int j=0;j<tiles[0].length;j++)
searchMap[i][j]=convertTile(tiles[i][j]);
return searchMap;
}
private int convertTile(Tile tile){
if(tile.isWall() || tile.isBox())
return 1;
return 0;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?