PDA

View Full Version : سوال: حرکت یک کنترل روی فرم به هر جهت ممکن نه فقط 4 جهت اصلی



hanieh66
شنبه 07 آذر 1388, 17:45 عصر
سلام
من می خوام یجور بازی 2بعدی بسازم ک دوربین از بالا است. مثلا من یک لیبل دارم که باید روی فرم حرکت کنه. حرکت در 4 جهت اصلی مشکلی نیست ولی من می خوام به همه جهتی بتونه حرکت کنه.

سوالم همینه که چجوری می شه از نقطه x0 , y0 به نقطه x1 , y1 بصورت یک مسیر مستقیم رسید؟

مثل این عکسی که گذاشتم
http://mytasvir.com/photo/gallery/24b11347b53399.png

farsoft
شنبه 07 آذر 1388, 19:22 عصر
سلام دوست عزیز
سوال شما یک مقدار مشکل دارد!!!
اولا این لیبل قرار است به چه صورت حرکت کند ؟؟؟ با کیبرد یا ماوس؟؟
دوما قرار است خودش حرکت کند یا کاربر آن را حرکت دهد؟؟؟
سوما شما برای حرکت دادن آن چه مشکلی دارید؟؟؟ چون با زیاد و کم کردن مقادیر x و y به راحتی به هر سمتی حرکت می کند؟؟؟؟

bahar_engineer
شنبه 07 آذر 1388, 20:16 عصر
تعریف متغیر موقعیت دلخواه (بوسیله ماوس)


private point loc;


تعیین مقدار موقعیت(نقطه x1,y1 )


loc.x = x1;
loc.y = y1;


تغییر موقعیت لیبل


label1.location = loc;


این خیلی ساده بود و فقط به موقعیتی که می خواستی می رفت

اما اگه می خوای با ماوس حرکت کنه و هر جا ماوس می ره اونم بره به این صورت عمل کن
باید از درگ و دراپ استفاده کنی



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

namespace ContrloCircuit
{
public sealed partial class puzzle : Form
{

private Point loc;

public puzzle()
{
InitializeComponent();
}

private void panel2_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Bitmap)))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}

panel2.Location = loc;
}

private void panel2_MouseDown(object sender, MouseEventArgs e)
{
panel2.Location = loc;
}

private void panel2_DragOver(object sender, DragEventArgs e)
{

panel2.Location = loc;

}



private void panel2_DragLeave(object sender, EventArgs e)
{
panel2.Location = loc;
}

private void timer1_Tick(object sender, EventArgs e)
{
loc = Cursor.Position;
label2.Text = loc.ToString();
}

private void panel2_MouseLeave(object sender, EventArgs e)
{
panel2.Location = loc;
}

}
}


من برای یه پنل panel2 استفاده کردم شما برای لیبل بذار
همونطور که می بینی یه تایمر توی صفحه بذار و کد رو توش بذار که موقعیت ماوس رو می گیره

موفق باشی

hanieh66
شنبه 07 آذر 1388, 22:00 عصر
سلام دوست عزیز
سوال شما یک مقدار مشکل دارد!!!
اولا این لیبل قرار است به چه صورت حرکت کند ؟؟؟ با کیبرد یا ماوس؟؟
دوما قرار است خودش حرکت کند یا کاربر آن را حرکت دهد؟؟؟
سوما شما برای حرکت دادن آن چه مشکلی دارید؟؟؟ چون با زیاد و کم کردن مقادیر x و y به راحتی به هر سمتی حرکت می کند؟؟؟؟
لیبل باید خودش حرکت کنه. مثلا در فاصله های زمانی رندم ممکنه هر لحظه یکجای فرم یک نقطه آبی روشن بشه و لیبل باید مستقیم (یک مسیر مستقیم تا هدف رو طی کنه) بره سمتش. من اینکار رو در یک تایمر انجام می دم.مشکلم فقط طی کردن مسیر مستقیم به سمت هدف هست.

اینکه شما می گین با کم و زیاد کردن x,y درست می شه درسته ولی خوب حتما یک محاسبه ریاضی داره برای تمام حالتها که اینو من بلد نیستم و برای همین موندم الان.

hanieh66
شنبه 07 آذر 1388, 22:04 عصر
ممنون بهار جون ولی این اونی که مد نظرمه نیست. درگ و دراپ نمی خوام . در بازی ای که قراره بنویسم یک بچه هست که می ره الماس ها رو از روی صفحه جمع می کنه. این الماسها هرکجای فرم می تونن ظاهر بشن و این بچه باید مسیر مستقیم به سمت اونا رو طی کنه. هیچ چیز دستی کنترل نمی شه. خود بچه باید مسیر مستقیم رو طی کنه تا الماس.
بازم ممنون که جواب دادی

mn_zandy63
شنبه 07 آذر 1388, 23:31 عصر
لیبل باید خودش حرکت کنه. مثلا در فاصله های زمانی رندم ممکنه هر لحظه یکجای فرم یک نقطه آبی روشن بشه و لیبل باید مستقیم (یک مسیر مستقیم تا هدف رو طی کنه) بره سمتش. من اینکار رو در یک تایمر انجام می دم.مشکلم فقط طی کردن مسیر مستقیم به سمت هدف هست.

اینکه شما می گین با کم و زیاد کردن x,y درست می شه درسته ولی خوب حتما یک محاسبه ریاضی داره برای تمام حالتها که اینو من بلد نیستم و برای همین موندم الان.

سلام دوست من،
فرض کنیم شما الان در نقطه (x1,y1) هستی و میخوای به نقطه (x2,y2) برسی.
ابتدا باید فاصله بین دو نقطه رو پیدا کنی.
فرمولش اینه:
double l = Math.Sqrt((x2-x1)^2+(y2-y1)^2);
حالا بسته به اینکه با چه سرعتی میخوای حرکت کنی،
فرض کنیم میخوای 2 واحد 2 واحد حرکت کنی، بنابراین فاصله به دست اومده رو تقسیم کن به 2.
double length = l / 2;
حالا باید تعیین کنی که در هر جهت x و y چقدر باید حرکت کنی.
مقدار حرکت رو در dx و dy حساب میکنیم:
int dx = Math.Round((x2-x1)/length);
int dy = Math.Round((y2-y1)/length);

حالا مختصات جدید در مرحله بعد حرکت رو حساب میکنیم:
int newx=x1+dx;
int newy=y1+dy;

موفق باشی.

hanieh66
یک شنبه 08 آذر 1388, 11:05 صبح
ممنون جناب mn_zandy63 (http://barnamenevis.org/forum/member.php?u=31426) فکر کنم همینی باشه که من می خوام. الان روش کار می کنم اگه به مشکلی خوردم همینجا می گم باز.