شما اینجا هستید

۸-۱ بردار حرکت: شتاب

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

خیلی عالی، تا اینجا، ما باید دو چیز را خوب فهمیده باشیم: (۱) PVector چیست (۲) چگونه از Pvector درون یک شی برای رهگیری جابه جایی یک موقعیت و حرکت استفاده کنیم. این گام بسیار خوب و سزاوار تشویق است. قبل از اینکه همه بایستند و برای شما کف بزنند ما نیاز داریم یک چیز دیگر را بسازیم، یک قدم بزرگ رو به جلو. یک نگاهی به مثال حرکت ۱۰۱ بیاندازید، خیلی خسته کننده نیست؟-- دایره هیچگاه سرعت نمی گیرد، هیچ وقت از سرعتش کم نمی شود، چرخشی هم ندارد. بیایید چیزی بسازیم که حرکت جالب تری داشته باشد، مثل حرکاتی که در دنیای واقعی اطراف ما اتفاق می افتد، ما نیاز داریم که یک PVector دیگر به کلاسمان اضافه کنیم-- شتاب.

تعریف صریح شتاب که ما از آن استفاده خواهیم کرد به شکل زیر است: نرخ تغییر سرعت. اجازه بدهید که چه لحظه به این تعریف فکر کنیم. این یک مفهوم جدید است؟ در واقع نه. سرعت به عنوان نرخ تغییر موقعیت تعریف شده است. در واقع یک سیستم تاثیر از بالا به پایین ایجاد کرده ایم. شتاب سرعت را تغییر می دهد، که سرعت به نوبه خود موقعیت را تغییر می دهد.(برای یادآوری، این نکته در فصل بعد یک نکته کلیدی خواهد بود، وقتی ما می بینیم که چطور شتاب سرعت را تحت تاثیر قرار میدهد، که سرعت خود موقعیت را تغییر می دهد. در کد شبیه زیر می شود.

 

velocity.add(acceleration);
location.add(velocity); 

برای تمرین، از اینجا به بعد بیایید برای خودمان یک قانون بگذاریم. بیایید هر مثالی را در این تمام این کتاب بدون دست زدن به مقادیر موقعیت و سرعت بنویسیم( البته به غیر از مقدار دهی اولیه). به بیان دیگر، هدف ما از برنامه نویسی حرکت این است: یک الگوریتم ایجاد کنیم که ما شتاب را محاسبه می کنیم و بعد ببینم چطور این کار یک جریان از تاثیرات را ایجاد می کند.( در حقیقت،بعدها دلایلی برای شکستن این قانون خواهیم دید، اما این خیلی مهم است که شاکله ای از الگوریتم حرکت را در ذهن خود ترسیم کنید.) پس ما نیاز داریم که راه هایی برای محاسبه شتاب بیابیم:

الگوریتم های شتاب!

۱- شتاب ثبت

۲- شتاب کاملا تصادفی

۳- شتاب به سمت نشانگر موس

الگوریتیم #۱، شتاب ثابت، زیاد جالب نیست، اما ساده ترین نوع شتاب است و به ما کمک می کند شتاب را در کدهایمان بیاوریم. تنها چیزی که نیاز داریم این است که یک PVector دیگر به کلاس Mover اضافه کنیم:

 

 class Mover {
 
  PVector location;
  PVector velocity;
  PVector acceleration;  

حال در تابع update شتاب را می آوریم:

 

 void update() {
    velocity.add(acceleration);
    location.add(velocity);
 }  

تقریبا همه چیز انجام شد. تنها چیزی که نیاز داریم مقدار دهی اولیه در سازنده مان است.

 

  Mover() {  

اجازه دهید شی Mover را در وسط پنجره ایجاد شود

  location = new PVector(width/2,height/2);  

با مقدار سرعت اولیه صفر

 

   velocity = new PVector(0,0);  

این به معنی این است که ما وقتی ترسیم پنجره آغاز شود، شی در وسط صفحه است و هیچ حرکتی ندارد. ما دیگر نگرانی در مورد سرعت نداریم، به خاطر اینکه همه چیز را تماما با شتاب کنترل می کنیم. همانطور که صحبت شد، بر طبق الگوریتم #۱، ترسیم اولیه شامل یک شتاب ثابت است. پس بیایید یک مقدار انتخاب کنیم:

 

      acceleration = new PVector(-0.001,0.01);
  }  

ممکن است بگویید، خخخخخ، این عدد که خیلی کوچک است. درست است، واقعا کوچک است. مهم است درک کنیم شتاب ما (با پیکسل محاسبه می شود) شتاب در زمان در سرعت روی هم جمع می شود، سی دفعه در هر ثانیه به اساس نرخ سرعت ترسیم صفحه. برای اینکه بردار سرعت در محدوده مقدارهای منطقی باشد، مقادیر شتاب ما باید خیلی کوچک باشد. همچنین می توانیم با استفاده از تابع limit از PVٰector این کار را انجام دهیم.

 

      velocity.limit(10);   

به شکل زیر می توان تفسیر کرد: بزرگی سرعت چقدر است؟ اگر از ۱۰ کمتر است، به آن دست نزن، اگر بیشتر از ۱۰ است، مقدار آن را به ۱۰ کاهش بده!

تمرین ۱-۴ تابع limit را برای کلاس PVector بنویسید.

void limit(float max) {
    if (_______ > _______) {
      _________();
      ____(max);
    }
  }   

اجازه بدهید نگاهی به تغییرات کلاس Mover که با acceleration و limit کامل شده است، داشته باشیم.

مثال ۱-۸ حرکت ۱۰۱(سرعت و شتاب ثابت)

 class Mover {
 
  PVector location;
  PVector velocity;
  PVector acceleration;
  float topspeed;
 
  Mover() {
    location = new PVector(width/2,height/2);
    velocity = new PVector(0,0);
    acceleration = new PVector(-0.001,0.01);
    topspeed = 10;
  }
 
  void update() {
    velocity.add(acceleration);
    velocity.limit(topspeed);
    location.add(velocity);
  }
 
  void display() {}
  void checkEdges() {}
}   

تمرین ۱-۵ یک شبیه سازی از یک ماشین (یا دونده) بسازید که با فشار دادن کلید بالا شتاب بگیرد و با فشردن کلید پایین ترمز بگیرد.


 

حالا میرسیم به الگوریتم #۲ ، شتاب کاملا تصادفی. در اینجا، به جای اینکه در سازنده شی به شتاب مقداردهی کنیم، می خواهیم یک مقدار تصادفی جدید برای شتاب در هر دور حلقه ایجاد کنیم.

Your browser does not support the canvas tag.

مثال ۱-۹ حرکت ۱۰۱ (سرعت و شتاب تصادفی)

  void update() {
 
    acceleration = PVector.random2D();
 
    velocity.add(acceleration);
    velocity.limit(topspeed);
    location.add(velocity);
  } 

به دلیل اینکه بردار تصادفی یک بردار نرمال شده است، می توانیم آنرا تغییر اندازه دهیم: الف - تغییر اندازه بردار شتاب به یک مقدار ثابت

acceleration = PVector.random2D();
acceleration.mult(0.5);   

ب – تغییر اندازه شتاب به مقدار تصادفی

 

acceleration = PVector.random2D();
acceleration.mult(random(2));  

اگرچه به نظر واضح می رسد، این نکته حیاطی است که بفهمیم شتاب فقط به سرعت یافتن و کاهش سرعت حرکت شی تاثیر نمی گذارد، بلکه در تغییر در اندازه آن و همچنین جهت حرکت تاثیر گذار است. شتاب برای رانش یک شی استفاده می شود، بارها و بارها در فصل های بعد این این موضوع را خواهیم دید، وقتی که شروع به نوشتن برنامه هایی می کنیم که نیاز به در آن اشیأ برای اینکه چطور در صفحه حرکت کنند نیاز به تصمیم گیری دارد. تمرین ۱-۶ به فصل مقدمه برگردید، شتاب را با استفاده از نویز پرلین پیاده سازی کنید.

دیدگاه جدیدی بگذارید