gpt4 book ai didi

android - 如何在 Android 上正确缩放游戏

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:03 24 4
gpt4 key购买 nike

为简单起见,我们假设我正在为 Android 制作一个简单的 Pong 克隆游戏。让我们假设它只能在横向模式下播放。 (暂时忽略方形手机)。

我希望游戏在每部手机上的显示比例相同,如果您在 QVGA 手机上截取游戏的屏幕截图,并将屏幕截图的大小调整为 WVGA 大小,它看起来几乎与游戏会在 WVGA 手机上显示吗?换句话说,桨的宽度应始终为屏幕宽度的 1/32,球的直径应始终为屏幕宽度的 1/16。

绘制应用程序的正确方法是什么?它将在标准 SurfaceView 中运行,该 SurfaceView 将被绘制到 Canvas 上。

假设我有 Racket 、球和游戏字体(记分牌、主菜单)的高分辨率 PNG。

我是否找出物理分辨率,然后通过 scale(float sx, float sy) 缩放 Canvas 以使我所有的 Canvases(在 QVGA 和 WVGA 上)都有相同的虚拟分辨率,然后在每个屏幕尺寸的每个位置上绘制完全相同的图元?

或者我可以在 Canvas 中以某种方式使用与密度无关的像素(倾斜)吗?

最佳答案

我只玩了一次绘制 Canvas 功能,然后全部切换到 opengl,但逻辑保持不变(我认为)。

第一期,您需要保持一部手机与另一部手机的比率不变。在我的应用程序中,我在每一侧添加了一个“黑带”效果。在 onSurfaceChanged 中,你需要计算一个比率,这个比率将允许你确定你必须在每一侧移除多少空间以保持绘图的一致方面。这将为您提供适用于所有抽奖的增量 X 或 Y以下代码是我从 ogl 版本改编而来的,因此可能需要稍微调整一下

@Override
public void onSurfaceChanged(int w, int h){
float ratioPhysicScreen = nativeScreenResoltionW/nativeScreenResoltionH;
float ratioWanted = GameView.getWidth()/GameView.getHeight();
if(ratioWanted>ratioPhysicScreen){
newHeight = (int) (w*GameView.getHeight()/GameView.getWidth());
newWidth = w;
deltaY = (int) ((h-newHeight)/2);
deltaX = 0;
}else{
newWidth = (int) (h/GameView.getHeight()*GameView.getWidth());
newHeight = h;
deltaX = (int) ((w-newWidth)/2);
deltaY = 0;
}

那么您还希望能够通过了解 Canvas 上的大小以及实际大小以及 image.getWidth() (图片的实际大小)之间的差异来在 Canvas 上绘制图片) 和 image.getScaledWidth(canvas) 给你 dp 中元素的大小,这意味着它将在屏幕上显示多大)很重要。看看下面的例子。

public class MainMenuView extends PixelRainView{
private Bitmap bmpPlay = null;
private float playLeft = 0;
private float playRight = 0;
private float playBottom = 0;
private float playTop = 0;

public MainMenuView(Context context, AttributeSet attrs) {
super(context,attrs);
}



@Override
public void unLoadBitmaps() {
super.unLoadBitmaps();
if(bmpPlay != null){
bmpPlay.recycle();
bmpPlay = null;
}
}



@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(bmpPlay == null){
bmpPlay = getBitmapFromRessourceID(R.drawable.play_bt);
playLeft = (this.getWidth()-bmpPlay.getScaledWidth(canvas))/2;
playRight = playLeft + bmpPlay.getScaledWidth(canvas);
playTop = (this.getHeight()-bmpPlay.getScaledHeight(canvas))/2;
playBottom = playTop+bmpPlay.getScaledHeight(canvas);
}
canvas.drawBitmap(bmpPlay,playLeft, playTop, null);

}
}


@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}



@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
float x = event.getX();
float y = event.getY();
//test central button
if(x>playLeft && x<playRight && y<playBottom && y>playTop){
Log.e("jason", "touched play");
PixelRainView.changeView(R.layout.composedlayoutgroup);
}
return super.onTouchEvent(event);
}
}

这应该可以解决跨平台的所有比率问题我会建议 opengl,因为它会简化您保持不变方面的需要,但我想这不是一个选择 ^^

希望对你有足够的帮助

关于android - 如何在 Android 上正确缩放游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4183372/

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