- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有这个 Sprite :
我在运行时创建了一个随机景观:
然后,我想用 Sprite 平铺线下方的区域:
这是游戏 field ,因此它也应该是一个物理对象(在 Box2D 中)。
Here , 他给出了一个如何使它成为物理体的示例。那么,如何在代码中完成图形部分?
编辑: 查看 AndEngine 示例,文件 RepeatingSpriteBackgroundExample.java ,这不是我需要的,但我应该坚持这个想法并更改 RepeatingSpriteBackground class为了我的需要?然而,我认为这不是最好的方法......
提前致谢。
最佳答案
我不太了解 Box2D 或 AndEngine,但我认为这是一个有趣的问题,并制作了一个自定义 SurfaceView,它可以像您图片中的那样绘制随机“地形”。 (希望它对你或其他人有用,至少我学到了一些新东西 :p)
单色地形: 平铺背景地形: 平铺位图:
我的代码如下:
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/
我正在使用 LinearLayout 进行设计,它适用于纵向但横向排列正确。我不使用 x,y 位置。如果我更改 xml 中的任何内容都会影响设计——我该如何设计纵向和横向? 最佳答案 您可以指定一个
在我的相机应用中,您可以在前置和后置摄像头之间切换。当我用后置摄像头拍照时,照片与预览显示的一样。但是当我切换到前置摄像头时,图片是镜像的。我认为前后摄像头处于横向模式有关系。我已经尝试了几乎所有关于
我应该同时使用横向和纵向吗 @media only screen and (min-device-width: 320px) and (max-device-width: 480px) {} 或像这样
我已经安装好了。但是,当我这样做时: go get -u github.com/dmlittle/scenery 我得到: # github.com/dmlittle/scenery/pkg/pars
我正在为 iOS7 优化网站。我发现,在 safari mobile 上将方向更改为横向时,网站会全屏显示,但浏览器会阻止 View 顶部和底部的一些高度和宽度像素。该区域中的任何触摸或点击事件都不会
我用 iOS9 移动版 safari iPhone6sPlus 检查了这个错误。 当 safari 的标签在横向模式下显示时,我无法触摸固定元素。当标签隐藏时我可以触摸它。 显示 my demo在 i
我需要一个 java 库来确定哪个图像是“人体”;这是一张“人脸”;这是一个“动物”;这是一个“风景”等等。 有这样的东西吗? 谢谢 最佳答案 我不认为那里有什么方便的东西。特别是因为你在这里有非常广
我是一名优秀的程序员,十分优秀!