gpt4 book ai didi

android - 创建一个随机的正弦图,如风景 Sprite

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:56 27 4
gpt4 key购买 nike

假设我有这个 Sprite :

Sample sprite

我在运行时创建了一个随机景观:

Dynamic runtime landscape

然后,我想用 Sprite 平铺线下方的区域:

enter image description here

这是游戏 field ,因此它也应该是一个物理对象(在 Box2D 中)

Here , 他给出了一个如何使它成为物理体的示例。那么,如何在代码中完成图形部分?

编辑: 查看 AndEngine 示例,文件 RepeatingSpriteBackgroundExample.java ,这不是我需要的,但我应该坚持这个想法并更改 RepeatingSpriteBackground class为了我的需要?然而,我认为这不是最好的方法......

提前致谢。

最佳答案

我不太了解 Box2D 或 AndEngine,但我认为这是一个有趣的问题,并制作了一个自定义 SurfaceView,它可以像您图片中的那样绘制随机“地形”。 (希望它对你或其他人有用,至少我学到了一些新东西 :p)

单色地形: screenshot平铺背景地形: screenshot平铺位图:
resource bitmap

我的代码如下:

public class PathView extends SurfaceView implements SurfaceHolder.Callback{
private class DrawingRunnable implements Runnable{
private final static int minPointsOnScreen = 3;
SurfaceHolder surfaceHolder;
Random rand = new Random();

private Path path;
private Paint pathPaint;
Bitmap background;
private Paint tilePaint;

volatile boolean running = false;

int width;
int height;
int maxHeight;

protected DrawingRunnable(SurfaceHolder sh){
surfaceHolder = sh;

pathPaint = new Paint();
pathPaint.setColor(0xFF000000);
pathPaint.setStrokeWidth(4);

tilePaint = new Paint();
}

protected void createPath(){
path = new Path();
path.setFillType(Path.FillType.WINDING);

path.setLastPoint(0, height);
int lastX = 0, lastY = height - rand.nextInt(maxHeight);
path.lineTo(lastX,lastY);

int newX=lastX, newY=lastY;

do{
lastX = newX; lastY = newY;
newX += rand.nextInt(width/minPointsOnScreen);
newY = height - rand.nextInt(maxHeight);
path.cubicTo(
interpolateLinear(lastX, newX, 0.333f),
lastY,
interpolateLinear(lastX, newX, 0.666f),
newY,
newX, newY);
}while(newX <= width);

path.lineTo(width, height);
}

private int interpolateLinear(int start, int end, float part){
return (int) (start*(1-part) + end*part);
}

@Override
public void run(){
while(running){
Canvas c = null;
try{
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
doDraw(c);
}
} finally{ if(c!=null) surfaceHolder.unlockCanvasAndPost(c); }
SystemClock.sleep(40);
}
}

private void doDraw(Canvas c){
c.drawColor(0xFFFFFFFF);
//c.drawPath(path, pathPaint); //Use this to draw a single-colour. (First screenshot)
c.clipPath(path);
for(int y = 0; y+background.getHeight() < height+background.getHeight(); y+=background.getHeight()){
for(int x = 0; x+background.getWidth() < width+background.getWidth(); x+=background.getWidth()){
c.drawBitmap(background, x, y, tilePaint);
}
}
}
}

private ExecutorService exec;
private SurfaceHolder holder;
private DrawingRunnable drawer;

public PathView(Context c){ super(c); init(c); }
public PathView(Context c, AttributeSet as){ super(c, as); init(c); }
public PathView(Context c, AttributeSet as, int defStyle){ super(c, as, defStyle); init(c); }

private void init(Context c){
exec = Executors.newSingleThreadExecutor();
holder = getHolder();
holder.addCallback(this);
}

public void surfaceCreated(SurfaceHolder sh){
if( drawer == null ){
drawer = new DrawingRunnable(holder);
drawer.width = getWidth();
drawer.height = getHeight();
drawer.maxHeight = drawer.height/2;
drawer.createPath();
drawer.background = BitmapFactory.decodeResource(getResources(), R.drawable.tile);
}
drawer.running = true;
exec.execute(drawer);
}
public void surfaceDestroyed(SurfaceHolder sh){
drawer.running = false;
}
public void surfaceChanged(SurfaceHolder sh, int format, int width, int height){}
}

如果这对您有任何帮助,您可能需要尝试使用这些参数来获得适合您需要的形状,并且很可能会添加一个参数来确定点之间的最小距离等。稍微优化背景的绘制也是一个好主意,比如从底部向上绘制到地形的最大高度,以尽量减少对不可见区域的绘制。我还应该可以减少对 getHeight() 和 getWidth() 的调用量。

干杯!

关于android - 创建一个随机的正弦图,如风景 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298477/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com