2013-11-25 17 views
6

Một số Bối cảnh:Android - Canvas onDraw với phong trào nhân vật zoom camara sau

tôi đang tạo ra một trò chơi Android mà rút ra một mê cung vào một canvas chống lại một hình nền, điều này sử dụng một khối vuông và do đó mê luôn là automtically phóng to hình vuông 5 x 5, của mê cung có thể là 20 x 20. Mê cung được vẽ bằng cách đơn giản chạy qua một tập hợp các vòng lặp và sau đó vẽ các đường ở những vị trí thích hợp. Đây là tất cả hoạt động hoàn hảo, tuy nhiên tôi đang gặp vấn đề với việc onDraw của tôi hoạt động trơn tru. Điều này xảy ra do thực tế là mỗi khi tôi vô hiệu hóa tôi phải chạy lại cho cái nhìn và chạy khác nhau nếu báo cáo để kiểm tra vị trí (không may là quá trình này không thể được cải thiện).

Các Câu hỏi:

Tôi đang tìm để viết lại một cách mê cung của tôi là vẽ lên vải, dưới đây là 3 tính năng chính tôi cần phải thực hiện:

1 - Vẽ toàn bộ mê cung lên canvas (điều này đủ dễ) 2 - Phóng to mê cung sao cho chỉ 5 x 5 được hiển thị 3 - Di chuyển ký tự (người luôn nằm giữa màn hình) và vẽ giây tiếp theo của mê cung

Bây giờ như đã đề cập ở trên vẽ toàn bộ mê cung là dễ dàng đủ và sẽ làm cho onDraw signifcatly nhanh hơn vì họ không cần phải chạy vòng lặp for trên invaldate, nó có thể được thực hiện một lần khi mức đầu tiên được tải lên.

Xét về điểm 2 & 3, cách tôi thấy hoạt động này là charcacter được vẽ ở giữa khung hình, sau đó máy ảnh xem chim cánh cụt 2d được gắn/liên kết với chuyển động của ký tự. Máy ảnh này cũng sẽ cần phải được phóng to đến mức nó chỉ hiển thị 5 x 5 của lưới mê cung tổng thể. Sau đó, khi charcater di chuyển camera di chuyển với nhân vật và hiển thị phần tiếp theo của mê cung đã được vẽ. Tôi đã thử một vài điều và thực hiện một số reasearch tuy nhiên tôi chưa bao giờ làm việc với vải trước và không có ý tưởng thực sự bắt đầu từ đâu và nếu điều này thậm chí có thể.

Vì vậy, để tổng hợp phần chính của câu hỏi là liệu chúng là một cách để liên kết máy ảnh xem chim với một ký tự được phóng to và di chuyển với hình ảnh ký tự.

Dưới đây là một đoạn trích về cách mê cung hiện tại, sử dụng 2 bộ vòng kiểm tra đối với 2 bộ mảng boolean [] [], đơn giản lưu trữ các đường thẳng đứng và đường chéo.

@Override 
protected void onDraw(Canvas canvas) 
{ 
    canvas.drawRect(0, 0, width, 100, background); 
    RectBackground.set(0,0, FullScreenWidth, FullScreenWidth); 
    canvas.drawBitmap(gameBackground, null, RectBackground, null); 

    for(int i = 0; i < 5; i++) 
    { 
     for(int j = 0; j < 5; j++) 
     { 
      float x = j * totalCellWidth; 
      float y = i * totalCellHeight; 

      indexY = i + currentY; 
      indexX = j + currentX; 

      // Draw Verticle line (y axis) 
      if (indexY < vLength && indexX < vLines[indexY].length && vLines[indexY][indexX]) 
      { 
       RectOuterBackground.set((int)x + (int)cellWidth, (int)y, (int)x + (int)cellWidth + 15, (int)y + (int)cellHeight + 15); 
       canvas.drawBitmap(walls, null, RectOuterBackground, null); 
      } 
      // Draws Horizontal lines (x axis) 
      if (indexY < hLength && indexX < hLines[indexY].length && hLines[indexY][indexX]) 
      { 
       RectOuterBackground.set((int)x, (int)y + (int)cellHeight,(int)x + (int)cellWidth + 15,(int)y + (int)cellHeight + 15); 
       canvas.drawBitmap(walls, null, RectOuterBackground, null); 
      } 
     } 
    } 
} 

Trả lời

1

