تبلیغات
تبلیغات

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

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

فرض مسئله

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

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

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

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

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

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

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

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

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

  • displacement مسافتی است که در هربار تغییر می‌کند.
  • direction برای مشخص کردن جهت می‌باشد که اگر بخواهیم به راست برود آن را 1 و اگر به چپ برود، آن را -1 می‌کنیم.
  • سرعت حرکت و جابه‌جایی کنترل، به مقدارهای displacement و Interval بستگی دارد.
  • تشخیص برخورد:
    • اگر موقعیت سمت راست pictureBox بزرگتر از عرض فرم باشد، یعنی به سمت راست برخورد کرده است.
      توجه داشته باشید که در این‌جا از ClientSize به خاطر این استفاده کردیم تا Border های اطراف فرم حساب نشوند.
    • اگر موقعیت سمت چپ pictureBox از 0 کوچکتر باشد یعنی به سمت چپ فرم برخورد کرده است.
  • نکته: ما بستگی به displacement باید این برخورد را بررسی کنیم؛ چون اگر مقدار آن بزرگتر از 1 باشد، به احتمال خیلی زیاد شاید در حرکت بعدی خود از دیوار رد شود و بعد از رد شدن در اجرای بعدی شمرده شود! ولی ما می‌خواهیم که دقیقا با آن مماس شده و از آن عبور نکند و باگی برایمان وجود نداشته باشد.
    برای حل این مشکل می‌توان هربار قبل از تنظیم موقعیت جدید، آن را به دست آورده و بررسی کنیم و اگر از فرم عبور می‌کند، کمی از مقدار displacement کم کنیم.
    انجام این کار را به خودتان واگذار می‌کنم.
  • بقیه کد هم که تغییر لوکیشن بر اساس متغیرهای جدید می‌باشد و با کمی دقت، قابل فهم بوده و نیازی به توضیح ندارد.
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک‌گذاری اطلاعات در هر زمینه‌ای
برنامه‌نویس فول استک

پاسخ دهید

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

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

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

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

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

        سوالتون خارج از بحث این پسته!
        با Dock حل نمیشه باید با Anchor کار کنین.
        موفق باشین

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

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

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

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

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

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

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

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

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

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

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

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

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