قبلا در «این آموزش»، به نحوهی تغییر مکان و جابهجایی یک کنترل در سی شارپ اشاره کردیم؛ و حالا قصد داریم تا به متحرکسازی یک کنترل و بررسی برخورد آن با سایر عناصر بپردازیم.
فرض مسئله
- یک کنترل روی فرم وجود دارد.
- کنترل با اجرای اپلیکیشن شروع به حرکت به راست میکند.
- وقتی به طرف راست فرم برخورد کرد، به سمت مخالف برمیگردد و شروع به حرکت میکند.
- وقتی به سمت چپ فرم برخورد کرد، دوباره به سمت راست برمیگردد
- و این چرخه، ادامه مییابد.
مراحل انجام کار
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 کوچکتر باشد یعنی به سمت چپ فرم برخورد کرده است.
- اگر موقعیت سمت راست pictureBox بزرگتر از عرض فرم باشد، یعنی به سمت راست برخورد کرده است.
- نکته: ما بستگی به displacement باید این برخورد را بررسی کنیم؛ چون اگر مقدار آن بزرگتر از 1 باشد، به احتمال خیلی زیاد شاید در حرکت بعدی خود از دیوار رد شود و بعد از رد شدن در اجرای بعدی شمرده شود! ولی ما میخواهیم که دقیقا با آن مماس شده و از آن عبور نکند و باگی برایمان وجود نداشته باشد.
برای حل این مشکل میتوان هربار قبل از تنظیم موقعیت جدید، آن را به دست آورده و بررسی کنیم و اگر از فرم عبور میکند، کمی از مقدار displacement کم کنیم.
انجام این کار را به خودتان واگذار میکنم. - بقیه کد هم که تغییر لوکیشن بر اساس متغیرهای جدید میباشد و با کمی دقت، قابل فهم بوده و نیازی به توضیح ندارد.
تشکر میکنم بابت جواب عالیتون، واقعا مشکلم حل شد،
یه سوال هم دارم: ما 4 تا دکمه داریم هرکدوم تو یکی از گوشه های فرم، چه جوری با تغییر اندازه فرم لوکشن این فرم ها هم تغییر کنه یعنی همیشه تو گوشه بمونن
با Dock کل قسمت بالا یا راست رو میگیرند
با تشکر
سلام. با Dock حل نمیشه باید با Anchor کار کنین.
سلام و عرض خسته نباشید.
یک سوال داشتم اونم اینکه من اگه بخوام این picture box علاوه بر حرکت از چب به راست
همزمان به صورت رندوم به بالا و بایین (شاید مثل حرکت یه اتم!)هم حرکت کنه چیکار باید بکنم؟
اگه جوابش بهم ایمیل هم بشه خیلی ممنون میشم <3
سلام؛ مقدار y رو هم تغییر بدین!
سلام ممنون بابت اموزشتون
میشه یک مطلب بزارید کلا در مورد کار با تایمر در سی شارپ ممنون میشم
سلام؛ خدمت شما «لینک»
سلام ، چطوری کاری کنم که عکس مورد نظر به کادر صفحه که رسید دکمش خاموش شه ؟ (مثلا تصویر به کادره سمت راست رسید و اگه بیشتر از این حرکت کنه عکس خارج میشه از صفحه میخوام جلوگیری کنم ) چیکارکنم ؟!
سلام؛ خب مطلب بالا هم در مورد همین سوالیه که پرسیدین! ?
سلام، خیلی ممنون از آموزشتان
اگه ممکنه می فرمایید اگه بخواهیم با زدن یک دکمه picturebox رو حرکت بدیم از چه کدی باید استفاده کنیم
به عنوان مثال وقتی کلید W رو می زنیم picturebox به سمت بالا حرکت کند
سلام. منظورتون اینه که چطور کلیدهای کیبورد رو تشخیص بدیم؟
بله
من داخل سایت های دیگه که جست و جو کردم و متوجه شدم باید یه متد key_down درست کنیم
ولی نمی دونم چطوری باید درست کنیم
ممنون می شم راهنماییم کنید
خدمت شما.
لینک: «رویدادهای کیبورد در سی شارپ»
خیلی متشکرم
سلام
ممنون که به سوالات ما پاسخ می دهید
من از قطعه کد زیر استفاده می کنم
if (PictureBox.Loction.Equale (PictureBox2.Loction((;
با توجه به کد بالا و همان طور که می دانید هنگامی که PictureBox2 روی picturebox1 قرار بگیره باید اتفاقی بیوفتد
ولی باید دقیق روی هم قرار بگیرند
که این حالت برای طراحی بعضی برنامه ها و بازی ها بده
آیا قطعه کدی داریم که هنگامی که قسمت کوچکی از picturebox1 روی PictureBox2 قرار بگیری اتفاقی بیفتد
خیلی ممنونم
سلام. روشی که اینجا برای تشخیص برخورد با لبههای فرم گفته شده رو برروی PictureBox پیاده کنید.
سلام.
بنده برنامه ای می نویسم که نیاز دارم وقتی کاربر در آن برنامه تغییری ایجاد میکند ذخیره شود.
ولی متاسفانه وقتی از برنامه خارج میشویم برنامه ریست می شود.
آیا ممکنه راهنماییم کنید که این ویژگی رو به برنامه اضافه کنم.
من در سایت های دیگه جستوجو کردم ولی درباره ی این مطلب چیزی پیدا نکردم به همین خاطر در اینجا مزاحمتون شدم.
ممنون.
سلام. باید تغییرات رو به عنوان تنظیمات ذخیره کرده و موقع اجرای بعدی برنامه، بارگزاری و اجرا کنید.
از سیستم تنظیمات خود دات نت هم میتونید استفاده کنید
سلام.
من یک فرد مبتدی هستم که فعلا با فضای برخی منو های حرفه ای ویژوال استودیو آشنایت ندارم.
اگه بشه بفرمایید در کدام منو باید این آیتم رو فعال کنم.
من خیلی خیلی ممنونم.