متحرک سازی کنترل ها و بررسی برخورد در سی شارپ WinForm

قبلا در «این آموزش»، به نحوه‌ی تغییر مکان و جابه‌جایی یک کنترل در سی شارپ اشاره کردیم؛ و حالا قصد داریم تا به متحرک‌سازی یک کنترل و بررسی برخورد آن با سایر عناصر بپردازیم.

فرض مسئله

  • یک کنترل روی فرم وجود دارد.
  • کنترل با اجرای اپلیکیشن شروع به حرکت به راست می‌کند.
  • وقتی به طرف راست فرم برخورد کرد، به سمت مخالف بر‌می‌گردد و شروع به حرکت می‌کند.
  • وقتی به سمت چپ فرم برخورد کرد، دوباره به سمت راست بر‌می‌گردد
  • و این چرخه، ادامه می‌یابد.

مراحل انجام کار

1- یک کنترل دلخواهِ قابل نمایش، روی فرم خود قرار دهید.

  • در این‌جا من یک PictureBox قرار می‌دهم.
  • برای ویژگی BackColor آن یک رنگ دلخواه تعیین کنید تا قابل نمایش باشد. (البته می‌توانید یک عکس نیز به جای رنگ انتخاب کنید)

2- یک کنترل Timer به فرم اضافه کنید.

  • ویژگی Enabled آن را true کرده تا به محض اجرای برنامه، تایمر شروع به اجرا کند.
  • ویژگی Interval آن را برابر با 1 قرار دهید تا هر 1 هزارم ثانیه یک بار اجرا شود.
  • توجه داشته باشید که برای 24 فریم شدن می‌توان مقدار آن را 42 قرار داد که حاصل تقسیم 1000 بر 24 می‌باشد.

3- روی تایمر، دابل کنید تا وارد رویداد Tick آن شوید.
طبق چیزی که در «این‌مطلب» گفته شد، این رویداد را به صورت زیر کامل می‌کنیم:

private void timer1_Tick(object sender, EventArgs e)
{
    pictureBox1.Location = new Point(pictureBox1.Location.X + 1, pictureBox1.Location.Y);
}

همانطور که می‌بینید، در این‌جا موقعیت x کنترل را هربار یکی به سمت راست می‌بریم ولی y آن را برابر با همان مقدار قبلی قرار می‌دهیم. این باعث می‌شود تا در محور افقی حرکت کنیم و از نظر عمودی حرکتی نداشته باشیم.

4- حالا اگر برنامه را اجرا کنید، مشاهده خواهید کرد که کنترل به سمت راست شروع به حرکت می‌کند.
بنابراین کد کامل ما به صورت زیر خواهد بود:

private int displacement = 1;
private int direction = 1;

private void timer1_Tick(object sender, EventArgs e)
{
    if (pictureBox1.Right >= this.ClientSize.Width || pictureBox1.Left <= 0) direction *= -1;
    pictureBox1.Location = new Point(pictureBox1.Location.X + displacement * direction, pictureBox1.Location.Y);
}
  • displacement مسافتی است که در هربار تغییر می‌کند.
  • direction برای مشخص کردن جهت می‌باشد که اگر بخواهیم به راست برود آن را 1 و اگر به چپ برود، آن را -1 می‌کنیم.
  • سرعت حرکت و جابه‌جایی کنترل، به مقدارهای displacement و Interval بستگی دارد.
  • تشخیص برخورد:
    • اگر موقعیت سمت راست pictureBox بزرگتر از عرض فرم باشد، یعنی به سمت راست برخورد کرده است.
      توجه داشته باشید که در این‌جا از ClientSize به خاطر این استفاده کردیم تا Border های اطراف فرم حساب نشوند.
    • اگر موقعیت سمت چپ pictureBox از 0 کوچکتر باشد یعنی به سمت چپ فرم برخورد کرده است.
  • نکته: ما بستگی به displacement باید این برخورد را بررسی کنیم؛ چون اگر مقدار آن بزرگتر از 1 باشد، به احتمال خیلی زیاد شاید در حرکت بعدی خود از دیوار رد شود و بعد از رد شدن در اجرای بعدی شمرده شود! ولی ما می‌خواهیم که دقیقا با آن مماس شده و از آن عبور نکند و باگی برایمان وجود نداشته باشد.
    برای حل این مشکل می‌توان هربار قبل از تنظیم موقعیت جدید، آن را به دست آورده و بررسی کنیم و اگر از فرم عبور می‌کند، کمی از مقدار displacement کم کنیم.
    انجام این کار را به خودتان واگذار می‌کنم.
  • بقیه کد هم که تغییر لوکیشن بر اساس متغیرهای جدید می‌باشد و با کمی دقت، قابل فهم بوده و نیازی به توضیح ندارد.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

cp-codfk

