ভেক্টর ব্যবহার করে এক্সএনএ / সি # তে একটি স্প্রিট স্থানান্তরিত হচ্ছে


9

আমি বর্তমানে সি # ভাষার সাথে এক্সএনএ গেম ডেভেলপমেন্টের দিকে তাকাচ্ছি।

আমার দুটি ক্লাস রয়েছে: প্রধান গেম হ্যান্ডলার এবং একটি "স্প্রাইট" ক্লাস। নিম্নলিখিতটি কয়েকটি প্রাথমিক সিউডো কোড রয়েছে যা আমি আশা করি পর্যাপ্তরূপে বিষয়টি বর্ণনা করেছে।

Game.cs

class game {
  sprite the_sprite;
  void update(time) {
    var mouse = mouse.state
    if(mouse.clicked) { this.the_sprite.moveTo(mouse.x, mouse.y) }
    this.the_sprite.update(time)
    base.update(time)
  }
}

Sprite.cs

class sprite {
  vector2 location;
  vector2 move_to;
  void moveTo(x, y) { this.move_to = new vector2(x, y) }
  void update(time) {
    if(this.location.x > this.move_to.x /* (or less than) */) {
      // adjust location.x
    }
    if(this.location.y > this.move_to.y /* (or greater than) */) {
      // adjust location.y
    }
  }
}

মূলত: যখন ব্যবহারকারী গেম উইন্ডোতে কোথাও ক্লিক করে, তখন মাউসের x এবং y স্থানাঙ্কগুলি নেওয়া হবে এবং গেমের অবজেক্ট সময়ের সাথে সাথে সেই অবস্থানের দিকে চলে যাবে।

ঠিক আছে ... কোডটি কাজ করে তবে এটি কুৎসিত, এবং অবজেক্টগুলি সরাসরি বস্তুর দিকে অগ্রসর হয় না (পরিবর্তে এটি তির্যক আন্দোলন এবং তারপরে একক অক্ষের চলাচল করে)। আমি অনুমান করছি যে আমি ব্যবহার করতে পারি এমন কিছু গাণিতিক ক্রিয়াকলাপ রয়েছে তবে আমি কোথায় শুরু করব সে সম্পর্কে আমার কোনও সতর্কতা নেই। কোন পরামর্শ?


3
হ্যালো অতিথি। আপনি যা খুঁজছেন তা হ'ল নরমালাইজেশন। এই প্রশ্নের উত্তর দয়া করে পড়ুন: গেমদেব.স্ট্যাকেক্সেঞ্জার / প্রশ্নগুলি / 7540/ … / একটি আপনাকে প্রয়োজনীয় কোড সরবরাহ করে, দ্বিতীয়টি এটি কীভাবে খুব সুন্দরভাবে কাজ করে তা ব্যাখ্যা করে।
নোটবেইন

হ্যালো, আমি লিঙ্কটি দেখেছি এবং এটি আমার প্রয়োজন মতো ছিল। ধন্যবাদ!
ম্যাট

উত্তর:


12

যদি আমি আপনার সমস্যাটি সঠিকভাবে বুঝতে পারি তবে আপনার স্প্রাইট শ্রেণীর অভ্যন্তরে যে দিকটি আপনি যেতে চান তার প্রতিনিধিত্ব করে আপনার কেবল একটি দিক ভেক্টর 2 থাকা উচিত। এটার মত:

public Vector2 Direction { get; set; }

এটি যেখানে আপনি যেতে চান তা দেখিয়ে দেওয়া হ'ল সাধারণ ভেক্টর (যার অর্থ এটির দৈর্ঘ্য 1) 1

তারপরে, একটি স্পিড ফ্লোট সম্পত্তি যুক্ত করুন, যা স্প্রাইটটি কত দ্রুত যেতে হবে তা বলে।

public float Speed { get; set; }

আপনার একটি আপডেটসপ্রাইট ফাংশন যুক্ত করতে হবে, তবে কেন এটি আপনার স্প্রাইট শ্রেণীর ভিতরে রাখবেন না?

public Update(GameTime gameTime)
{
   Position += Direction * Speed * gameTime.ElapsedGameTime.TotalSeconds;
}

এটি স্প্রিটের অবস্থানটিকে আপডেট করার জন্য এটি আপডেট করবে (আপনি ব-দ্বীপ সেকেন্ড দ্বারা গুণিত করুন যাতে স্প্রাইটটি ধীর কম্পিউটারগুলিতেও সঠিকভাবে সরে যায়)।

