Bất cứ một tựa game lớn nào muốn thành công đều phải đẹp về đồ họa. Rất nhiều đối tượng trong game được phân loại dựa trên những kiểu đồ họa đặc biệt gọi là sprites. sprite có thể là mọi thứ, từ viên đạn, quái vật, nhân vật chính, đối thủ, những loại item ...
Ví dụ về 1 sprite
Phần lớn các sprites là những đối tượng đồ họa động (hiểu là hình động cho dễ). Những hình động này được tạo bởi nhiều hình tĩnh gần giống nhau, chỉ khác nhau ở mỗi hình 1 tý xíu (giống nguyên tắt tạo hình động).Các tập sprites thường được gọi là các bộ khung hình . Những bộ khung này có thể được tạo nên từ những hình lạp hoặc không lặp. Thông thường, những sprite này được thể hiện theo một vòng lặp cho dễ xử lý.
Cấu trúc của một Sprite .
Có 3 cấu trúc mà nó đi kèm với lớp Sprite.
Sprite ( Image Image) = Tạo một khung hình duy nhất , không có "động đậy"
Sprite (Sprite sprite ) = tạo một Sprite mới từ một sprite khác trước đó.
Sprite (Image image, int frameWidth, int frameHeigh) = tạo một đối tượng sprite có hả năng động đậy với nhiều hơn 2 khung hình, với height width là chiều cao và chiều rộng của khung hình.
trên hình trên là những "vạch" được gạch ra chỉ những khung hình song song mà ta có thể chia cách được (thật ra sprite ít được tạo từ nhiều hình đơn mà từ nhiều phần của một hình. ở frame thứ nhất sẽ hiển thị khung hình 1, frame thứ 2 ở khung 2 ... mỗi khung hình được chia cách như trên với chiều rộng và chiều cao được quy định lúc ta gọi hàm). bạn không cần phải điền vào số frame của sprite vì sau khi chia, hàm sprite sẽ tự động làm nó giúp bạn.
Tại sao là 8bit, 16 bit, 32 bit?
Nếu bạn chú ý phần lớn các đối tượng đồ họa thường bao gồm cả các sprites thường là những khung cùng chiều cao và chiều rộng. Lý do là bởi vì để đạt được sự đồng nhất về số lượng pixel và số bit màu sử dụng. hay cụ thể ở đây là độ sâu của bit hay là độ sâu của màu. Càng nhiều bit trên 1 pixel thì màu sẽ được hiển thị sinh động hơn. Công thức
Dùng công thức này để tính được số màu sắc có thể được hiển thị với mỗi 8 bit, 16 bit hay 32 bit.
Có điều khác là ở 2^32 thì số màu có được sẽ không là 2^32 mà chỉ là 2^24 vì có 8 bít được sử dụng cho kênh alpha. Một kênh alpha là một lớp mask (mặt nạ). Nó quyết định màu sắc của pixel này ra sao khi bị đè (nhập) với 1 pixel màu khác. (không hiểu lắm Chắc là khi lấy mình dùng pen tô lên giấy với giấy màu đỏ bút màu đen thì cần tới kênh alpha vậy :| ). trích dẫn nguyên đoạn này
Xử lý đụng độ giữa các Sprite
Đụng độ là một trong những hàm quan trọng nhất đối với việc lập trình game. Nó có thể là khi nhân vật đụng độ với vách tường, khi viên đạn đước bắn trúng vào đối tượng khác ...
Vậy làm thế nào để chúng ta xác định được có đụng độ xảy ra ?! Một cách tự nhiên là khi 1 bất kì pixel của sprite này chồng lên bất kì 1 pixel nào của spirte khác
Đừng lo, Lớp Sprite đã có sẵn một phương thức giúp bạn nhận biết được điều này.
collidesWith(Image image, int x, int y, boolean pixelLevel)
hay
collidesWith(Sprite sprite, boolean pixelLevel)
như bạn thấy, bạn có thể nhận diễn sự đụng độ xảy ra giữa các sprite hay giữa các đối tượng... với hàm gọi với hình (collidatesWith(Image image, int x, int y, boolean pixelLevel) thì bạn cần nhập nhiều hơn 2 tham số là x, y để xác định được vị trí của hình. Nó thường là tọa độ x, y của góc trên bên trái của hình. PixelLevel là một biến logic Nếu nó là true thì xe xử lý đụng độ trên pixel, và nếu nó là false thì sẽ sử lý đụng độ trên hình chữ nhật. Bạn cần định nghĩa kích cỡ của hình chữ nhật nhỏ hơn 1 tý nếu bạn muốn (thay vì khung) Tốt nhất là vẽ hình chữ nhật bao quanh những điểm ảnh của hình, loại bỏ bớt những chỗ mà ở đó xảy ra tình trạng hình chữ nhật thì đụng mà pixel thì chưa tới ==> giúp cho xử lý trông thực hơn.
Pixel-Level là khi 1 điểm ảnh của sprite chồng lên 1 điểm ảnh của sprite khác. Một phương thức đơn giản của việc nhận diện đụng độ là đụng độ giữa những hình chữ nhật của 2 sprite ( thường dùng hình chữ nhật bao quanh đối tượng sprite).
Và phương thức thứ 3.
Nó cũng tương tự với 2 phương thức ở phía trên. Chi tiết xem phần sau .
collidesWidth(TiledLayer tiledLayer, Boolean pixelLevel) ;
< tác giả ghi width nhưng theo mình nghĩ là with mới đồng bộ với cái ở trên>
Display Sprite
Để hiển thị hoặc biểu diễn một sprite đơn giản ta gọi hàm paint. Bạn sẽ phải cần thông qua một đối tượng đồ họa như nó là một tham số cần thiết. Cần lưu ý là phải dùng setVisible(boolean) trong lần đầu tiên gọi phương thức này, Bạn sẽ cần phải điền vào giá trị vào là true (biến boolean).
Display Sprite Sequence
Có một vài phương pháp có sẵn để giải quyết với những sprite "động".
getFrameSequenceLengh() - trả về số thành phần trong 1 "chuỗi khung ảnh - số ảnh trong 1 chu trình".
getFrame() - Lấy số thứ tự của frame hiện tại trong "chuỗi frame", nó khoog phải là frame đang được hiển thị.
nextFrame() - Gán trình tự của frame tới cái frame kế tiếp, nếu trong trình tự nó là frame cuối cùng thì nó sẽ bắt đầu bằng frame đầu tiên.
prevFrame() - Gán trình tự freame thành cái frame phái trước, Nếu nó đang là frame bawgsts đấu thì nó sẽ quay ngược về frame cuối cùng.
setFrame(int sequenceIndex) - tùy biến việt thiết lập trình tự trong chuỗi trình tự frame
setFrameSequence(int[] sequence) - thiết lập = 1 chuỗi các frame sequence đã được định nghĩa trước.
Sprite Transparency
Một Lưu ý là bạn cần phải cẩn thận về việc làm ảnh "trong suốt" hay "không trong suốt" là tùy vào tình hình. Nếu nó là 1 game đơn giản với chỉ 1 ít các hoạt cảnh như TicTacToe thì hình trong suốt là không cần thiết hoặc không đc yêu cầu. Với những game yêu cầu tương tác cao khi mà có thể xảy ra nhiều sự đụng độ giữa các sprite với nhau (bao gồm cả background) bạn sẽ có nhu cầu làm trong suốt hình sprite. Tốt hơn là chúng ta nên kiểm tra với thiết lập của nhà sản xuất và chắc chắn rằng thiết bị chúng ta định phát triển có hỗ trợ cho việc hỗ trợ hình trong suốt nếu bạn quyết định sử dụng hình trong suốt.
Sprite Transforms
Có nhiều phương pháp để có thể thao tác một sprite xoay 90độ hay phiên bản đối xứng (như hình trong gương ấy) của sự quay ??? các biến đổi thì thiết lập bằng cách gọi setTransform. Các tham số là những giá trị nguyên, tuy nhiên, có một vài giá trị hợp lệ được định nghĩa trước và sẵn sàng để sử dụng
Khi biến đổi được áp dụng, sprite sẽ tự động thay đổi vị trí để nó về trung tâm ??Giá trị tham chiếu của sprite không đổi nhưng vị trí khi lấy getX() getY() sẽ thay đổi về góc trên bên trái.
??
Anhsaodem: J2Me Game Development With Midp 2 - Chapter 4 - Sprite >>>>> Download Now
ReplyDelete>>>>> Download Full
Anhsaodem: J2Me Game Development With Midp 2 - Chapter 4 - Sprite >>>>> Download LINK
>>>>> Download Now
Anhsaodem: J2Me Game Development With Midp 2 - Chapter 4 - Sprite >>>>> Download Full
>>>>> Download LINK St