PDA

View Full Version : مبتدی: حرکت دادن picturebox در فرم



onlymhb
جمعه 15 دی 1391, 21:26 عصر
سلام
من یه فرم دارم
توی اون 2 تا picturebox هست
یکی از آنها با کلیدهای arow بالا پایین یا چپ و راست میشه و دیگری رو میخوام خودکار چپ و راست بره
حالا مشگل اینجاس که من نمیدونم چه جوری picturebox دوم خودکار متحرک کنم. عرض فرم من 600 پیکسله و هدف نهایی من یه جور بازی هست که pictureboxی که با کلیدهای arow بالا پایین یا چپ و راست میشه رو بدون اینکه به pictureboxی که خودکار چپ و راست میشه برخورد کنه عبور بدم

اینم سورس برنامه:
97858

plus
جمعه 15 دی 1391, 21:55 عصر
شما میتونی یک کنترل تایمر بگذاری، و ...

private enum Direction
{
RightToLeft,
LeftToRight
}
private Direction direction = Direction.LeftToRight;
private const int step = 5;
private void timer1_Tick(object sender, EventArgs e)
{
if (direction == Direction.LeftToRight)
{
if (movingPictureBox.Left + movingPictureBox.Width < this.ClientSize.Width)
{
movingPictureBox.Left = Math.Min(movingPictureBox.Left + step,
this.ClientSize.Width - movingPictureBox.Width);
}
else
{
direction = Direction.RightToLeft;
}
}
else
{
if (movingPictureBox.Left > 0)
{
movingPictureBox.Left = Math.Max(0, movingPictureBox.Left - step);
}
else
{
direction = Direction.LeftToRight; ;
}
}
CheckIntersect();
}

private void CheckIntersect()
{
if (movingPictureBox.Bounds.IntersectsWith(uerPicture Box.Bounds))
{
MessageBox.Show("You lost!");
timer1.Enabled = false;
}
}

مشخصه Enabled تایمر رو True و Interval اون رو مثلا 50 قرار بدین.دقت کنید که متد CheckIntersect برای برری اینکه آیا دوتا PictureBox با هم برخورد دارن استفاده شده و شما باید توی کدی که مربوط به حرکت picturebox کاربر هست هم بعد از هربار حرکت توسط کاربر اون رو فراخوانی کنید تا بررسی بشه که آیا کاربر خطا کرده یا نه.

onlymhb
جمعه 15 دی 1391, 22:10 عصر
شما میتونی یک کنترل تایمر بگذاری، و ...

private enum Direction
{
RightToLeft,
LeftToRight
}
private Direction direction = Direction.LeftToRight;
private const int step = 5;
private void timer1_Tick(object sender, EventArgs e)
{
if (direction == Direction.LeftToRight)
{
if (movingPictureBox.Left + movingPictureBox.Width < this.ClientSize.Width)
{
movingPictureBox.Left = Math.Min(movingPictureBox.Left + step,
this.ClientSize.Width - movingPictureBox.Width);
}
else
{
direction = Direction.RightToLeft;
}
}
else
{
if (movingPictureBox.Left > 0)
{
movingPictureBox.Left = Math.Max(0, movingPictureBox.Left - step);
}
else
{
direction = Direction.LeftToRight; ;
}
}
CheckIntersect();
}

private void CheckIntersect()
{
if (movingPictureBox.Bounds.IntersectsWith(uerPicture Box.Bounds))
{
MessageBox.Show("You lost!");
timer1.Enabled = false;
}
}

مشخصه Enabled تایمر رو True و Interval اون رو مثلا 50 قرار بدین.دقت کنید که متد CheckIntersect برای برری اینکه آیا دوتا PictureBox با هم برخورد دارن استفاده شده و شما باید توی کدی که مربوط به حرکت picturebox کاربر هست هم بعد از هربار حرکت توسط کاربر اون رو فراخوانی کنید تا بررسی بشه که آیا کاربر خطا کرده یا نه.

دوست من خیلی ممنونم منتها من از اونجایی که آماتورم اصلا نگرفتم چی گفتی.
میشه توی سورس من بزارید. آخه نمیدونم باید کجاش باید استفاده کنم

plus
جمعه 15 دی 1391, 22:12 عصر
کجا رو نفمیدیی چی گفتم؟
شما کدی که مربوط به حرکت PictureBox توسط کاربر هست رو بگذارید.

onlymhb
جمعه 15 دی 1391, 22:23 عصر
کجا رو نفمیدیی چی گفتم؟

این کدا رو باید کجا بزارم


شما کدی که مربوط به حرکت PictureBox توسط کاربر هست رو بگذارید.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace bazi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
KeyDown += new KeyEventHandler(Form1_KeyDown);
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int x = pictureBox1.Location.X;
int y = pictureBox1.Location.Y;

if (e.KeyCode == Keys.Right) x += 5;
else if (e.KeyCode == Keys.Left) x -= 5;
else if (e.KeyCode == Keys.Up) y -= 5;
else if (e.KeyCode == Keys.Down) y += 5;
if(x>-10 && y>0 && x<465 && y<440) pictureBox1.Location = new Point(x, y);

}
private void Form1_Load(object sender, System.EventArgs e)
{

}

}
}

اون picturebox دوم هم اسمش هست pictureBox2 فکر کنم شما از یه اسم دیگه استفاده کردید؟

plus
جمعه 15 دی 1391, 23:11 عصر
بله من که اسم picturebox شما رو نمیدونستم.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace bazi
{
public partial class Form1 : Form
{
private enum Direction
{
RightToLeft,
LeftToRight
}
private Direction direction = Direction.LeftToRight;
private const int step = 5;
private Timer timer1;

public Form1()
{
InitializeComponent();
KeyDown += new KeyEventHandler(Form1_KeyDown);
timer1 = new Timer();
timer1.Interval = 50;
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Enabled = true;
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int x = pictureBox1.Location.X;
int y = pictureBox1.Location.Y;

if (e.KeyCode == Keys.Right) x += 5;
else if (e.KeyCode == Keys.Left) x -= 5;
else if (e.KeyCode == Keys.Up) y -= 5;
else if (e.KeyCode == Keys.Down) y += 5;
if(x>-10 && y>0 && x<465 && y<440) pictureBox1.Location = new Point(x, y);
CheckIntersect();

}
private void Form1_Load(object sender, System.EventArgs e)
{

}
private void timer1_Tick(object sender, EventArgs e)
{
if (direction == Direction.LeftToRight)
{
if (pictureBox2.Left + pictureBox2.Width < this.ClientSize.Width)
{
pictureBox2.Left = Math.Min(pictureBox2.Left + step,
this.ClientSize.Width - pictureBox2.Width);
}
else
{
direction = Direction.RightToLeft;
}
}
else
{
if (pictureBox2.Left > 0)
{
pictureBox2.Left = Math.Max(0, pictureBox2.Left - step);
}
else
{
direction = Direction.LeftToRight; ;
}
}
CheckIntersect();
}

private void CheckIntersect()
{
if (pictureBox2.Bounds.IntersectsWith(pictureBox1.Bou nds))
{
timer1.Enabled = false;
MessageBox.Show("You lost!");
}
}
}
}

onlymhb
جمعه 15 دی 1391, 23:36 عصر
خیلی ممنون حالا که سورسو گذاشتید منم دقیقا همین کارو کردم از اونجایی که picturebox2 حرکتی نداشت نوشتم که چیزی نفهمیدم. یه لطف میکنید سورس پیوست منو باز کنید ببینید مشکلش دقیقا کجاست؟
سورس:
97863

plus
جمعه 15 دی 1391, 23:56 عصر
1) اسم pictureBox دوم رو شما الان movingPictureBox گذشتین.اسمش رو همون pictureBox2 بگذارید.کد دومی که من بهتون دادم با اسم pictureBox2 نوشتم.
2) کدی که بهتون دادم آخر کد timer1.Enabled = false هست توی پروژه شما true گذشتین.اصلاحش کنید.

onlymhb
شنبه 16 دی 1391, 01:26 صبح
خیلی ممنونم همه چیز درست شد. الان با کمک شما داره دقیقا درست کار میکنه
اگه زحمتی نیست میشه بنویسید دقیقا timer1_Tick رو چه منطقی داره کار میکنه؟ اگه کد منو برای جابجایی دیده باشید با یه روش دیگه داره عکس جابجا میکنه که شما از یه راه دیگه اینکارو کردید.
یا مثلا private Timer timer1; چیکار میکنه؟

plus
شنبه 16 دی 1391, 13:51 عصر
Timer یک کنترل در #C هست، که یک رویداد به اسم Tick داره و مشخصه ای به اسم Interval. زمانی که Enbaled مربوط به Timer برابر True باشه، هر Interval میلی ثانیه یک بار، رویداد Tick این کنترل Raise میشه و کد داخل اون اجرا میشه.
من ابتدا با

private Timer timer1;

یک timer در کلاس تعریف کردم تا بتونم ازش برای حرکت PictureBox استفاده کنم...
منطق timer1_Tick هم این هست که هربار که این رویداد Raise میشه (هر 50 میلی ثانیه یک بار)، در صورتی که PictureBox در وضعیت حرکت به راست باشه، ابتدا چک میشه که آیا به آخر فرم رسیده یا نه، اگه نرسیده به اندازه ممکن (Step = 5 پیکسل یا کمتر) به سمت راست میره، اگه به آخر رسیده باشه، فلگی که وضعیت حرکت رو مشخصه میکنه عوض میشه و وضعیت حرکت به چپ به راست تغییر میکنه.اینطوری وقتی PictureBox به آخر فرم برسه، دفعه بعد که این رویداد Raise میشه، چون وضعیت چپ به راست هست کد مربوط به قسمت دوم If اصلی اجرا میشه. در این کد بررسی میشه که اگه PictureBox به اول فرم نرسیده، به اندازه ممکن (Step = 5 پیکسل یا کمتر) اون رو به سمت چپ میبرنه.اگه به اول فرم رسیده باشه، فلگی که وضعیت رو مشخص میکنه عوض میشه و وضعیت حرکت به راست به چپ تغییر میکنه و این داستان همینطور ادامه پیدا میکنه...