অবশেষে, আপনি কেবল নিজের দিকনির্দেশের সম্পত্তিটি এইভাবে সেট করেছেন:

sprite.Direction = location - sprite.Position;
sprite.Direction.Normalize();

আরও মনে রাখবেন যে স্প্রাইটের দৈর্ঘ্য যদি (সাধারণীকরণের আগে) কিছু প্রান্তিকের চেয়ে কম হয় তবে আপনার স্প্রাইট এসে গেছে।
TreDubZedd

হুবহু, আমি আমার পোস্টটি সম্পাদনা করতে চলেছিলাম, তবে আমার ধারণা আমি এটি করব না। আপনি যদি চান না যে আপনার স্প্রিট ক্রমাগত লক্ষ্য সন্ধান করতে চান তবে লক্ষ্যটির যথেষ্ট কাছে গেলে কেবল ভেক্টর 2. জিরোতে দিকনির্দেশ সেট করুন।
জেসি এমন্ড

খুব ভাল উত্তর ... এবং আপনি আমাকে গেমটাইম ব্যবহার সম্পর্কে শিখিয়েছিলেন (ধীরে ধীরে কম্পিউটারে একটি স্প্রেডে স্প্রেটস সরাতে), সুতরাং একটি পাথরযুক্ত দুটি পাখি। আমি এই উত্তরটি স্বীকৃত হিসাবে পতাকাঙ্কিত করব।
ম্যাট

:) উপায় দ্বারা আমি ব্যক্তিগতভাবে আমার স্প্রাইট বর্গের মধ্যে (আমার আপডেট ফাংশনের অভ্যন্তরে) স্বাভাবিক রাখতে চাই, যাতে ক্লাসের বাইরে ক্রমাগত এটি স্বাভাবিক করা না হয়। আপনার এটিও নিশ্চিত করা উচিত যে ভেক্টরের দৈর্ঘ্য 0 এর সমান নয়, অন্যথায় আপনি 0 ব্যতিক্রম দ্বারা একটি বিভাজন পাবেন। সুরক্ষিত হওয়ার জন্য স্বাভাবিক করার আগে কেবল দিকনির্দেশ.LengthSquared ()> 0 পরীক্ষা করুন (দৈর্ঘ্যের স্কোয়ার যাতে আপনার সেই ব্যয়বহুল বর্গক্ষেত্র গণনা করতে না হয়;))।
জেসি এমন্ড

আসুন আমরা বলি যে আমরা একটি আলাদা আইডিই ব্যবহার করছি যার কোন স্বাভাবিককরণের ফাংশন নেই, নর্মালাইজেশন সমীকরণটি কী হবে?
26'11

2

গুগল নরমালাইজেশন ... আমি এতে কিছুটা হারিয়েছি তবে আমি নিশ্চিত যে এটি আপনার সমস্যা সমাধানে সহায়তা করবে। আমার উত্তরটি অন্য কেউ বিশদভাবে বা ব্যাখ্যা করতে পারেন আমি নিশ্চিত

সম্পাদনা: আমি এর চেয়ে ভাল উত্তর দিতে পারলাম, দুঃখিত

এই ধরণের সমস্যাগুলির জন্য আমি ব্যক্তিগতভাবে সর্বদা এই ব্লগ পোস্টটির দিকে নজর রাখি: http://blog.wolfire.com/2009/07/linear-algebra- for-game-developers-part-1/

এটি স্ক্র্যাচ থেকে শুরু হয় এবং এটি গেম বিকাশের সাথে প্রাসঙ্গিক।


3
আপনি ঠিক বলেছেন, এটি সাধারণীকরণ। তবে আগের প্রশ্নগুলিতে ভাল উত্তর খোঁজার চেষ্টা করা আরও ভাল। এবং আপনি যদি উত্তর দিচ্ছেন তবে সর্বদা গুগলকে নির্দেশ না করে কোড ব্যাখ্যা করা বা কোড ভাগ করা বা আপনার যেটি কার্যকর হতে পারে তা যাচাই করা ভাল always
নোটবেইন

আমার মন্তব্য করা উচিত ছিল, আপনি ঠিক বলেছেন।
ডগলাস রায়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.