Tuesday, August 9, 2016

Texture Region

         

Nói đơn giản texture region là một phần của texture
( muốn biết texture là gì thì các bạn search gg :) nhưng mình sẽ bổ sung phần đó sau). Hãy tưởng tượng bạn có một cái bánh, sau đó bạn chia cái bánh đó ra thành nhiều phần cho các bạn của bạn. Cái bánh đó chính là texture còn mỗi miếng bánh mà bạn chia chính là texture region.

                                Vậy texture region có lợi gì so với texture ?

Trước mắt, trong libgdx có những phương thức chỉ chấp nhận texture region nhưng cái đó không quan trọng lắm, bởi vì bạn có thể ép kiểu texture thành texture region.

Cái quan trọng thức sự của texture region chính là tiết kiệm chi phí của chương trình vì bạn chỉ cần dùng Một bức ảnh duy nhất cho cả chương trình => chương trình của bạn chỉ cần một bức ảnh duy nhất rồi lấy từng phần trong bức ảnh đó để làm việc bằng texture region ,
sử dụng một bức hình để làm trò caro
 trong khi khi dùng texture bạn phải sử dụng rất nhiều bức ảnh khác nhau => chương trình sẽ nặng hơn rất nhiều khi lần lượt tải hết những bức ảnh bạn cho vào. Bạn không thể dùng một bức ảnh rồi lấy từng phần bằng texture vì trong libgdx texture không hỗ trợ chức năng này mà chỉ có texture region thôi. Nếu bạn đang thắc mắc làm sao để tôi gép tất cả những bức ảnh thành một bức ảnh duy nhất thì trong libgdx có hỗ trợ nhưng nếu bạn muốn đơn giản hơn thì trong trang codeandweb có hỗ trợ một phần mềm giúp bạn ghép các hình ảnh lại với nhau : Đó là texture packer. ( Nếu các bạn băn khoăn về cách sử dụng thì mình đã có bài hướng dẫn về phần mềm này rồi nhé texture packer)
                     
hình ảnh texture packer
Vậy làm cách nào để khởi tạo texture region ?

                     TextureRegion textureRegion = new TextureRegion(Texture texture, float x, float y , float width, float height);

Ở trên là phương thức đầy đủ nhất khi khởi tạo texture region.
               TextureRegion : lớp của texture region

               textureRegion: tên biến ( bạn muốn sao cũng được )

               Texture : lớp texture
               texture : biến của texture mà textureRegion sẽ lấy 
               x : vị trí x ( ngang ) bắt đầu để lấy hình trong texture
               y : vị trí y ( dọc ) bắt đầu để lấy hình trong texture
               width : chiều rộng cần lấy 
               height : chiều cao cần lấy 

LƯU Ý : x và  y sử dụng hệ "top left" chứ không phải "bottom left" như trong hệ tọa độ bình thường của libgdx có nghĩa là (0,0) sẽ bắt đầu tự góc bên trái ở phía trên.

Ngoài ra, còn nhiều cách khởi tạo libgdx nữa 
              TextureRegion textureRegion = new TextureRegion();
          tạo ra một biến textureRegion rỗng. khi người lập trình không muốn gán thêm hình ảnh ngay mà để sau mới gán.

              TextureRegion textureRegion = new TextureRegion(Texture texture);
          tạo ra một biến textureRegion có kích thước bằng với texture.

               TextureRegion textureRegion = new TextureRegion(TextureRegion textureRegion2);
          tạo ra một biến textureRegion với tất cả thuộc tính bằng với textureRegion2.


Một method khác khá quan trọng đó là flip(boolean x, boolean y). dùng khi người lập trình muốn đảo ngược ảnh. 
       vd: người lập trình đổi hệ tọa độ của anh ta từ "bottom left" thông thường thành "top left" vì quen với hệ tọa độ cũ. khi dùng texture region thì hình ảnh sẽ bị ngược. Do đó, người lập trình bắt buộc phải dùng phương thức  flip(false, true); đổi trục y lại giữ nguyên x mới cho ra đúng được hình ảnh. 
Ngoài ra, flip còn được dùng để tiết kiệm chi phí của chương trình.
     vd: trong trò flappy bird các bạn chắc hẳn thấy hai ống ngược nhau. thường bạn phải vẽ hai ống khác nhau nhưng để tiết kiệm, bạn chỉ cần vẽ một ống rồi flip ống kia mà thôi.

Sau đây là một đoạn code ví dụ để các bạn dễ hiểu hơn về cách dùng texture region

                Texture texture = new Texture(Gdx.files.internal("data/pong.png"));
                 // setFilter sẽ giải thích sau trong phần texture
texture.setFilter(TextureFilter.Nearest,TextureFilter.Nearest);
                // quả bóng đường kính 20 nằm ở góc bên trái trên cùng của texture
TextureRegion ball = new TextureRegion(texture,0,0,20,20);
ball.flip(false, true);











2 comments:

  1. bạn viết hay quá, đang cần tìm hiểu :), dễ hiểu đó, sau khi trình bày hết lý thuyết thì step by step một game cụ thể bạn nhỉ

    ReplyDelete
    Replies
    1. yup! sau khi mình xong hết mấy cái cơ bản mình sẽ hướng dẫn 1 game cụ thể để các bạn ứng dụng

      Delete