Application.Run
কল ড্রাইভ আপনার উইন্ডোজ বার্তা পাম্প, যা পরিণামে কি ক্ষমতা সমস্ত ঘটনা আপনার উপর হুক করতে পারেন Form
শ্রেণী (এবং অন্যদের)। এই বাস্তুতন্ত্রের একটি গেম লুপ তৈরি করতে, আপনি যখন অ্যাপ্লিকেশনটির বার্তা পাম্পটি খালি থাকে তখন শুনতে চান এবং এটি শূন্য থাকা অবস্থায় সাধারণত "প্রক্রিয়া ইনপুট স্টেটটি করুন, গেমের যুক্তি আপডেট করুন, দৃশ্যের রেন্ডার করুন" প্রোটোটাইপিক গেম লুপের পদক্ষেপগুলি ।
Application.Idle
প্রতিবার অ্যাপ্লিকেশনটির বার্তার সারিটি খালি হয়ে যাওয়ার পরে ইভেন্টটি জ্বলে ওঠে এবং অ্যাপ্লিকেশনটি নিষ্ক্রিয় অবস্থায় রূপান্তরিত হয়। আপনি আপনার মূল ফর্মটির নির্মাতায় ইভেন্টটি হুক করতে পারেন:
class MainForm : Form {
public MainForm () {
Application.Idle += HandleApplicationIdle;
}
void HandleApplicationIdle (object sender, EventArgs e) {
//TODO: Implement me.
}
}
এর পরে, অ্যাপ্লিকেশনটি এখনও নিষ্ক্রিয় কিনা তা আপনাকে নির্ধারণ করতে সক্ষম হতে হবে । Idle
ঘটনা শুধুমাত্র একবার আগুন, যখন আবেদন হয়ে অলস। কোনও বার্তা কাতারে না পৌঁছানো এবং তারপরে কিউটি আবার খালি করে না দেওয়া পর্যন্ত এটি আর বরখাস্ত হয় না। উইন্ডোজ ফর্মগুলি বার্তাগুলির সারিটির স্থিতি অনুসন্ধানের জন্য কোনও পদ্ধতি উন্মোচিত করে না, তবে আপনি এই প্রশ্নের উত্তর দিতে পারে এমন একটি নেটিভ উইন 32 ফাংশনে কোয়েরিটি অর্পণ করতে প্ল্যাটফর্ম অনুরোধ পরিষেবাগুলি ব্যবহার করতে পারেন । এর জন্য আমদানির ঘোষণা এবং এর সমর্থনকারী প্রকারগুলি দেখে মনে হয়:PeekMessage
[StructLayout(LayoutKind.Sequential)]
public struct NativeMessage
{
public IntPtr Handle;
public uint Message;
public IntPtr WParameter;
public IntPtr LParameter;
public uint Time;
public Point Location;
}
[DllImport("user32.dll")]
public static extern int PeekMessage(out NativeMessage message, IntPtr window, uint filterMin, uint filterMax, uint remove);
PeekMessage
মূলত আপনাকে পরের বার্তাকে কাতারে দেখার অনুমতি দেয়; এটি উপস্থিত থাকলে সত্য ফিরে আসে, অন্যথায় মিথ্যা। এই সমস্যাটির উদ্দেশ্যে, প্যারামিটারগুলির মধ্যে কোনওটিই বিশেষভাবে প্রাসঙ্গিক নয়: এটি কেবল ফেরতের মূল্যের জন্য গুরুত্বপূর্ণ। এটি আপনাকে এমন একটি ফাংশন লিখতে দেয় যা আপনাকে জানায় যে অ্যাপ্লিকেশনটি এখনও নিষ্ক্রিয় রয়েছে (যা এখনও সারিতে কোনও বার্তা নেই):
bool IsApplicationIdle () {
NativeMessage result;
return PeekMessage(out result, IntPtr.Zero, (uint)0, (uint)0, (uint)0) == 0;
}
আপনার সম্পূর্ণ গেম লুপটি লেখার জন্য আপনার যা দরকার তা এখন রয়েছে:
class MainForm : Form {
public MainForm () {
Application.Idle += HandleApplicationIdle;
}
void HandleApplicationIdle (object sender, EventArgs e) {
while(IsApplicationIdle()) {
Update();
Render();
}
}
void Update () {
// ...
}
void Render () {
// ...
}
[StructLayout(LayoutKind.Sequential)]
public struct NativeMessage
{
public IntPtr Handle;
public uint Message;
public IntPtr WParameter;
public IntPtr LParameter;
public uint Time;
public Point Location;
}
[DllImport("user32.dll")]
public static extern int PeekMessage(out NativeMessage message, IntPtr window, uint filterMin, uint filterMax, uint remove);
}
তদ্ব্যতীত, এই পদ্ধতির সাথে ক্যানোনিকাল নেটিভ উইন্ডোজ গেম লুপটি যতটা সম্ভব সম্ভব (পি / ইনভোকের উপর ন্যূনতম নির্ভরতার সাথে) মেলে যা দেখতে দেখতে:
while (!done) {
if (PeekMessage(&message, window, 0, 0, PM_REMOVE)){
TranslateMessage(&message);
DispatchMessage(&message);
}
else {
Update();
Render();
}
}