Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 6 123 ... CuốiCuối
Kết quả 1 đến 10 của 60
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Tạo chuyển động của nhân vật trong Game với XNA - Tut1

    bài này mình sẽ hướng dẫn các bạn tạo chuyển động cho nhân vật trong XNA
    Bài 1 : tìm hiểu về chuyển động của Nhân vật trong Game

    1.chuẩn bị
    download XNA game studio 3.1 từ trang của Microsoft ,cài đặt cho Visual studio 2008

    tạo 1 project mới : Visual C#->XNA 3.1->Windows game->OK


    2.Sprite image 2D là gì ?
    Sprite image 2D thực chất là 1 image tập hợp tất cả các tư thế cơ bản của nhân vật theo một qui luật nào đó
    ví dụ về Sprite image


    3.phân tích ví dụ trên :
    - Hàng 1 : là tập hợp các tư thế cơ bản của nhân vật khi nhân vật chuyển động từ dưới lên trên
    - Hàng 2 : là tập hợp các tư thế cơ bản của nhân vật khi nhân vật chuyển động từ trái qua phải
    - Hàng 3 : là tập hợp các tư thế cơ bản của nhân vật khi nhân vật chuyển động từ trên xuống dưới
    - Hàng 4 : là tập hợp các tư thế cơ bản của nhân vật khi nhân vật chuyển động từ phải qua trái

    4.Làm sao để tạo chuyển động từ Sprite ?
    -Nhân vật hiển thị trong Game được cắt từ 1 trong các tư thế ở trong Sprite image ở trên.Tạm gọi là khung cắt
    -Do các tư thế xếp cách đều nhau nên việc xác định chính xác khung cắt hết sức dễ dàng.Cả sprite image được xem như 1 ma trận 2 chiều các tư thế
    -Khi cần nhân vật chuyển động. giả sử cần nhân vật chuyển động từ dưới lên trên.Ta sẽ cho chỉ số dòng của khung cắt bằng 0 đồng thời cho chỉ số cột lặp lại từ 0->4 và chỉ stop khi nhận được lệnh stop từ chương trình.
    -Như vậy tập hợp các tư thế nhân vật chuyển động từ dưới lên được load trong thời gian ngắn làm cho chúng ta có cảm giác nhân vật bước đi từ dưới lên như thật vậy.
    -Với các hướng chuyển động khác thì cũng làm tương tự nhưng phải thay đổi chỉ số dòng của khung cần cắt cho đúng với hướng chuyển động mà ta mong muốn

    View more random threads:


  2. #2
    Bài 2 : Code chuyển động nhân vật trong XNA

    trong cửa sổ Solution Explorer tìm đến Content ->Chuột Phải->Add->Existing item->chọn 1 cái image nền(nen.png)+chọn sprite trên(man.png)

    Xây dựng lớp NhanVat.cs

    Mã:
    using System;using System.Collections.Generic;using System.Linq;using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Audio;using Microsoft.Xna.Framework.Content;using Microsoft.Xna.Framework.GamerServices;using Microsoft.Xna.Framework.Graphics;using Microsoft.Xna.Framework.Input;using Microsoft.Xna.Framework.Media;using Microsoft.Xna.Framework.Net;using Microsoft.Xna.Framework.Storage; namespace chuyen_dong_nhan_vat{    public class NhanVat    {        private Game1 Game;        private Texture2D text;//sprite nhan vat        private Point khungnhin=new Point(0,0);//vi tri khung nhin        private Point gioihan=new Point(5,4);//gioi han khung nhin        private byte kichthuoc=60;//kich thuoc khung nhin 60x60        private int buocChay = 3;//do dai moi buoc nhan vat        private Point viTri = new Point(0,0);//vi tri nhan vat tren man hinh        private HuongChuyenDong huongChuyenDong;        private bool dangChay = false;        private System.Windows.Forms.Timer capNhat_X;                public NhanVat(Game1 game)        {            this.Game = game;            this.capNhat_X = new System.Windows.Forms.Timer();            this.capNhat_X.Interval = 100;                        this.capNhat_X.Enabled = true;            capNhat_X.Tick += new EventHandler(capNhat_X_Tick);        }         private void capNhat_X_Tick(object sender, EventArgs e)        {            //X chay tu 0->4            //cap nhat dong tac nhan vat            if (dangChay)            {                if (this.khungnhin.X < this.gioihan.X - 1)                {                    this.khungnhin.X += 1;                }                else this.khungnhin.X = 0;            }            else this.khungnhin.X = 0;        }        public void LoadContent(ContentManager Content)        {            this.text = Content.Load<Texture2D>("man");        }        public void Update()        {            KeyboardState keys = Keyboard.GetState();            if (keys.IsKeyDown(Keys.Left))            {                //di chuyen tu phai qua trai                huongChuyenDong = HuongChuyenDong.PhaiQuaTrai;                DiChuyen();                                return;            }            if (keys.IsKeyDown(Keys.Right))            {                //di chuyen tu trai qua phai                huongChuyenDong = HuongChuyenDong.TraiQuaPhai;                DiChuyen();                return;            }            if (keys.IsKeyDown(Keys.Up))            {                //di chuyen tu duoi len tren                huongChuyenDong = HuongChuyenDong.DuoiLenTren;                DiChuyen();                return;            }            if (keys.IsKeyDown(Keys.Down))            {                //di chuyen tu tren xuong                huongChuyenDong = HuongChuyenDong.TrenXuongDuoi;                DiChuyen();                return;            }             this.dangChay = false;        }        public void Draw(SpriteBatch spriteBatch)        {            spriteBatch.Begin();            spriteBatch.Draw(this.text, new Rectangle(this.viTri.X, this.viTri.Y,this.kichthuoc,this.kichthuoc), new Rectangle(this.khungnhin.X * this.kichthuoc, this.khungnhin.Y * this.kichthuoc,this.kichthuoc,this.kichthuoc), Color.White, 0, Vector2.Zero, SpriteEffects.None, 0);            spriteBatch.End();        }        private void DiChuyen()        {            this.dangChay = true;            //Y chay tu 0->3                                        //cap nhat huong chay                if (huongChuyenDong == HuongChuyenDong.DuoiLenTren)                {                    this.viTri.Y -= this.buocChay;                    this.khungnhin.Y = 0;                }                else if (huongChuyenDong == HuongChuyenDong.TrenXuongDuoi)                {                    this.viTri.Y += this.buocChay;                    this.khungnhin.Y = 2;                }                else if (huongChuyenDong == HuongChuyenDong.TraiQuaPhai)                {                    this.viTri.X += this.buocChay;                    this.khungnhin.Y = 1;                }                else if (huongChuyenDong == HuongChuyenDong.PhaiQuaTrai)                {                    this.viTri.X -= this.buocChay;                    this.khungnhin.Y = 3;                }                raNgoaiBanDo();                    }        private void raNgoaiBanDo()        {            int xMax = this.Game.Window.ClientBounds.Width;            int yMax = this.Game.Window.ClientBounds.Height;            if (viTri.X < 0) this.viTri.X += buocChay;            if (viTri.X > xMax-kichthuoc) this.viTri.X -= buocChay;            if (viTri.Y < 0) this.viTri.Y += buocChay;            if (viTri.Y + buocChay > yMax-kichthuoc) this.viTri.Y -= buocChay;                    }    }}
    xây dựng enum HuongChuyenDong.cs

    Mã:
    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace chuyen_dong_nhan_vat{    public enum HuongChuyenDong    {        TraiQuaPhai,        PhaiQuaTrai,        TrenXuongDuoi,        DuoiLenTren,    }}
    code trong Game1.cs như sau

    Mã:
    using System;using System.Collections.Generic;using System.Linq;using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Audio;using Microsoft.Xna.Framework.Content;using Microsoft.Xna.Framework.GamerServices;using Microsoft.Xna.Framework.Graphics;using Microsoft.Xna.Framework.Input;using Microsoft.Xna.Framework.Media;using Microsoft.Xna.Framework.Net;using Microsoft.Xna.Framework.Storage; namespace chuyen_dong_nhan_vat{       public class Game1 : Microsoft.Xna.Framework.Game    {        private GraphicsDeviceManager graphics;        private SpriteBatch spriteBatch;        private NhanVat nhanVat;        private Texture2D nen;        public Game1()        {            graphics = new GraphicsDeviceManager(this);            Content.RootDirectory = "Content";            nhanVat = new NhanVat(this);        }                protected override void Initialize()        {                        base.Initialize();        }                 protected override void LoadContent()        {            spriteBatch = new SpriteBatch(GraphicsDevice);            this.nen = Content.Load<Texture2D>("nen");            this.nhanVat.LoadContent(this.Content);//load sprite cua nhan vat        }         protected override void UnloadContent()        {                   }                 protected override void Update(GameTime gameTime)        {                        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)                this.Exit();            this.nhanVat.Update();//update chuyen dong nhan vat            base.Update(gameTime);        }                 protected override void Draw(GameTime gameTime)        {            GraphicsDevice.Clear(Color.CornflowerBlue);            spriteBatch.Begin();            spriteBatch.Draw(this.nen,new Vector2(0,0),Color.White);            spriteBatch.End();            this.nhanVat.Draw(this.spriteBatch);//ve nhan vat len man hinh            base.Draw(gameTime);        }    }}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    xong rồi ! đây là kết quả
    bây giờ nhấn các phím <- ^ -> nhân vật sẽ chuyển động rất mượt


    code demo đây
    pass: cviet

    ai thắc mắc cứ hỏi ,chúc các bạn vui vẻ [IMG]images/smilies/biggrin.png[/IMG]

    chú ý : để chạy được project phải cài VS2008+XNA framework 3.1

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi zstar
    ừm,lâu rồi toàn chém gió ,chả đc tut nào ,chiều hôm nay lên hứng hồi xuân [IMG]images/smilies/biggrin.png[/IMG]
    Hy vọng bác zstar ngày nào cũng hồi xuân.
    XNA và các engine vật lý là chủ đề mà mình đang rất quan tâm. Vì mình đang tự mày mò nên rất cần những bài tut có ý nghĩa như thế này.
    Nếu bác zstar có thời gian rảnh rỗi thì có thể post những tut liên quan càng nhiều càng tốt được ko ạ?!
    Cảm ơn bác rất nhiều!!![IMG]images/smilies/2.gif[/IMG]

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    nhân tiện hồi nãy có bạn hỏi : enum HuongChuyenDong.cs trong ví dụ này là thừa ???
    tôi xin trả lời :
    đúng là trong ví dụ con con này thì đúng là thừa (có cũng đc,chả có cũng ko sao).nhưng trong 1 game lớn thì nó rất quan trọng(không thể thiếu) . giả sử tại 1 thời điểm bất kì nào đó bạn cần biết nhân vật đang chuyển động theo hướng nào để tính toán hay xử lý 1 cái gì gì đó.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    anh cho em hỏi ? tại sao đen qua máy khác không có cài vs2008 + XNA thì game không chạy được và làm sao đổi tên folder Content thành tên khác.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi anglelover
    anh cho em hỏi ? tại sao đen qua máy khác không có cài vs2008 + XNA thì game không chạy được và làm sao đổi tên folder Content thành tên khác.
    hi you !
    -thư mục COntents , mặc định tên như thế rồi, ko đổi tên đc....
    -nếu chạy file exe thì máy khác chỉ cần cài xna 3.1 redistributable+.net framework...còn nếu máy khác chạy project thì phải cài vs2008+xna framework

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    CHo em hỏi tạo cái nền và ảnh Nhân vật phân ra kiểu ma trận như vậy thì là thế nào?
    Anh có thể Demo 1 cái ảnh khác tương tự ko?

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi yuchi_1k91
    CHo em hỏi tạo cái nền và ảnh Nhân vật phân ra kiểu ma trận như vậy thì là thế nào?
    có 2 cách :

    1. bạn phải thật rành photoshop ,am hiểu về chuyển động
    2. dùng hàng free thôi [IMG]images/smilies/tongue.png[/IMG]

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi zstar
    ebook XNA đây bạn
    http://forums.congdongcviet.com/show...1&postcount=22

    thực sự thì những gì mình post lên diễn đàn này (ngoại trừ mấy bài spam) tớ tự học cả mà,chẳng được học cái gì bài bản đâu..tự mình cố gắng vươn lên thôi

    trên giảng đường đh mình đc học nhiều thứ mà mình tự hỏi là không biết học những thứ này ra để làm cái quái gì ko biết => điều đó càng làm tớ quyết tâm tự học......tự học là chính ,học những gì mình cảm thấy cần thiết sau này,kiến thức quả là vô hạn......ko thể tin nổi zstar hơn 2 năm về trước đang là 1 con gà chính hiệu...............................!!!!!!!!!!!!!
    Dùng từ hơi thô nhung nghe mà "phê" rồi đấy [IMG]images/smilies/wink.png[/IMG]) ,
    Cám ơn anh nha, hi vọng anh tiếp tục ra nhiều bài để bọn em học hỏi!
    Cố gắng học để có cơ hội giao lưu với anh thôi [IMG]images/smilies/biggrin.png[/IMG]
    Thanks!

    Ko được rồi anh ơi, down ra file "attachment.php"! Up lại cho em nha, thanks!

    Em sang dùng FireFox thì lại download được, Google Chrome ra KQ như trên!
    Ok thank!

 

 
Trang 1 của 6 123 ... CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •