Title Forum
IndexIndex  CalendarCalendar  GalleryGallery  Trợ giúpTrợ giúp  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  
News & Announcements
  • Gallery & Others
  • Top posters
 N.H.M (706)
 nhuantrung0210 (323)
 TjaGoChangLj (227)
 GVRFnu-Bjn (190)
 lisaidong (122)
 phongngan1997 (94)
 puppy:x* (85)
 anhcudo01 (69)
 taoghetmay (68)
 anhlathe47 (45)

Share | 
 

 [TUT XNAVN]Xe tăng biết bắn.

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
nhokviet
Gà Con
Gà Con


Thanked : 0


Bài gửiTiêu đề: [TUT XNAVN]Xe tăng biết bắn.   27/11/2010, 11:21 pm

Nguồn: XNAVN.com

Ở bài: Tạo xe tăng di chuyển
Mình đã hướng dẫn cách tạo nhân vật và di chuyển, sang bài này mình xin hướng dẫn các bạn cách cho xe biết bắn :D.

Tài nguyên:
Mô hình xe cũ + code cũ
Trích dẫn :
[You must be registered and logged in to see this image.]
Code: [You must be registered and logged in to see this link.]
Hình ảnh viên đạn:
[You must be registered and logged in to see this image.]

Đây là Code tớ đã làm xong: Các bạn tham khảo nha
Code:
Download: http://www.mediafire.com/?krwid5izsny6rt3
Ok vô công việc nào :D

Bây giờ ta có lớp Xe Tăng, tiếp theo ta cần tạo 1 lớp VienDan. Lớp này cũng có 1 số thuộc tính tương tự với lớp Xe Tăng. Khai báo các biến cho lớp.

Code:
    class VienDan
    {
        public Vector2 ToaDo { get; set; }
        public Texture2D HinhAnh { get; set; }
        public List<Rectangle> Frame { get; set; }
        public int HuongDiChuyen { get; set; }
        public bool HienRa { get; set; } //Vì sao có biến này tớ sẽ giải thích sau.
    }
Tiếp theo là hàm khởi tạo viên đạn :D
Code:
        public VienDan(Texture2D HinhAnhMoi, Vector2 ToaDoMoi, int HDChuyen)
        {
            HinhAnh = HinhAnhMoi;
            ToaDo = ToaDoMoi;
            HienRa = true;
            XacDinhHuongDi(HDChuyen);
            CatHinh();
        }
Ở đây có 2 hàm con là XacDinhHuongDi(HDChuyen); và CatHinh(); .
Hàm cắt hình thì tương tự như bên lớp XeTank, ta chia cái hình ảnh ra làm 4 khung hình.
Code:
        public void CatHinh()
        {
            Frame = new List<Rectangle>();
            Frame.Add(new Rectangle(0,  0,  9, 20));
            Frame.Add(new Rectangle(11,  0,  9, 20));
            Frame.Add(new Rectangle(24, 11, 20,  9));
            Frame.Add(new Rectangle(24,  0, 20,  9));
        }
Ok còn hàm XacDinhHuongDi(HDChuyen); là hàm sẽ xác định hướng đi từ hướng đi của xe tăng bạn.

Code:
        public void XacDinhHuongDi(int HDChuyen)
        {
            switch (HDChuyen)
            {
                case 0:
                    HuongDiChuyen = 0;
                    break;
                case 5:
                    HuongDiChuyen = 1;
                    break;
                case 10:
                    HuongDiChuyen = 2;
                    break;
                case 15:
                    HuongDiChuyen = 3;
                    break;
            }
        }
Ok vậy coi như xong phần khởi tạo :D. Tiếp theo là hàm giúp viên đạn của bạn "biết đi" ^^!.

Code:
        public void DiChuyen()
        {
            if (HienRa == true)
            {
                switch (HuongDiChuyen)
                {
                    case 0:
                        ToaDo += new Vector2(0, 1);
                        break;
                    case 1:
                        ToaDo += new Vector2(0, -1);
                        break;
                    case 2:
                        ToaDo += new Vector2(1, 0);
                        break;
                    case 3:
                        ToaDo += new Vector2(-1, 0);
                        break;
                }
            }
            KiemTraManHinh();
        }
Các bạn ở đây chú ý nhé, trong hàm này tớ làm thêm 1 hàm con là KiemTraManHinh(); và hàm nó đây

Code:
                public void KiemTraManHinh()
        {
            if (ToaDo.X > 300 || ToaDo.X < 0 || ToaDo.Y > 300 || ToaDo.Y < 0)
            {
                HienRa = false;
            }
        }
Tớ xin giải thích thêm về biến HienRa và hàm này, thứ nhất hàm này nó sẽ kiểm tra viên đạn có "lọt" ra ngoài màn hình game hay ko, nếu lọt ra thì HienRa= false. Còn biến HienRa nó như 1 chìa khóa, nếu mà HienRa == true thì viên đạn này con trên màn hình, còn không thì nó sẽ tạm ẩn, khi cần sẽ gọi lại để tiếp kiệm bộ nhớ. Tớ chỉ tạm giấu nó đi thôi và khi cần sẽ gọi lại.

Còn đây là Hàm "mở khóa" cho viên đạn để dùng lại
Code:
        public void HienLen(Vector2 ToaDoVao, int Huong)
        {
            HienRa = true;
            ToaDo = ToaDoVao;
            HuongDiChuyen = HuongDiChuyen;
        }
