01/10/2018, 09:44

Làm game bằng Winforms C# bị giật

Mình đang thử làm game bắn tank đơn giản trên winforms. Cách mình làm là có một PictureBox (Màu đen ở trong hình) để vẽ tất cả các đối tượng lên trên đó. Mình xóa các đối tượng trên đó, rồi cập nhập các đối tượng xong lại vẽ lên lại; nhưng thấy giật quá, không biết tại sao.

Dark.Hades viết 11:46 ngày 01/10/2018

Bạn nên làm 1 hàm update() và chạy suốt chương trình (loop), như thế sẽ tránh giật

Tao Không Ngu. viết 11:51 ngày 01/10/2018

Hi Nguyễn Đức Anh.
1 Bạn cần tìm hiểu các kiến thức cơ bản liên quan đến lập trình game.
2 Học kỹ C# WF đỂ BIẾT ƯU NHUỢC ĐIỂM CỦĂ NÓ>
3 WF không sinh ra lập trình game nên lựa chọn nền tảng khác.

Văn Dương viết 11:59 ngày 01/10/2018

ẾCh thấy code đâu không biết xem kiểu gì

Nguyễn Đức Anh viết 11:56 ngày 01/10/2018

Cái hàm Update đó như thế nào bạn? Hình như Winforms làm việc theo kiểu sự kiện. Hết sự kiện nó mới cập nhập lên form, vậy nếu mình làm vòng lặp trong sự kiện thì nó sẽ không xuất được lên màn hình nhỉ?

Nguyễn Đức Anh viết 11:52 ngày 01/10/2018

Code nhiều và tách ra nhiều file nên khó đưa lên đây. Đại khái là mình dùng một cái sự kiện của Timer, 1 millisecond nó sẽ gọi sự kiện một lần. Trong sự kiện đó gọi 3 hàm, Clear(), Update(), Draw().

Văn Dương viết 12:00 ngày 01/10/2018

Thứ nhất:
Màn hình và C# chỉ có refresh rate màn hình là 50-60Hz.
Nên gọi timer 1ms là lãng phí chẳng để làm gì chỉ tốn tài nguyên. Nếu dùng timer thì nên gọi tối thiểu 7ms.

Thứ 2: chỉ update khi có thay đổi.
Thứ 3: xem lại 3 hàm trong timer làm gì và như thế nào.
Mình muốn xem 3 hàm đó (vẽ lên bitmap ??)
Thứ 4: xem xét xem có thể chạy multi thread hay không.

Nếu đúng cách, C# vẫn xử lý được trên 100fps với khung hình 1280x1024.

Nguyễn Đức Anh viết 11:52 ngày 01/10/2018

Mình làm tầm bậy lắm. Mình còn chưa biết phân tích xem cần những lớp như thế nào, phương thức, thuộc tính nào. Mình copy lên đây là hàm lấy hình ảnh của xe tank theo hướng di chuyển với vẽ hình xe tank đó lên PictureBox dựa vào Graphics

Image LayHinhAnh(eDirection huongDiChuyen)
            {
                Image ketQua = new Bitmap(Tank.Width, Tank.Height);
                Image img = Image.FromFile(Program.LayDuongDanDenResource() + "\\Tank.png");

                Graphics grs = Graphics.FromImage(ketQua);
                Rectangle desSize = new Rectangle(0, 0, Tank.Width - 1, Tank.Height - 1);
                Rectangle srcRect = new Rectangle((int)direction * 15, 0, 14, 14);
                grs.DrawImage(img, desSize, srcRect, GraphicsUnit.Pixel);

                grs.Dispose();

                return ketQua;
            }

            void Ve()
            {
                grs.DrawImage(HinhAnh, ToaDo);
            }


            void Xoa()
            {
                grs.DrawImage(HinhNen, ToaDo);
            }
Kohina viết 11:59 ngày 01/10/2018

Chỉnh thuộc tính DoubleBuffered của form thành true => hết giật.

Bài liên quan
0