2010-11-15 9 views
9

vì mục đích đơn giản, giả sử rằng tôi đang tạo một trò chơi bản sao Pong đơn giản cho Android. Giả sử rằng nó sẽ chỉ có thể phát ở chế độ ngang. (bỏ qua điện thoại vuông bây giờ).Cách chia tỷ lệ trò chơi trên Android

Tôi muốn trò chơi có cùng quy mô trên mỗi điện thoại, trong trường hợp bạn chụp ảnh màn hình trò chơi trên điện thoại QVGA và đổi kích thước ảnh chụp màn hình thành kích thước WVGA, nó sẽ trông gần như giống nhau như trò chơi sẽ nhìn vào điện thoại WVGA. Nói cách khác, chiều rộng của paddle luôn luôn bằng 1/32 chiều rộng màn hình, đường kính của quả bóng phải luôn bằng 1/16 chiều rộng màn hình.

Cách thích hợp để vẽ ứng dụng là gì? Nó sẽ chạy trong SurfaceView tiêu chuẩn sẽ được vẽ lên một Canvas.

Giả sử tôi có PNG có độ phân giải cao cho gậy, bóng và phông chữ trò chơi (bảng điểm, menu chính).

Tôi tìm ra độ phân giải vật lý, sau đó mở rộng các Canvas qua scale(float sx, float sy) để làm cho tất cả Canvases của tôi (trên QVGA và WVGA) có cùng độ phân giải ảo, và sau đó vẽ chính xác nguyên thủy như nhau trên mỗi vị trí trên mỗi màn hình kích thước?

Hoặc tôi có thể sử dụng pixel độc lập với mật độ (nhúng) bằng cách nào đó trong Canvas không?

Trả lời

4

tôi chỉ chơi một lần với các chức năng bốc vải và sau đó chuyển tất cả sang opengl nhưng logic vẫn giữ nguyên (tôi nghĩ).

vấn đề đầu tiên bạn sẽ muốn giữ tỷ lệ liên tục tạo thành một điện thoại cho điện thoại kia. trong ứng dụng của tôi, tôi thêm hiệu ứng "dải màu đen" ở mỗi bên. trong onSurfaceThay đổi, bạn sẽ muốn tính tỷ lệ, tỷ lệ này sẽ cho phép bạn xác định khoảng không gian bạn phải xóa trên mỗi mặt để giữ một khía cạnh nhất quán cho bản vẽ của bạn. điều này sẽ cung cấp cho bạn một X đồng bằng hoặc Y để áp dụng cho tất cả các bạn rút đoạn mã sau là một cái gì đó tôi chuyển thể từ phiên bản OGL vì thế nó có thể cần phải được tweeked một chút

@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;  
} 

sau đó bạn sẽ cũng muốn có thể vẽ hình ảnh của bạn trên canvas bằng cách biết kích thước cũng như trên canvas so với kích thước thực và nơi sự khác biệt giữa image.getWidth() (kích thước thực của ảnh) và image.getScaledWidth (canvas) cung cấp cho bạn kích thước của phần tử trong dp có nghĩa là nó lớn như thế nào trên màn hình) là rất quan trọng. nhìn vào ví dụ bên dưới.

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

này nên giải quyết tất cả vấn đề tỷ lệ của bạn chéo plateforms tôi sẽ đề nghị OpenGL vì nó sẽ đơn giản hóa nhu cầu của bạn để giữ cho một khía cạnh liên tục nhưng tôi đoán nó không phải là một lựa chọn ^^

Hy vọng điều này sẽ giúp bạn đủ

2

Sử dụng dips và sơn mái chèo thay vì sử dụng PNG

+0

làm cách nào để sử dụng dips trong các phương thức Canvas như drawLine()? – Axarydax

+0

ok hãy quên bản sao Pong và chúng ta hãy nói trò chơi dựa trên gạch như Pac-man hoặc SimCity. Vì vậy, có những viên gạch được lưu trữ trong PNG và Pong có lẽ là quá đơn giản của một ví dụ. – Axarydax

-1

Tôi nghĩ rằng chỉ có 3 độ phân giải tiêu chuẩn có sẵn (ldip, mdip, hdip) và bạn sẽ có một thư mục tài nguyên cho mỗi người trong số họ.

http://developer.android.com/guide/practices/screens_support.html

Nếu bạn tự mở rộng quy mô của PNG của bạn để phù hợp với mỗi người trong số 3 giải pháp có sẵn, điện thoại nên tải các thư mục tài nguyên cụ thể một cách minh bạch