Để vẽ nhanh hơn, bạn có thể tăng gấp đôi đệm canvas bằng cách vẽ trực tiếp vào bitmap và nhấp bitmap vào canvas như thế này. Nó rất nhanh.

private void init() 
{ 
     //variables below are class-wide variables 
     b = Bitmap.createBitmap(cwidth, cheight, Bitmap.Config.ARGB_8888); 
     bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     bitmapPaint.setStyle(Paint.Style.STROKE); 

     bitmapPaint.setStrokeWidth(3); 
     myPaint.setColor(0xff000000); 
     myCanvas = new Canvas(b); 
} 

protected void onDraw(Canvas c) 
{ 
    super.onDraw(c); 
    c.drawBitmap(b, 0, 0, myPaint); 

    for(int i = 0; i < number lines; i++) 
    { 
     //draw here using myPath 
    } 

    if(b != null) 
     c.drawBitmap(b, 0, 0, myPaint); 

    myCanvas.drawPath(myPath, bitmapPaint); 

} 

Sau đó, để "di chuyển", tôi khuyên bạn nên sử dụng hộp cắt. Điều này có nghĩa là tỷ lệ 1: 1, hình ảnh lớn hơn khung nhìn được hiển thị trên màn hình. Thực sự những gì đang xảy ra khi ai đó "di chuyển" là bitmap đang được di chuyển bên dưới hộp cắt.

Bạn có thể sử dụng BitmapRegionDecoder và chỉ hiển thị các khu vực nhân vật trong (điều này có thể là slowish) hoặc bằng cách sử dụng

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint) 

Các tham số src đây cho phép bạn chỉ định một khu vực nhỏ của bitmap để hiển thị. Nó là một hộp cây trồng có hiệu quả.

+0

tôi cũng nên thêm rằng phương pháp onDraw là woefully không đầy đủ. Nếu bạn cần xem toàn bộ công việc, tôi có thể gửi cho bạn một số mã. Tôi đã viết một ứng dụng làm điều gì đó tương tự như những gì bạn đang làm với mê cung. Nó vẽ các dòng máy tính xách tay và chụp chữ viết tay từ bút stylus. – mttdbrd

+0

Tôi sẽ xem xét điều này vào ngày mai, bạn có thể vui lòng gửi email cho tôi mã hoàn chỉnh của bạn để tôi có thể xem phiên bản đang hoạt động hay không. Cảm ơn. –

+0

Tôi không biết cách gửi email cho mọi người thông qua SO. Làm thế nào để làm điều đó? – mttdbrd

1

Để phóng to trong và ngoài bạn cần phải nhân các tọa độ của một số (yếu tố zoom)

int x1 = (int)x + (int)cellWidth; 
int y1 = (int)y; 
int x2 = (int)x + (int)cellWidth + 15; 
int y2 = (int)y + (int)cellHeight + 15; 

RectOuterBackground.set(x1*zoom, y1*zoom, x2*zoom, y2*zoom); 

lưu ý rằng zoom phải là một số điểm nổi, sử dụng zoom = 2 mà làm tất cả mọi thứ lớn gấp đôi.

nếu bạn muốn đặt camera trên đầu trang của các tế bào (xc, yc), bạn cần phải làm điều này:

RectOuterBackground.set((x1-xc)*zoom, (y1-yc)*zoom, (x2-xc)*zoom, (y2-yc)*zoom); 

Hãy thử đầu tiên vẽ toàn bộ mê cung, và chẳng mấy chốc bạn sẽ tìm ra cách để chỉ vẽ chút mê cung mà chỉ có bên trong màn hình

tôi hy vọng điều này sẽ giúp và cho tôi biết nếu bạn có bất cứ thắc mắc :)

+0

Tôi sẽ xem xét điều này ở một số giai đoạn tối nay và cho bạn biết cách tôi tiếp tục. –

+0

Có cơ hội nào bạn có thể cung cấp cho tôi đoạn mã hoàn chỉnh hơn, vì không chắc chắn 100% cách triển khai mã đó. Ví dụ: int không có nghĩa là phải có; cuối cùng. Cho đến nay tôi đã vẽ mê cung hoàn chỉnh của tôi 10 x 10, bây giờ tôi cần phải thực hiện zoom với máy ảnh để nó di chuyển trơn tru (dần dần hiển thị các phần tiếp theo của mê cung). Cảm ơn –

+0

Bạn có thể gửi cho tôi những gì bạn có cho đến nay không? Tôi sẽ thực hiện bit này cho bạn – aguaviva

Các vấn đề liên quan