Hầu hết các trò chơi đều sử dụng các dạng mô hình, sprite, texture, hiệu ứng, hình động…
Toàn bộ tài sản đó có thể được tạo bằng nhiều cách khác nhau và được lưu trữ bởi nhiều định dạng tập tin khác nhau. Content Pipeline được thiết kế để giúp đưa tài sản vào trò chơi một cách dễ dàng và tự động. Content Pipeline có thể được dùng để giải quyết vấn đề thực tế: Những nội dung mà chúng ta tạo cho trò chơi thì không sẵn sàng cho trò chơi. Ví dụ, nội dung 3D thường được lưu giữ trong một định dạng riêng và cần phải chuyển đổi dữ liệu trước khi nạp nó vào trong trò chơi. Nói chung, Content Pipeline có thể nhận các tập tin khác nhau như đầu vào, chuyển chúng sang dạng mà chúng ta có thể làm việc, và sau đó biên dịch chúng thành một định dạng mà có thể dễ dàng nạp vào trò chơi khi trò chơi của chúng ta bắt đầu.Mục đích
XNA framework Content Pipeline được thiết kế để:
+ Cho phép các họa sĩ trò chơi sử dụng công cụ tạo nội dung kỹ thuật số (DCC)
+ Cung cấp một kỹ thuật để tách riêng sự độc lập của nội dung số trên một máy trò chơi cụ thể.
+ Cung cấp nội dung đơn giản, mở rộng để xây dựng hệ thống mà cần cả họa sĩ và người phát triển trò chơi.
1) ContentManager
ContentManager được sử dụng để tải, quản lý, và bỏ các nội dung truyền thông nhị phân thông qua Content Pipeline. Nội dung đồ họa và truyền thông có thể được tải với các đối tượng này khi nó được tham chiếu trong dự án trò chơi của chúng ta.
Đối tượng ContentManager được khai báo ở phần đầu lớp trò chơi
ContentManager content;
2) ContentImporter
Được định nghĩa với phương thức Import để đọc dữ liệu chưa xử lý từ tập tin media gốc. Bên trong phương thức Import, tập tin được mở và có thể được đọc với phương thức System.IO.File hoặc thông qua MemoryStream và đối tượng BinaryReader. Sử dụng các đối tượng này có thể giúp đọc dữ liệu dạng text và nhị phân. Sau khi đọc, dữ liệu được xây dựng theo kho dữ liệu riêng. Ta tự định nghĩa cách tổ chức dữ liệu và cách thức muốn xuất ra tập tin dạng .xnb
public class MyContentImporter : ContentImporter<MyTerrain> {
public override Mycontent Import ( String filename, ContentImporterContext context ) {}
}
3) ContentProcessor
Content processor nạp media bên ngoài và vị trí các thành phần bộ xử lý đang tồn tại. Tất cả các bộ xử lý phải dẫn xuất từ lớp cơ bản ContentProcessor.
public class MyContentProcessor : ContentProcessor <Tinput, Toutput>
{}
Tinput và Toutput là những lớp đầu vào và đầu ra được định nghĩa bởi người dùng, chúng ta tạo dữ liệu vào lớn và dữ liệu ra theo định dạng yêu cầu.
4) ContentTypeWriter
Hỗ trợ việc ghi dữ liệu trung gian như đầu ra nhị phân cho đến tập tin .xnb. Đầu ra được thực hiện nhờ override phương thức Write( ).
Phương thức GetRunTimeType() khôi phục tập dữ liệu ta đã định nghĩa.
Phương thức GetRuntimeReader() khôi phục tập hợp (assembly) và loader.
[ContentTypeWriter]
public class MyContentWriter : ContentTypeWriter<MyCustomContent>{
protected override void Write(ContentWriter wr,
MyCustomContent output){}
public override string GetRuntimeType(TargetPlatform targetPlatform)
{}
public override string GetRuntimeReader(TargetPlatform targetPlatform)
{}
}
5) ContentTypeReader
ContentTypeReader nạp dữ liệu nhị phân chứa trong tập tin .xnb. Hầu hết các phương thức sẵn sàng để nạp dữ liệu với đối tượng ContentTypeReader được thừa kế từ lớp BinaryReader. ContentTypeReader nạp dữ liệu của ta và trả về thể hiện ban đầu lớp dữ liệu.
public class TerrReader : ContentTypeReader<MyCustomContent> {
protected override MyContent Read(
ContentReader input,
MyContent existingInstance){}
}
Khi override phương thức Read( ) hoàn thành việc import dữ liệu, nó trả về dữ liệu theo định dạng mà ta định nghĩa trong lớp chứa dữ liệu. Dữ liệu này sau đó sẵn sàng trong kế hoạch trò chơi của mình.Các định dạng Content Pipeline hỗ trợ
Công cụ DCC lưu nội dung với nhiều định dạng tập tin khác nhau, XNA Game Studio Content Pipeline cho phép ta xây dựng tài sản trong ứng dụng trò chơi một cách tự động từ những định dạng tập tin được duy trì.
Content Pipeline hỗ trợ các định dạng tập tin như sau:
+ Định dạng tập tin 3D: X (dùng bởi DirectX), FBX ( chuyển định dạng tập tin tạo bởi Autodesk )
+ Định dạng tập tin nguyên liệu (material): .FX (các tập tin hiệu ứng có thể được dùng để mô tả chi tiết mô hình 3D hoặc thêm hiệu ứng vào cảnh 3D)
+ Định dạng tập tin 2D: BMP, DDS, DIB, HDR, JPG, PFM, PNG, PPM và TGA. (các định dạng tập tin hình ảnh thông thường)
+ Mô tả phông chữ: SPRITEFONT (tập tin XML được dùng bởi XNA, mô tả cách tạo một sơ đồ bố cục từ kích thước loại phông chữ cụ thể)
+ Định dạng tập tin âm thanh: .XAP (tạo bởi công cụ XACT, có thể gắn hầu hết các định dạng tập tin âm thanh)add text, images, video, widgets, etc...
Quản lý Âm thanh
Một ứng dụng trò chơi không thể hấp dẫn và thu hút người chơi nếu chỉ đẹp về mặt hình thức và có một kịch bản hay. Người chơi sẽ mất đi cảm giác thật khi ném bom mà không nghe tiếng nổ, cũng như khi đua xe mà không nghe tiếng động cơ… Do đó, âm thanh là một phần không thể thiếu của trò chơi. Tùy thuộc vào thể loại trò chơi mà chúng ta sẽ được thưởng thức những âm thanh khác nhau. Các nhà lập trình trò chơi luôn cố gắng tạo ra các hiệu ứng âm thanh phù hợp với nội dung trò chơi của mình.
Để tạo âm thanh cho ứng dụng trò chơi, chúng ta cần phải có được các tập tin âm thanh để gắn vào ứng dụng trò chơi. Có nhiều cách khác nhau để tạo các tập tin âm thanh, sau đây là vài lựa chọn:
Tìm các tập tin âm thanh được cung cấp miễn phí trên một số trang web. Tất nhiên chất lượng âm thanh có thể không tốt như mong đợi, nhưng bù lại ta không phải trả bất cứ một chi phí nào cả. Chúng ta có thể tham khảo tại một số địa chỉ: www.flashkit.com,http://freesound.iua.upf.edu.
Nếu muốn có tập tin âm thanh với chất lượng tốt hơn chúng ta có thể mua các tập tin âm thanh được bán trên mạng tại địa chỉ: www.sounddogs.com
Ngoài ra, chúng ta có thể tự tạo âm thanh cho riêng mình. Nhưng nếu không phải người chuyên nghiệp thì chất lượng âm thanh có thể sẽ rất tệ.
Sau khi có được các tập tin âm thanh, chúng ta cần phải chỉnh sửa lại để có thể gắn vào ứng dụng trò chơi. Một chương trình hiệu chỉnh âm thanh miễn phí và mã ngồn mở là Audacity. Audacity có thể được tìm thấy tại địa chỉ http://audicity.sourceforge.netChương trình Cross-Platform Audio Creation (XACT)
Sau khi đã chuẩn bị các tập tin âm thanh để đưa vào ứng dụng trò chơi. Chúng ta sẽ đưa các tâp tin âm thanh này vào ứng dụng trò chơi của mình như thế nào?
Framework XNA cung cấp một công cụ hỗ trợ để tạo hiệu ứng âm thanh cho ứng dụng trò chơi. Đó là Cross-Platform Audio Creation (XACT).
XACT được dùng để làm cho việc quản lý các tập tin âm thanh và các tín hiệu âm thanh trở nên đơn giản hơn. Chúng ta có thể dùng nó để tổ chức các tập tin wave và thiết lập các thuộc tính playback. XACT được cài đặt như một phần của XNA Game Studio Express, vì vậy chúng ta không cần lo lắng về việc tải và cài đặt nó.
Để hiện thực XNA audio phải sử dụng ít nhất 5 đối tượng chính:
+ XACT audio project file
+ Audio Engine
+ Global settings
+ Wave Banks
+ Sound Banks
1) XACT Audio Project File
XACT Audio Project File là tập tin được tạo từ XACT. XACT project file có phần mở rộng là .xap. Tập tin mở rộng .xap thì có hiệu quả để triển khai trên cả Windows và Xbox 360.
Chúng ta không cần tham chiếu đến tập tin này trong mã nguồn của mình. Tuy nhiên, khi tập tin .xap được tham chiếu trong ứng dụng Game XNA, trò chơi sẽ tự động tạo một tập tin thiết lập toàn cục (global settings file), một tập tin wave bank, một tập tin sound bank cho phép điều chỉnh audio playback theo thiết lập audio của chúng ta.
Chúng ta có thể tạo ra tập tin thiết lập toàn cục, tập tin wave bank, tập tin sound bank riêng biệt từ công cụ tạo audio và sau đó tham chiếu đến các tập tin này trong dự án. Tuy nhiên, để dễ dàng tham chiếu và nạp các tập tin audio trong cả ứng dụng trò chơi trên nền Windows và Xbox 360, ta nên tham chiếu đến tập tin .xap trong ứng dụng. Khi tham chiếu đến tập tin .xap trong ứng dụng trò chơi, nó cũng cung cấp một đường dẫn tập tin quan hệ tham chiếu đến những tập tin wave đã dùng trong dự án.
2) Audio Engine
Đối tượng AudioEngine giúp thể hiện và thao tác với các đối tượng âm thanh cho ứng dụng trò chơi. Đối tượng này được khởi tạo bằng việc thiết lập các thuộc tính lấy từ tập tin thiết lập toàn cục tạo từ công cụ XACT. Nếu tham chiếu tập tin .xap trong Solution Explorer, tập tin thiết lập toàn cục sẽ được tạo tự động khi chạy ứng dụng. Mặc dù chúng ta không thể thấy tập tin thiết lập toàn cục trong cùng thư mục chứa tập tin .xap, ta có thể nạp nó trong mã nguồn theo đường dẫn cùng với thư mục ứng dụng:
AudioEngine audioEngine = new AudioEngine(“.\\thư mục tập tin audio\\GlobalSettings.xgs”);
Khi đã khởi tạo sound engine trong mã nguồn, sau đó khởi tạo WaveBank và SoundBank. Giống như tập tin thiết lập toàn cục, những tập tin này sẽ không hiển thị trong thư mục audio khi chúng ta dùng tập tin .xap để tạo chúng. Tuy nhiên, chúng có thể được nạp từ cùng thư mục trong ứng dụng như tập tin *.xap:
WaveBank waveBank = new WaveBank( audioEngine, “.\\thư mục tập tin audio\\Wave Bank.xwb” );
SoundBank soundBank = new SoundBank( audioEngine, “.\\thư mục tập tin audio\\Sound Bank.xsb” );
Khi nạp các tập tin audio project, engine, wave bank, sound bank theo cách này, các tập tin này phải có cùng đường dẫn.
3) Global Settings
Global settings là những định nghĩa để điều khiển audio tạo bởi người thiết kế âm thanh. Chúng ta sử dụng tập tin này để khởi tạo sound engine.
4) Wave Banks
Một wave bank là một tập hợp các tập tin wave và được đóng gói trong tập tin .xwb
5) Sound Banks
Một sound bank là một tập hợp các chỉ dẫn và khúc nhạc (cue) cho các tập tin wave để điều chỉnh âm thanh được mở như thế nào trong chương trình.
Khúc nhạc có thể chứa một danh sách âm thanh để mở theo một trình tự cụ thể khi một sự kiện được thực hiện hoặc nó có thể cung cấp một danh sách âm thanh được chọn ngẫu nhiên để chơi.
Các phương pháp Playback
Chúng ta có thể lựa chọn để dùng hai phương thức playback.
1) Dùng phương thức Cue.Play
Ta có thể dùng phương thức GetCue( ) của SoundBank để khôi phục thể hiện âm thanh và sau đó dùng phương thức Play( ) để mở nó.
cue = soundBank.GetCue(String cueName);
cue.Play( );
Phương thức này thì hữu dụng nếu cần thiết lập âm lượng, tạm dừng hoặc mở lại âm thanh. Tuy nhiên, nếu dùng phương thức GetCue( ) liên tục để mở âm thanh và loại bỏ cue, chúng ta sẽ nghe âm thanh bị cắt bớt trong khi playback. Nếu biết sẽ sử dụng những cue này sau, ta có thể tránh vấn đề này bằng cách thay thế những cue rảnh rỗi vào stack.
2) Dùng phương thức SoundBank.PlayCue
Một phương thức khác được dùng để mở âm thanh là PlayCue() của SoundBank. Phương thức này hữu dụng để mở các âm thanh nhanh chóng:
PlayCue ( String cueName );
Với phương thức này ta không cần phải loại bỏ cue. Điều này giúp tránh sự phá vỡ âm thanh có thể gây ra bởi bộ nhặt rác (garbage collection) khi cue bị loại bỏ.
Lập trình 3D Audio
3D Audio chia âm lượng nguồn âm thanh và vị trí âm thanh trong mỗi loa. Những thuộc tính âm lượng và vị trí cho mỗi âm thanh được dẫn xuất từ khoảng cách và hướng của bộ nghe (listener) đến nguồn âm thanh. Đối tượng listener được định nghĩa bởi lớp AudioListener. Đối tượng này quản lý những gì chúng ta nghe được và cách chúng ta nghe như thế nào.
Thông thường chỉ có một listener trong một trò chơi. Listener di chuyển và thay đổi hướng với camera. Đối tượng listener di chuyển với camera cho phép cập nhật vị trí và hướng của mỗi âm thanh.
Lớp AudioEmitter chứa vị trí, vận tốc và hướng của nguồn âm thanh. Một đối tượng AudioEmitter được yêu cầu cho mỗi nguồn âm thanh.
Cả đối tượng listener và nguồn phát (emitter) chứa theo bốn Vector3. Đó là Forward, Speed, Position và Up.
Các vector được cập nhật listener và tất cả emitter cho mỗi frame. Sau đó, việc tính toán vị trí âm thanh và chia âm lượng được thực hiện bởi phương thức Apply3D( ):
void Cue.Apply3D (AudioListener listener, AudioEmitter emitter);
Bởi vì cue được dùng cho 3D audio, do đó phương thức GetCue( ) được sử dụng để khôi phục cue cho playback.
No comments:
Post a Comment