- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在创建一个基于 Tile 的游戏,它基本上使用两组 boolean 数组来绘制迷宫,以确定每面墙需要绘制的位置。
我让这一切正常工作,只绘制了 5 x 5 的迷宫部分(整个迷宫大小为 30 x 30)。但是,我遇到的问题是当我移动角色时,整个屏幕会跳动,这是因为正在绘制迷宫的下一部分,以保持 5 x 5 的纵横比。我已经尝试了各种不同的方法来尝试使它顺利运行,但似乎无法做到这一点。
有人可以建议或指导我一些链接/示例,以便我可以顺利进行迷宫和角色移动。下面是关于当前绘制迷宫的主 for 循环的一些基本代码,以及它引用的 2 个 boolean 数组以绘制墙壁。
// THE CODE TO DRAW THE MAZE AND ITS WALLS
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
float x = j * totalCellWidth;
float y = i * totalCellHeight;
if(currentY != 0)
indexY = i + currentY - 1;
else
indexY = i + currentY;
if(currentX != 0)
indexX = j + currentX - 1;
else
indexX = j + currentX;
// Draw Verticle line (y axis)
if (indexY < vLength && indexX < vLines[indexY].length && vLines[indexY][indexX])
{
RectOuterBackground.set((int)x + (int)cellWidth, (int)y, (int)x + (int)cellWidth + 15, (int)y + (int)cellHeight + 15);
canvas.drawBitmap(walls, null, RectOuterBackground, null);
}
// Draws Horizontal lines (x axis)
if (indexY < hLength && indexX < hLines[indexY].length && hLines[indexY][indexX])
{
RectOuterBackground.set((int)x, (int)y + (int)cellHeight,(int)x + (int)cellWidth + 15,(int)y + (int)cellHeight + 15);
canvas.drawBitmap(walls, null, RectOuterBackground, null);
}
}
}
// THE 2 BOOLEAN ARRAYS THE FORLOOP REFERENCES
boolean[][] vLines = new boolean[][]{
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true },
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true },
{true ,true ,true ,false,false,false,true ,false,false,true ,true },
{true ,true ,true ,false,false,true ,false,true ,true ,true ,true },
{true ,true ,false,true ,false,false,true ,false,false,true ,true },
{true ,true ,false,true ,true ,false,false,false,true ,true ,true },
{true ,true ,true ,false,false,false,true ,true ,false,true ,true },
{true ,true ,false,true ,false,false,true ,false,false,true ,true },
{true ,true ,false,true ,true ,true ,true ,true ,false,true ,true },
{true ,true ,false,false,false,true ,false,false,false,true ,true },
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true },
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true }
};
boolean[][] hLines = new boolean[][]{
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true },
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true },
{true ,true ,false,false,true ,true ,false,false,true ,false,true ,true },
{true ,true ,false,false,true ,true ,false,true ,false,false,true ,true },
{true ,true ,true ,true ,false,true ,true ,false,true ,true ,true ,true },
{true ,true ,false,false,true ,false,true ,true ,false,false,true ,true },
{true ,true ,false,true ,true ,true ,true ,false,true ,true ,true ,true },
{true ,true ,true ,false,false,true ,false,false,true ,false,true ,true },
{true ,true ,false,true ,false,false,false,true ,false,true ,true ,true },
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true },
{true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true ,true }
};
如果我能顺利地绘制那部分代码,我愿意完全重写它,但是尝试了几种不同的变体却不能让它顺利,我总是有跳跃。
我也试图让它与 Canvas 翻译一起工作,通过绘制 whoel 迷宫,然后缩放它以便只显示 5 x 5 然后简单地移动缩放部分使用翻译,同时保持角色在屏幕中央,那里有平滑的运动。但是,我无法让翻译顺利进行。
最佳答案
这是一个完整的迷宫类。它将 View 绘制到坐标 viewX 和 viewY 上,它们可以平滑移动(如 Boudjnah 的回答)或乘以单元尺寸。
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.RectF;
public class Maze {
private RectF drawRect = new RectF();
private Bitmap[] bitmaps;
private int[][] tileType;
private float screenWidth, screenHeight;
/**
* Initialize a new maze.
* @param wallBitmap The desired bitmaps for the floors and walls
* @param isWall The wall data array. Each true value in the array represents a wall and each false represents a gap
* @param xCellCountOnScreen How many cells are visible on the screen on the x axis
* @param yCellCountOnScreen How many cells are visible on the screen on the y axis
* @param screenWidth The screen width
* @param screenHeight The screen height
*/
public Maze(Bitmap[] bitmaps, int[][] tileType, float xCellCountOnScreen, float yCellCountOnScreen, float screenWidth, float screenHeight){
this.bitmaps = bitmaps;
this.tileType = tileType;
this.screenWidth = screenWidth;
this.screenHeight = screenHeight;
drawRect.set(0, 0, screenWidth / xCellCountOnScreen, screenHeight / yCellCountOnScreen);
}
/**
* Get the type of the cell. x and y values are not coordinates!
* @param x The x index of the cell
* @param y The y index of the cell
* @return The cell type
*/
public int getType(int x, int y){
if(y < tileType.length && x < tileType[y].length) return tileType[y][x];
return 0;
}
public float getCellWidth(){ return drawRect.width(); }
public float getCellHeight(){ return drawRect.height(); }
/**
* Draws the maze. View coordinates should have positive values.
* @param canvas Canvas for the drawing
* @param viewX The x coordinate of the view
* @param viewY The y coordinate of the view
*/
public void drawMaze(Canvas canvas, float viewX, float viewY){
int tileX = 0;
int tileY = 0;
float xCoord = -viewX;
float yCoord = -viewY;
while(tileY < tileType.length && yCoord <= screenHeight){
// Begin drawing a new column
tileX = 0;
xCoord = -viewX;
while(tileX < tileType[tileY].length && xCoord <= screenWidth){
// Check if the tile is not null
if(bitmaps[tileType[tileY][tileX]] != null){
// This tile is not null, so check if it has to be drawn
if(xCoord + drawRect.width() >= 0 && yCoord + drawRect.height() >= 0){
// The tile actually visible to the user, so draw it
drawRect.offsetTo(xCoord, yCoord); // Move the rectangle to the coordinates
canvas.drawBitmap(bitmaps[tileType[tileY][tileX]], null, drawRect, null);
}
}
// Move to the next tile on the X axis
tileX++;
xCoord += drawRect.width();
}
// Move to the next tile on the Y axis
tileY++;
yCoord += drawRect.height();
}
}
}
要使用这个类,首先像这样在你的onCreate函数中初始化它
// 0 == floor, 1 == wall, 2 == different looking wall
int[][] maze = {
{0, 0, 0, 0, 0},
{0, 1, 2, 1, 0},
{0, 0, 0, 1, 0},
{1, 1, 2, 1, 0},
{0, 0, 0, 0, 0}
};
Bitmap[] bitmaps = {
BitmapFactory.decodeResource(getResources(), R.drawable.floor),
BitmapFactory.decodeResource(getResources(), R.drawable.firstwall)
BitmapFactory.decodeResource(getResources(), R.drawable.secondwall)
};
// Chance the 480 and 320 to match the screen size of your device
maze = new Maze(bitmaps, maze, 5, 5, 480, 320);
然后在你的 onDraw 或类似的函数中绘制它
maze.draw(canvas, viewX, viewY);
getType(int x, int y)、getCellWidth() 和 getCellHeight() 函数应该可以帮助您实现与迷宫的任何交互。您还可以将自己的函数添加到类中。您还可以修改此类以记录任何开始和结束的图 block 。我不会为你制作整个游戏:)
如果您将角色设置为坐标 (x, y) 并将其绘制到坐标 (x - viewX, y - viewY),无论 View 位于何处,您都可以相对于迷宫拥有一个固定的位置。
希望对您有所帮助!
关于java - Android - 以平滑的角色移动在 Canvas 上绘制迷宫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20747138/
我用 geom_line 和 geom_ribbon 创建了一个图(图 1),结果还不错,但为了美观,我希望线条和丝带更平滑。我知道我可以使用 geom_smooth 作为线条(图 2),但我不确定是
我正在使用 Javascript 制作 HTML5 Canvas 游戏。 我想让一个物体平滑地转向某个方向。 我将方向存储为变量,并使用弧度。代码的工作原理如下: window.setInterval
我正在尝试平滑数字列表,出于绘图目的,我不想绘制超过 5000 个项目的图表,因为渲染时间太长,而且我们不需要额外的数据。 假设我们有一个简单的列表: let v = [1,2,3]; // max
我正在尝试制作一款倒置飞扬的小鸟游戏,但我面临一个大问题。 我尝试从上到下生成管道障碍物,但动画看起来很像文本编辑器,而且不流畅,所以我该如何平滑它?我尝试使用 requestanimationfra
我有一些数据由不均匀采样的 2D 空间位置组成,其中每个 x, y 坐标都有一个介于 0 和 2pi 之间的相关相位值 theta。我希望能够将 theta 值插入到常规 x, y 网格中。在相同(或
我有一个(3D)直方图,我喜欢对其应用高斯平滑: cv::MatND Hist; 在 1D 和 2D 情况下,我通过以下方式对其进行模糊处理: cv::GaussianBlur(Hist, Hist,
我的应用程序通过调整其 alpha 值在各种媒体和文本层之间淡入淡出。然而,当使用线性交叉淡入淡出时,亮度似乎在中途“下降”,然后又淡出。经过一番搜索,我找到了 this answer这解释了这个问题
我必须在屏幕上拖动一些 View 。我正在通过触摸监听器的 ACTION_MOVE 上的运动事件更改其布局参数的左侧和顶部来修改它们的位置。有没有办法让“拖动”元素更顺畅?因为这种“拖拽”一点也不顺畅
我只想问有没有你推荐的资源描述Image smoothing简单地。 谢谢。 最佳答案 就像一些评论者提到的那样,图像平滑可能意味着很多事情。但主要是,当有人使用这个术语时,他们的意思是模糊或低通滤波
我有一个带有简单视差的 React 组件,可以更改顶部和不透明度值。问题是滚动动画有点不稳定。有什么办法可以平滑过渡吗?我在 vanilla JS 中使用 requestAnimationFrame(
我在使用 libGDX 获得平滑字体时遇到问题。我已经在这个网站上搜索,并在谷歌上,我尝试了这些问题的解决方案here和 here ,但我的字体渲染效果总是很差。 示例: 我尝试了多种方法,总是得到与
我正在尝试为 Himmelblau's function 绘制一个简单的等高线图(在 gnuplot 中)使用以下代码: f(x,y)=(((x**2)+(y)-11)**2)+(((x)+(y**2
我想知道如何平滑 JScrollPane 的自动过渡。我正在使用 JScrollBar scroll = scollpane.getVerticalScrollBar(); scroll.setVal
我有一个高分辨率的healpix贴图(nside = 4096),我想在给定半径(假设为10 arcmin)的圆盘中对其进行平滑处理。 对healpy非常陌生,在阅读了文档后,我发现一种不太好的方法是
我使用下面的代码在 anchor 链接上平滑滚动 jQuery(function() { jQuery('a[href*=#]:not([href=#])').click(function() {
与这个问题非常相似:Rx IObservable buffering to smooth out bursts of events ,我有兴趣消除可能突然发生的可观察量。 希望下图说明我的目标: Ra
我正在开发代码战链接(一个 div)。我希望 div 内的 svg 在悬停时连续旋转。产生的悬停效果远非平滑,当鼠标在其上滚动时 svg 会跳跃。 mouseout 事件被注释掉了,因为它值得。优化这
有没有办法平滑转换(平移和旋转)的 BufferedImage 的锯齿状边缘? 测试图像的放大 View : (请注意,这不是将要使用的实际 BufferedImage,仅用于此处演示)。 已使用双线
为什么这没有产生平滑的圆?有什么想法吗? public void draw(ShapeRenderer sRenderer) { sRenderer.begin(ShapeType.Fille
我正在做一个项目,我的 ImageView 包含文本和曲线。当在计算机上查看图形时,它们看起来很好。如果带有 ImageView 的应用程序加载到 iPad 2 上,文本(字体:helvetica n
我是一名优秀的程序员,十分优秀!