আমি কিছু লিনিয়ার বীজগণিত কাঠামো ব্যবহার করব যেহেতু অপারেশনগুলি এভাবে বর্ণনা করা সহজ। আপনি যদি এই ভেক্টর অপারেশনগুলি কীভাবে বাস্তবায়ন করতে না জানেন তবে আমি শেষে একটি দ্রুত ব্যাখ্যা দেব।
সুতরাং আসুন আমরা এই মানগুলি দিয়ে শুরু করার কথা বলি: start
এবং end
আন্দোলনের শেষ পয়েন্টগুলি চিহ্নিত করুন speed
এটি কত পিক্সেল সেকেন্ডে স্থানান্তরিত হবে এবং elapsed
এটি হ'ল হার যা আপনি আপনার অবজেক্টের অবস্থান আপডেট করবেন (কিছু ইঞ্জিন ইতিমধ্যে আপনার জন্য এই মানটি সরবরাহ করে ):
Vector2 start = new Vector2(x1, y2);
Vector2 end = new Vector2(x2, y2);
float speed = 100;
float elapsed = 0.01f;
আপনি প্রথম যে জিনিসটি গণনা করতে চান তা হ'ল উভয় পয়েন্টের মধ্যকার দূরত্ব এবং শুরু থেকে শেষের দিকটি সম্বলিত একটি সাধারণ ভেক্টর। এছাড়াও, আপনি start
পয়েন্ট অবজেক্টের অবস্থান "স্ন্যাপ" করা উচিত । এই পদক্ষেপটি একবারে শুরুতে শুরু করা হয়:
float distance = Vector2.Distance(start, end);
Vector2 direction = Vector2.Normalize(end - start);
object.Position = start;
moving = true;
তারপর আপনার আপডেটের পদ্ধতির উপর, আপনি একটি গুণ যোগ করে বস্তু সরাতে direction
, speed
এবং elapsed
তার অবস্থান করতে। এরপরে, চলাচল শেষ হয়েছে কিনা তা পরীক্ষা করতে আপনি দেখতে পাবেন যে সূচনা পয়েন্ট এবং অবজেক্টের বর্তমান অবস্থানের মধ্যবর্তী দূরত্বটি আপনি গণনা করা প্রাথমিক দূরত্বের চেয়ে বেশি is যদি এটি সত্য হয় তবে আমরা অবজেক্টের অবস্থান শেষ বিন্দুতে স্ন্যাপ করব এবং অবজেক্টটি স্থানান্তর করা বন্ধ করব:
if(moving == true)
{
object.Position += direction * speed * elapsed;
if(Vector2.Distance(start, object.Position) >= distance)
{
object.Position = end;
moving = false;
}
}
দ্রুত ভেক্টর অপারেশনস রেফারেন্স
প্রতিনিধিত্ব
Vector2 A = float aX, aY;
যোগফল / বিয়োগ
A+B = a.x + b.x; a.y + b.y;
A-B = a.x - b.x; a.y - b.y;
স্কেলারের দ্বারা গুণ করুন (ভাসা)
A*float = a.x*float; a.y*float;
দৈর্ঘ্য / দূরত্ব
length(A) = sqrt(a.x*a.x + a.y*a.y)
distance(A,B) = length(B-A)
নিয়মমাফিক করা
normalize(A) = a.X/length(A); a.Y/length(A);
উপরোক্ত কোডটি আপনার কাছে কোনও Vector
ক্লাস উপলব্ধ না থাকলে নিয়মিত ক্রিয়াকলাপে রূপান্তর করার জন্য এটি পর্যাপ্ত হওয়া উচিত ।
রূপান্তর উদাহরণ
// Your Variables
float startX, startY, endX, endY;
float speed = 100;
float elapsed = 0.01f;
// On starting movement
float distance = Math.sqrt(Math.pow(endX-startX,2)+Math.pow(endY-startY,2));
float directionX = (endX-startX) / distance;
float directionY = (endY-startY) / distance;
object.X = startX;
object.Y = startY;
moving = true;
// On update
if(moving == true)
{
object.X += directionX * speed * elapsed;
object.Y += directionY * speed * elapsed;
if(Math.sqrt(Math.pow(object.X-startX,2)+Math.pow(object.Y-startY,2)) >= distance)
{
object.X = endX;
object.Y = endY;
moving = false;
}
}