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 + -
显示快捷键?