نظرات ثبت شده 18 دیدگاه

    1. masoumeh کاربر عضو گفت:

      تشکر میکنم بابت جواب عالیتون، واقعا مشکلم حل شد،
      یه سوال هم دارم: ما 4 تا دکمه داریم هرکدوم تو یکی از گوشه های فرم، چه جوری با تغییر اندازه فرم لوکشن این فرم ها هم تغییر کنه یعنی همیشه تو گوشه بمونن
      با Dock کل قسمت بالا یا راست رو میگیرند
      با تشکر

      21
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام. با Dock حل نمیشه باید با Anchor کار کنین.

    2. skylark99 کاربر عضو گفت:

      سلام و عرض خسته نباشید.
      یک سوال داشتم اونم اینکه من اگه بخوام این picture box علاوه بر حرکت از چب به راست
      همزمان به صورت رندوم به بالا و بایین (شاید مثل حرکت یه اتم!)هم حرکت کنه چیکار باید بکنم؟

      اگه جوابش بهم ایمیل هم بشه خیلی ممنون میشم <3

      21
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام؛ مقدار y رو هم تغییر بدین!

    3. parsa کاربر مهمان گفت:

      سلام ممنون بابت اموزشتون
      میشه یک مطلب بزارید کلا در مورد کار با تایمر در سی شارپ ممنون میشم

      21
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام؛ خدمت شما «لینک»

    4. محمد کاربر مهمان گفت:

      سلام ، چطوری کاری کنم که عکس مورد نظر به کادر صفحه که رسید دکمش خاموش شه ؟ (مثلا تصویر به کادره سمت راست رسید و اگه بیشتر از این حرکت کنه عکس خارج میشه از صفحه میخوام جلوگیری کنم ) چیکارکنم ؟!

      12
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام؛ خب مطلب بالا هم در مورد همین سوالیه که پرسیدین! ?

    5. Sobhan کاربر مهمان گفت:

      سلام، خیلی ممنون از آموزشتان
      اگه ممکنه می فرمایید اگه بخواهیم با زدن یک دکمه picturebox رو حرکت بدیم از چه کدی باید استفاده کنیم
      به عنوان مثال وقتی کلید W رو می زنیم picturebox به سمت بالا حرکت کند

      21
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام. منظورتون اینه که چطور کلیدهای کیبورد رو تشخیص بدیم؟

        1. سبحان کاربر مهمان گفت:

          بله
          من داخل سایت های دیگه که جست و جو کردم و متوجه شدم باید یه متد key_down درست کنیم
          ولی نمی دونم چطوری باید درست کنیم
          ممنون می شم راهنماییم کنید

          21
          1. هادی اکبرزاده مدیر سایت گفت:

            خدمت شما.
            لینک: «رویدادهای کیبورد در سی شارپ»

            1. سبحان کاربر مهمان گفت:

              خیلی متشکرم

              21
    6. سبحان کاربر مهمان گفت:

      سلام
      ممنون که به سوالات ما پاسخ می دهید
      من از قطعه کد زیر استفاده می کنم
      if (PictureBox.Loction.Equale (PictureBox2.Loction((;
      با توجه به کد بالا و همان طور که می دانید هنگامی که PictureBox2 روی picturebox1 قرار بگیره باید اتفاقی بیوفتد
      ولی باید دقیق روی هم قرار بگیرند
      که این حالت برای طراحی بعضی برنامه ها و بازی ها بده
      آیا قطعه کدی داریم که هنگامی که قسمت کوچکی از picturebox1 روی PictureBox2 قرار بگیری اتفاقی بیفتد
      خیلی ممنونم

      11
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام. روشی که اینجا برای تشخیص برخورد با لبه‌های فرم گفته شده رو برروی PictureBox پیاده کنید.

    7. سبحان کاربر مهمان گفت:

      سلام.
      بنده برنامه ای می نویسم که نیاز دارم وقتی کاربر در آن برنامه تغییری ایجاد میکند ذخیره شود.
      ولی متاسفانه وقتی از برنامه خارج می‌شویم برنامه ریست می شود.
      آیا ممکنه راهنماییم کنید که این ویژگی رو به برنامه اضافه کنم.
      من در سایت های دیگه جست‌وجو کردم ولی درباره ی این مطلب چیزی پیدا نکردم به همین خاطر در اینجا مزاحمتون شدم.
      ممنون.

      11
      1. هادی اکبرزاده مدیر سایت گفت:

        سلام. باید تغییرات رو به عنوان تنظیمات ذخیره کرده و موقع اجرای بعدی برنامه، بارگزاری و اجرا کنید.
        از سیستم تنظیمات خود دات نت هم می‌تونید استفاده کنید

    8. سبحان کاربر مهمان گفت:

      سلام.
      من یک فرد مبتدی هستم که فعلا با فضای برخی منو های حرفه ای ویژوال استودیو آشنایت ندارم.
      اگه بشه بفرمایید در کدام منو باید این آیتم رو فعال کنم.
      من خیلی خیلی ممنونم.

      11
توضیحات پیشنهادی نظرات اشتراک