Thay vì khi bạn khởi tạo 1 viên đạn mới thì bạn chỉ cần lấy các viên đạn đã xài :D và bị "khóa" lại để xài tiếp.

Cuối cùng là hàm Draw game đồ họa mà ko có cái này thì chơi cái gì nhỉ :))
Code:
        public void Draw(SpriteBatch spriteBatch)
        {
            if (HienRa == true)
                spriteBatch.Draw(HinhAnh,ToaDo,Frame[HuongDiChuyen],Color.White);
        }
Vậy là ok xong lớp VienDan. giờ ta cải tiến thêm cho lớp xe tăng.

Lớp xe tăng phần khai báo viến chúng ta thêm 2 cái nữa để dùng cho lớp VienDan;
Code:
public Texture2D HinhAnhVienDan { get; set; }
public List<VienDan> ListDan { get; set; }
Hàm khởi tạo 1 cũng sửa lại 1 tí.
Code:
public XeTank( List<Texture2D> HinhAnhVao, Vector2 ToaDoVao)
        {
            HinhAnh = HinhAnhVao[0];
            HinhAnhVienDan = HinhAnhVao[1];
            ToaDo = ToaDoVao;
            Frame = new List<Rectangle>();
            HuongDiChuyen = 0;
            ID = 0;
            CatHinh();
            ListDan = new List<VienDan>();
        }
Mình xin giải thích thêm về hàm này:
Thứ nhất là biến truyền vào mình sửa lại là List<Texture2D> HinhAnhVao Vì ở đây có 2 hình được đưa vào :D là VienDan và Tank0 mình làm cái này cho gọn và theo qquy ước riêng của mình là HinhAnhVao[0] là Xe Tank còn HinhAnhVao[1] là VienDan.
Thứ 2 là tớ tạo 1 ListDan = new List<VienDan>(); để cho nó chứa danh sách đạn của bạn.

Rồi giờ tới hàm bắn :D cho xe tăng :D
Code:
        public void Ban()
        {
            if (ListDan.Count == 0) //Kiểm tra chưa có đạn thì tạo 1 đạn mới
            {
                ListDan.Add(new VienDan(HinhAnhVienDan, ToaDo, HuongDiChuyen));
            }
            else //Có đạn rồi thì coi thằng nào bị khóa mở ra xài lại
            {
                for (int i = 0; i < ListDan.Count; i++)
                {
                    if (ListDan[i].HienRa == false)
                    {
                        ListDan[i].HienLen(ToaDo, HuongDiChuyen);
                        return;
                    }
                }
                ListDan.Add(new VienDan(HinhAnhVienDan, ToaDo, HuongDiChuyen)); //Còn ko có em nào khóa cũng xin 1 cái mới
            }
        }
Tiếp theo là hàm di chuyển đống đạn đó :)), cái này thì chỉ gọi hàm của lớp đạn thôi.
Code:
        public void DiChuyenDan()
        {
            if (ListDan.Count != 0)
            {
                for (int i = 0; i < ListDan.Count; i++)
                {
                    ListDan[i].DiChuyen();
                }
            }
        }
Tiếp theo là hàm vẽ :D cũng chỉ gọi thêm cái hàm di chuyển của viên đạn.
Code:
        public void Draw(SpriteBatch spriteBatch)
        {
                spriteBatch.Draw(HinhAnh, ToaDo, Frame[ID], Color.White); //Bạn nhớ ở đây cho Frame[ID] vào nha
                for (int i = 0; i < ListDan.Count; i++)
                    ListDan[i].Draw(spriteBatch);
        }
Ok xong lớp tăng ta qua lớp Game1.
Trong hàm DieuKhien(XeTank Tank1) các bạn thêm 1 button để bắn bằng bằng nha.
Code:
            if (keyboardState.IsKeyDown(Keys.A))
            {
                Tank1.Ban();
            }
Tớ chọn nút đó là A.
Và hàm LoadContent cũng sửa lại 1 xíu.
Code:
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            List<Texture2D> HinhAnh = new List<Texture2D>();
            HinhAnh.Add(Content.Load<Texture2D>("tank0"));
            HinhAnh.Add(Content.Load<Texture2D>("VienDan"));
            Tank = new XeTank(HinhAnh, new Vector2(200, 200));
        }
Vì hồi nãy hàm khởi tao XeTank tớ sửa lại cách nạp giá trị nên cái này mình cũng phải edit theo.

Còn hàm update chỉ cần gọi các hàm Con cần thiết ra
Code:
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            DieuKhien(Tank);
            Tank.DiChuyenDan();
            base.Update(gameTime);
        }
Ok kết thúc rùi :D xem kết quả đi nào F5. Vì cái này tớ chỉ hướng dẫn cơ bản nên có 1 số điều hơi bùn cười là vị trí viên đạn bắn ra :D và tốc độ bắn còn quá nhanh. tớ sẽ hướng dẫn khắc phục ở bài sau.
Chữ Ký Cá Nhân
Về Đầu Trang Go down
Xem lý lịch thành viên
 

[TUT XNAVN]Xe tăng biết bắn.

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Vn-Screen Forum :: Công Nghệ Thông Tin :: Phát Triển Games :: Thảo Luận XNA-
VN-SCREEN.DARKBB.COM
Design by N.H.M - Developed by Vn-Screen Member
Free forum | Games | Các bài đã đưa Internet trò chơi | © phpBB | Free forum support | Liên hệ | Report an abuse | Have a free blog with Sosblogs