2012-08-12 29 views
6

Trước hết tôi sẽ nói rằng ngữ cảnh ở đây là Actionscript 3.0 (IDE: Flashbuilder) cùng với Starling Framework.Hiển thị bản đồ khối xếp kề AS3 (với 1000 ô xếp kề)

Vì vậy, tôi muốn tạo Bản đồ trang trí có thể được sử dụng cho nền tảng hoặc điều gì đó tương tự.

Tôi muốn sử dụng các pixel 8x8 pixel trên một giai đoạn 800x600 pixel và vấn đề tôi gặp phải là tôi không biết cách thêm 7500+ đối tượng ô này vào sân khấu mà không giảm tốc độ khung hình một cách đáng kể.

Tôi nhận thấy rằng hiệu suất giảm đến từ việc thêm từng ô vào vùng hiển thị, không phải từ việc khởi tạo từng đối tượng Gạch.

Tôi biết tôi không đưa ra nhiều thông tin cụ thể, nhưng những gì tôi yêu cầu là nếu có một cách tiêu chuẩn hóa để vẽ hàng nghìn vật thể tĩnh lên sân khấu mà không làm mất hiệu suất. Tôi cảm thấy như có một cách, và tôi vẫn chưa tìm thấy nó.

Cập nhật:

Sau khi tất cả sự giúp đỡ của các bạn, tôi đã tìm thấy những gì có vẻ là một giải pháp tuyệt vời. Lúc đầu, tôi muốn triển khai giải pháp của Amy, sử dụng copyPixels() và vẽ() để tạo một dữ liệu bitmap lớn cho toàn bộ bản đồ và sau đó hiển thị dữ liệu đó lên màn hình. Sau đó, mặc dù, tôi muốn biết nếu có một Starling tương đương với điều này, bởi vì mọi thứ sẽ đơn giản hơn nhiều nếu tôi không phải trộn Starling với Native Flash. Nhờ Amy một lần nữa, tôi nhìn vào lớp RenderTexture của Starling nhiều hơn một chút, và thấy rằng sử dụng phương thức "drawBundled()" và "draw()", tôi có thể dễ dàng vẽ tất cả các ô xếp thành RenderTexture và sau đó đặt RenderTexture vào một hình ảnh (Starling's Image Class) và sau đó chỉ cần thêm hình ảnh đó vào màn hình.

Giải pháp đó nhanh hơn gấp hàng triệu lần so với các giải pháp chậm ngớ ngẩn mà tôi đã thử trước đây, với các họa tiết phẳng và như vậy. Nó nhanh hơn cả trong thời gian khởi tạo của nó và dường như không giảm tốc độ khung hình trong khi Hình ảnh renderTexture hiển thị trên màn hình.

Điều tôi muốn thử nghiệm với điều này là nếu dễ cập nhật đồ họa của ô xếp trong khi chơi trò chơi. Nói, nếu nước lây lan từ một nguồn (hoặc một cái gì đó) và một "Grass" gạch đã trở thành một "nước" gạch, sẽ RenderTexture và hình ảnh của nó có thể thay đổi sự xuất hiện của họ mà không có một số loại tụt hậu hoặc hiccup hiệu suất. Tôi sẽ sớm kiểm tra điều này.

Cảm ơn tất cả vì sự giúp đỡ của bạn!

Trả lời

9

Đừng thêm rằng nhiều đối tượng lên sân khấu. Thay vào đó, hãy tạo một BitmpaData kích thước của giai đoạn của bạn và sử dụng copyPixels() hoặc vẽ() để vẽ lên nó. Here's an article sẽ giúp bạn bắt đầu. Sau đó, bạn có thể lấy các khái niệm bạn đã học trong bài đăng đó và tìm hiểu bất cứ điều gì cụ thể mà bạn cần làm mà không được đề cập (flashandmath.com có ​​rất nhiều hướng dẫn tốt về thao tác pixel)

+0

Cảm ơn bạn, một điểm khởi đầu như thế này đã đẩy tôi đi đúng hướng chỉ là những gì tôi cần! – Brucef

+0

Bạn được chào đón :) –

+0

bây giờ tôi chỉ cần tìm hiểu cách sử dụng các đối tượng hiển thị flash gốc hoạt động với Starling Framework ... – Brucef

3

Bạn cần quản lý các ô cần phải được thêm và xóa khi bạn di chuyển xung quanh trò chơi. Chỉ thêm vào các ô xếp kề với 800 px ở giữa màn hình. Một khi gạch vượt quá 800 px từ trung tâm loại bỏ nó. Điều đó sẽ giữ cho mọi thứ diễn ra suôn sẻ. Chúc may mắn.

hoặc xem xét việc vẽ/đối chiếu lát của bạn thành một bitmap. Bạn sẽ về cơ bản dán gạch của bạn lên bitmap mới. Dưới đây là một ví dụ từ adobe:

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.geom.Rectangle; 
import flash.geom.Point; 

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF); 
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44); 

var rect:Rectangle = new Rectangle(0, 0, 20, 20); 
var pt:Point = new Point(10, 10); 
bmd2.copyPixels(bmd1, rect, pt); 

var bm1:Bitmap = new Bitmap(bmd1); 
this.addChild(bm1); 
var bm2:Bitmap = new Bitmap(bmd2); 
this.addChild(bm2); 
bm2.x = 50; 

More Info on the bitmapData class. I think copyPixels is what you are after.

+0

Điều đó sẽ hoạt động trong một tình huống khác, nhưng ở đây vấn đề không phải là tôi cần thêm/xóa ô khi máy ảnh di chuyển, nhưng các ô đó quá nhỏ đến mức tôi không biết cách tạo số cần thiết để lấp đầy màn hình (7500) mà không làm giảm hiệu suất vô cùng. – Brucef

+0

có bao nhiêu ô duy nhất khác nhau? Bạn không thể lấy mẫu bitmapData của ô và sao chép tất cả chúng vào một bitmap. Bằng cách đó bạn chỉ đang xây dựng một hình ảnh nhưng từ nhiều nguồn hình xếp. – Boyd

+0

Có rất ít gạch độc đáo (ít hơn 16), và có vẻ như nó có thể hoạt động, nhưng tôi không thực sự hiểu cách thực hiện một cái gì đó như thế – Brucef

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