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.

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

1 Like

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.

1 Like

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

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ỉ?

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().

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.

1 Like

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);
            }

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?