Crear un gráfico al azar, seno como sprite paisaje

Digamos que tengo este sprite:

Ejemplo de sprite

Y he creado un paisaje aleatorio durante el tiempo de ejecución:

Paisaje dinámico de tiempo de ejecución

Y entonces, quiero azulejar el área debajo de la línea con el sprite:

Introduzca aquí la descripción de la imagen

Este es el terreno de juego, por lo tanto también debe ser un objeto de física (En Box2D) .

Aquí , él dio una muestra de cómo hacer esto un cuerpo de la física. Entonces, ¿cómo hago la parte de gráficos en el código?

EDIT: Mirando en los ejemplos de AndEngine, el archivo RepeatingSpriteBackgroundExample.java , no es exactamente lo que necesito, pero ¿debo seguir con esta idea y cambiar la clase de RepeatingSpriteBackground para mis necesidades? No creo que sea el mejor método sin embargo …

Gracias por adelantado.

Realmente no sé sobre Box2D o AndEngine, pero pensé que esto era un problema interesante y he hecho un SurfaceView de encargo que puede dibujar un "terreno" al azar como el de su cuadro. (Esperemos que sea de utilidad para usted o alguien más, por lo menos he aprendido algunas cosas nuevas: p)

Terreno de un solo color: captura de pantalla Fondo de mosaico de fondo: captura de pantalla El mapa de bits de mosaico:
Mapa de bits de recursos

Mi código es el siguiente:

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){} } 

Si esto es de alguna ayuda para usted probablemente tendrá que jugar con los parámetros para obtener formas que se adapte a sus necesidades y lo más probable es agregar un parámetro para la distancia mínima entre puntos, etc También es una buena idea para optimizar el dibujo de El fondo un poco, como dibujar desde la parte inferior hasta la altura máxima del terreno, para minimizar el dibujo a las áreas invisibles. También debería ser posible reducir la cantidad de llamadas a getHeight () y getWidth ().

¡Aclamaciones!

  • Los colores de ShapeRenderer dejan de funcionar al renderizar imágenes con SpriteBatch
  • Sprite.setImage () en andengine
  • libgdx spritebatch no dibuja basado en el origen de una textura
  • AndEngine Sprite / Box2D La eliminación del cuerpo bloquea mi programa sin información de error / excepción?
  • Animación de sprites en Cocos2d android
  • ¿Los OpenGL Point Sprites funcionan en Android?
  • No se puede encontrar el ejemplo adecuado para la clase de sprite de OpenGL 2d que no usa GL11Ext para dibujar
  • Android: ¿Hay alguna manera de acelerar canvas.drawBitmap?
  • Andengine Sprites aparecen como cajas negras
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.