Khi bạn viết một trò chơi mà không sử dụng các sự kiện ... tất cả các bạn thực sự đang tự thực hiện các sự kiện. Điều này là thuận lợi, bởi vì bạn có thể làm cho nó hiệu quả hơn rất nhiều so với việc sử dụng các sự kiện tích hợp trong ngôn ngữ của bạn. Trò chơi được viết theo cách này ít bị lỗi hơn nếu bạn biết mình đang làm gì.
Ví dụ: khi tôi cố gắng dạy cho anh trai tôi cách trò chơi được viết, tôi đã viết một trò chơi rắn đơn giản cho anh ấy. Tôi đã có vòng lặp chính trong một sợi, di chuyển con rắn và vẽ nó ở vị trí mới của nó trong một chu kỳ. Tôi sẽ có một sợi chạy cùng một lúc liên tục kiểm tra 4 thứ:
1) Nếu con rắn bị rơi vào chính nó (trò chơi kết thúc); nếu trò chơi kết thúc xảy ra, tạm dừng chủ đề chính cập nhật vị trí chính của con rắn, in trò chơi lên trên màn hình, chờ đầu vào chính, sau đó khởi động lại trò chơi.
2) Nếu con rắn đã ăn táo; tăng biến số lượt truy cập cho biết có bao nhiêu quả táo đã được ăn và in giá trị mới này trên màn hình, ghi đè lên những gì đã có trước đây.
3) Nếu con rắn đã ăn một lượng táo chia hết cho 10 (con rắn mọc bởi 1 tế bào, trừ từ một biến chờ đợi mà nói bao nhiêu thời gian phải vượt qua giữa mỗi phong trào rắn làm)
4) Nếu một phím mũi tên đã được nhấn. Nếu trái, thiết lập di chuyển đến 0, nếu thiết lập phải di chuyển đến 1, nếu thiết lập xuống di chuyển đến 2, nếu thiết lập di chuyển đến 3. int rằng điều này được lưu trữ trong là một con trỏ đến một mảng của 4 đại biểu mà làm cho con rắn di chuyển đi đúng hướng.
Vòng lặp chính cập nhật vị trí của con rắn sẽ cho chủ đề kiểm tra 4 điều mà con rắn đang làm. Cách tôi làm điều này là tôi có tất cả các tế bào trên màn hình mà đầu con rắn di chuyển để tham khảo một mảng 2 chiều của các đại biểu. Giới thiệu về mảng đại biểu này:
Trò chơi được viết ở chế độ bảng điều khiển và sử dụng màu bảng điều khiển. Bảng điều khiển được đặt thành 80x50 ký tự. Một đại biểu như sau: "delegate void ptr()"; sau đó tôi tạo mảng với: "ptr [,] pos = new ptr [80,50]". Nói đầu của con rắn ở vị trí (4,5) trên màn hình, sau khi nó đã di chuyển ở đó vòng lặp chính sẽ thực thi "pos [4,5] .Invoke();".
Một trong số chúng: Khi con rắn di chuyển đến vị trí mới, chuỗi vòng lặp chính sẽ lấy từng ô mà con rắn nằm trên màn hình và đặt đại biểu tại vị trí đó để trỏ đến một hàm có tên là "void gameover() "sẽ đặt biến gameover_ thành true. Vì vậy, khi các chủ đề vòng lặp kiểm tra tình trạng của trò chơi kiểm tra cho gameover, nó đóng băng các trò chơi và in trò chơi trên màn hình.
Khác: Khi quả táo được vẽ trên màn hình, vị trí đại biểu được vẽ tại (được chọn ngẫu nhiên) được đặt thành "void increment_apple()" tăng bộ đếm táo, xóa táo hiện tại khỏi xem, và vẽ một quả táo mới trên màn hình, thiết lập vị trí táo cũ để trỏ đến một "void nop()" mà không có gì, và vị trí táo mới để trỏ đến "void increment_apple()".
Đây là cơ bản cách hoạt động của trò chơi. Như bạn có thể thấy, con rắn di chuyển đến các vị trí này trên màn hình và nó không thực hiện bất kỳ kiểm tra rõ ràng nào như "if (snake_position == some_position)", trò chơi sẽ tự động thực hiện mọi thứ cần thiết cho mọi thứ xảy ra trong trò chơi, giống như cách bạn bấm vào một nút trên một biểu mẫu, một hành động được gán cho sự kiện đó được tự động thực hiện, mà không cần phải tự kiểm tra sự kiện đó.
Vì vậy, bạn thấy đấy, tôi có thể đã sử dụng biểu mẫu và các sự kiện mặc định mà C# cung cấp, nhưng tôi thì không. Tôi đã sử dụng giao diện điều khiển và triển khai hệ thống sự kiện của riêng mình.
Đây là cách hoạt động của cảnh sau: vòng lặp chính cho ứng dụng biểu mẫu của bạn sẽ chạy trong chuỗi kiểm tra đầu vào từ tất cả các nút, v.v. trên màn hình. Mỗi mục này sẽ thiết lập một biến boolean mà chúng sử dụng thành true. Khi bạn nhấp vào nút này, một chuỗi khác chạy vòng lặp kiểm tra những gì bạn đã nhấn và nói rằng bạn đã nhấn một nút có tên là "button1", nút đó sẽ có một đại biểu được gán cho nó; rằng người được ủy quyền sau đó được thực hiện với bất cứ điều gì nó chỉ ra.
Loại khó giải thích, nhưng điều này có hợp lý với bạn không?
** Ứng dụng giao diện ** thường không tương tác với chuột và cũng không có nhiều quan tâm về hệ tọa độ pixel. Trong khi tôi chắc chắn bạn sắp nhận được một loạt các câu trả lời mô tả cách nắm bắt chuột và điều gì đó, tôi nghĩ bạn nên lùi lại một bước và xem xét lại những gì bạn đang làm. –
Cảm ơn rất nhiều vì đã bình luận, nhưng tôi đang học nhiều nhất có thể về các ứng dụng giao diện điều khiển C#. Trong khoảng 3 tháng, tôi sẽ hài lòng, và chuyển sang các hình thức, và cuối cùng là các ngôn ngữ mới. Tôi đã đọc một phần blog của bạn và đánh giá cao quan điểm của bạn về việc học ngôn ngữ nào trước tiên. Bắt một ngôn ngữ để làm một cái gì đó bình thường không trong một số trường hợp chỉ là một phần của thách thức. – Bloodyaugust