如何在Android上正确扩展游戏
-
10-10-2019 - |
题
为了简单起见,让我们假设我正在为Android制作一个简单的乒乓球游戏。假设它只能在景观模式下播放。 (暂时忽略方形电话)。
我希望游戏在每部手机上以相同的比例查看,以至于如果您在QVGA手机上屏幕截图并将屏幕截图大小调整到WVGA尺寸,则看起来几乎与游戏相同查看WVGA电话。换句话说,桨的宽度应始终是屏幕宽度的1/32,球的直径应始终是屏幕宽度的1/16。
绘制应用程序的正确方法是什么?它将在标准表面视图中运行,并将其绘制到 Canvas
.
假设我有一个用于桨,球和游戏字体的高分辨率PNG(记分板,主菜单)。
我是否找出身体分辨率,然后扩展 Canvas
通过 scale(float sx, float sy)
使我所有的画布(在QVGA和WVGA上)具有相同的 虚拟的 分辨率,然后在每个屏幕尺寸上的每个位置上绘制完全相同的原语?
还是我可以在画布中以某种方式使用密度无关的像素(DIP)?
解决方案
我只使用绘制的画布功能玩一次,然后将全部切换到OpenGL,但逻辑保持不变(我认为)。
第一期,您需要保持比率恒定与另一个手机保持不变。在我的应用程序中,我对每一侧添加了“黑色乐队”效果。在Onsurfacechanged中,您需要计算一个比率,此比率将使您确定在每一侧必须删除多少空间以保持图纸的一致方面。这将为您提供Delta 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;
}
然后,您还希望能够通过在画布上了解大小而不是实际尺寸,而在图像中的尺寸以及图像之间的差异(图)(图片的实际大小)和一个image.getScaledWidth(画布),它为您提供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,因为它可以简化您保持恒定方面的需求,但我想这不是一个选择^^
希望这对您有足够的帮助
其他提示
使用蘸酱并涂桨,而不是使用PNG
我认为只有3种标准分辨率(LDIP,MDIP,HDIP),您应该为每个标准分辨率提供一个资源文件夹。
http://developer.android.com/guide/practices/screens_support.html
如果您手动缩放PNG以适合3个可用分辨率,则该手机应以透明的方式加载特定的资源文件夹