java - 我将如何填充单元格网格以在 Java 中进行寻路?
问题描述
所以对于这个任务,我正在尝试绘制一个单元格网格,每个单元格都可以用于寻路导航。已经向我们提供了一些代码,但它不完整,我有点理解这里发生了什么,但我不确定如何仅在视觉上填充一个单元格,以便我可以让它用循环填充整个屏幕字段。
所以我想基本上我要问的是如何让这些细胞生成视觉而不是图像?这就是我迷路的地方,解决这个问题后,我应该不会有其他问题。
这是代码:
MainActivity.Java
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final Object CELL_SIZE = DrawSurface.CELL_SIZE;
GridView gridView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button credits = findViewById(R.id.btnCredits);
credits.setOnClickListener(this);
Button inventory = findViewById(R.id.btnInventory);
inventory.setOnClickListener(this);
/*
Rect mFieldDim = new Rect();
Integer[] cellNum = new Integer[0];
final int mCellCols = (int) Math.ceil((float) mFieldDim.width() / (float) CELL_SIZE);
int mCellRows = (int) Math.ceil((float) mFieldDim.height() / (float) CELL_SIZE);
// creates cells
int mCells = mCellCols * mCellRows;
System.out.println("you cells"+mCells);
for(int c =0; c < mCells ; c++){
cellNum[c] = c;
System.out.println("you number list "+ cellNum[c]);
}
final Integer[] numbers = DrawSurface.getCells();
gridView = findViewById(R.id.gridView1);
ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(this, android.R.layout.simple_list_item_1, numbers);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
Toast.makeText(getApplicationContext(),
((TextView) v).getText(), Toast.LENGTH_SHORT).show();
}
});*/
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btnCredits) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Made by");
dialog.setMessage("Zedman \nMGMS | APM\n8/17/2019");
dialog.setPositiveButton(" OK ", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int button) {
dialog.dismiss();
}
});
dialog.show();
} else if (v.getId() == R.id.btnInventory) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Inventory");
dialog.setPositiveButton(" OK ", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int button) {
dialog.dismiss();
}
});
dialog.show();
}
}
}
绘图表面.Java
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
public class DrawSurface extends SurfaceView implements View.OnTouchListener {
private static Bitmap mBMPStart;
private SurfaceHolder surfaceHolder;
private Bitmap mBMPEnd;
//private Bitmap mBMPStart;
private Bitmap mBMPShakey;
public int mCellCols;
public int mCellRows;
Canvas c;
//NavCell[][] mItems = loadNewMap();
public static int CELL_SIZE = 64;
public NavCell[][] loadNewMap() {
System.out.println("loadmap init ");
// creates cells
NavCell[][] mCells = new NavCell[mCellCols][mCellRows];
//System.out.println( "Rows " + mCellRows + " and Cols: " + mCellCols);
for (int j = 0; j < 18; j++) {
System.out.println("inside rows "+j);
if(mCells[j] != null) {
for (int i = 0; i < mCellCols; i++) {
System.out.println("inside columns " + i);
mCells[j][i] = new NavCell();
mCells[j][i].setBounds(
i * CELL_SIZE,
j * CELL_SIZE,
(i * CELL_SIZE) + CELL_SIZE,
(i * CELL_SIZE) + CELL_SIZE);
//drawCells(i, j);
// System.out.println( "Lazer-3 " + CELL_SIZE);
// System.out.println( "Lazer-4 " + i);
Canvas canvas = new Canvas();
drawCells(canvas, j, i);
}
}
System.out.println( "Lazer-2 " + mCells);
}
// Set start cell
// NavCell mCellStart = mCells[mCellRows / 4][mCellCols / 2];
// Object mCellEnd = null;
// Set blockers
int midRow = mCellRows / 2;
for (int j = 0; j < mCellRows; j++)
for (int i = 0; i < mCellCols; i++)
if (j == midRow && i > 0 && i < mCellCols - 1)
mCells[j][i].setImpassable();
// Connect cells
for (int j = 0; j < mCellRows; j++) {
for (int i = 0; i < mCellCols; i++) {
if (i > 0 && mCells[j][i - 1].isPassable())
mCells[j][i].setNeighbor(0, mCells[j][i - 1]);
if (i > 0 && mCells[j - 1][i].isPassable())
mCells[j][i].setNeighbor(1, mCells[j - 1][i]);
if (i < mCellCols - 1 && mCells[j][i + 1].isPassable())
mCells[j][i].setNeighbor(2, mCells[j][i + 1]);
if (i < mCellCols - 1 && mCells[j + 1][i].isPassable())
mCells[j][i].setNeighbor(1, mCells[j + 1][i]);
}
}
System.out.println("thank god at least I am here");
return mCells;
}
public DrawSurface(Context context) {
super(context);
init();
System.out.println( "init worked 1 ");
}
public DrawSurface(Context context,
AttributeSet attrs) {
super(context, attrs);
init();
System.out.println( "init worked 2 "); // this gets called
}
public DrawSurface(Context context,
AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
System.out.println( "init worked 3 ");
}
// Updated init code
public void init() {
surfaceHolder = getHolder();
mBMPEnd = BitmapFactory.decodeResource(getResources(), R.drawable.end);
mBMPStart = BitmapFactory.decodeResource(getResources(), R.drawable.start);
mBMPShakey = BitmapFactory.decodeResource(getResources(), R.drawable.shakey);
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas c = holder.lockCanvas();
Rect mFieldDim = new Rect();
if (c != null) mFieldDim.set(0, 0, c.getWidth(), c.getHeight());
mCellCols = (int) Math.ceil((float) mFieldDim.width() / CELL_SIZE);
mCellRows = (int) Math.ceil((float) mFieldDim.height() / CELL_SIZE);
invalidate();
System.out.println( "Canvas sets up?");
loadNewMap();
System.out.println( "LoadMap sets up?");
// drawGrid(c.getWidth(), c.getHeight() );
holder.unlockCanvasAndPost(c);
invalidate();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
});
//getCells();
findViewById(R.id.dsField);
setWillNotDraw(false);
setOnTouchListener(this);
}
/* protected void drawGrid(float X, float Y) {
int mCells = mCellCols * mCellRows;
System.out.println("my cells"+mCells);
for(int c =0; c < mCells ; c++){
cellNum[c] = c;
System.out.println("my number list "+ cellNum[c]);
}
}*/
public void drawCells(Canvas canvas, int X, int Y) {
mBMPStart = BitmapFactory.decodeResource(getResources(), R.drawable.start);
canvas.drawBitmap(mBMPStart, X, Y, null);
}
// public static final Integer[] getCells(){
// Rect mFieldDim = new Rect();
// Integer[] cellNum = new Integer[0];
// int mCellCols = (int) Math.ceil((float) mFieldDim.width() / CELL_SIZE);
// int mCellRows = (int) Math.ceil((float) mFieldDim.height() / CELL_SIZE);
//
// // creates cells
// int mCells = mCellCols * mCellRows;
// for(int c =0; c < mCells ; c++){
// cellNum[c] = c;
// System.out.println("my number list "+ cellNum[c]);
// }
//
// return cellNum;
//
// }
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
/*
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
float X = event.getX();
float Y = event.getY();
dataX.add(X);
dataY.add(Y);
if (surfaceHolder.getSurface().isValid()) {
Canvas canvas = surfaceHolder.lockCanvas();
canvas.drawBitmap(mBMPEnd, 0, 0, null);
for (int i = 0; i < dataX.size(); i++) {
drawEnd(canvas, dataX.get(i), dataY.get(i));
System.out.println(dataX);
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
return true;
}*/
}
导航单元.Java
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.SurfaceView;
import java.util.Comparator;
import static android.graphics.Color.GREEN;
public class NavCell {
private Bitmap mBMPEnd;
// Setup
private Rect mBounds;
private Point mCentroid;
private boolean mPassable;
private NavCell[] mNeighbors;
// Pathing
private float mCost;
private float mCostFinal;
private NavCell mPrevious;
private int GridRow;
private int GridColumn;
public int X;
public int Y;
public int H;
public int W;
//Color cellColor = new Color();
public NavCell() {
setBounds(X, Y, H, W);
Canvas canvas = null;
}
public void setBounds( int i, int i1, int i2, int i3) {
// System.out.println("setBounds called");
}
public void setImpassable() {
System.out.println("setImpassable called");
}
public boolean isPassable() {
System.out.println("isImpassable called");
return true;
}
public void setNeighbor(int i, NavCell navCell) {
System.out.println("setNeighbor called");
}
/*
public void update(float cost, float costFinal, NavCell prev) {
mCost = cost;
mCostFinal = costFinal;
mPrevious = prev;
}
public void reset() {
mCost = mCostFinal = Float.MAX_VALUE;
mPrevious = null;
}
public static Comparator<NavCell> NavCellByFinalCostComparator = new Comparator<NavCell>() {
@Override
public int compare(NavCell x, NavCell y) {
if (x.mCostFinal < y.mCostFinal) {
return -1;
}
if (x.mCostFinal > y.mCostFinal) {
return 1;
}
return 0;
}
};
*/
}
解决方案
推荐阅读
- django - 尝试使用 WeasyPrint 保存 PDF 字符串会导致 UnicodeDecodeError
- php - 仅从具有内部联接的第三个表中获取 1 行
- safari - 在 Safari 应用程序扩展中捕获网页的屏幕截图
- linux - centos服务器中检查空闲内存的问题
- ruby-on-rails - 如何在 Rails 中查询包含单引号的 jsonb 字段和值?
- c++ - 不同文件中的 C++ 类继承
- css - 引导表:输入和按钮在 TD 中的高度不同
- angular - 离子标签菜单未显示或无法从右侧滑入
- ios - 自定义推送通知未使用 firebase 接收
- asp.net - 即使条件为假,验证器/控件也将始终执行