首页 > 解决方案 > 我将如何填充单元格网格以在 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;
    }
};

*/




}

标签: javaandroid

解决方案


推荐阅读