কিভাবে একটি চরিত্র জাম্প করতে?


44

আমি বর্তমানে ডাইরেক্ট এক্স 9.0 ব্যবহার করে সি # তে একটি গেম তৈরি করছি। গেমটির রিমেকটি গাধা কং এনইএস। আমার প্রায় সবকিছু শেষ হয়েছে তবে মারিওর জাম্পের পদার্থবিজ্ঞানে আমার সমস্যা হচ্ছে। আমার কাছে ওয়াই এবং এক্স সমন্বয়গুলির জন্য ঘোষিত ভেরিয়েবল রয়েছে।

আমি ভাবছিলাম যে এটি করার কোনও সহজ পদ্ধতি আছে কিনা। আমি উত্তরের জন্য উচ্চ এবং নিম্ন সন্ধান করেছি কিন্তু আমি যে উত্তরগুলি পেয়েছি তা হয় অপ্রাসঙ্গিক / অথবা এক্সএনএ-র মতো একটি পৃথক প্রোগ্রামিং ভাষা ব্যবহার করছে।

ডাব্লু টিপে আছে কিনা তা পরীক্ষা করার জন্য আমার কাছে বর্তমানে একটি বুল ভেরিয়েবল সেট রয়েছে যা তাকে জাম্প দেওয়ার জন্য কোনও কোড ট্রিগার করবে trigger আমি যেমন ঘোরাঘুরি করা হয়েছে।

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

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


5
একটি ভিন্ন প্রোগ্রামিং ভাষা ব্যবহার করে উত্তরগুলি কোনও সমস্যা না করে। অ্যালগরিদম হ'ল আগ্রহের বিষয়, সুনির্দিষ্ট বাস্তবায়ন নয় ... যদি না আপনি কেবল কিছু না বুঝে অনুলিপি করে আটকানোর আশা করছেন, যা আমি অবশ্যই আশা করি আপনি নন! অন্যান্য প্রোগ্রামিং ভাষা থেকে অ্যালগরিদমগুলি পড়তে এবং মানিয়ে নিতে সক্ষম হওয়াই একটি খুব ভাল দক্ষতা।
ccxvii

উত্তর:


84

প্রথমত, এক্সএনএ সি #ও ব্যবহার করে তাই এটি একই প্রোগ্রামিংয়ের ভাষা। এবং যদিও অন্তর্নিহিত এপিআইয়ের ডাইরেক্টএক্স থেকে কিছু পার্থক্য থাকতে পারে, জাম্পিংয়ের সাথে এর কোনও সম্পর্ক নেই, সুতরাং একই টিউটোরিয়াল বা উত্তরগুলি এখানে প্রয়োগ করা উচিত। এছাড়াও, অনেকগুলি কারণের উপর নির্ভর করে এটি বাস্তবায়নের অসংখ্য উপায় রয়েছে। আমি নীচে যা বর্ণনা করব তা কেবল সম্ভাবনার একটি।

বেসিক ফিজিক্স প্রয়োজনীয়তা

প্রথমে আপনার আপডেট লুপে কিছু বুনিয়াদি পদার্থবিজ্ঞানের ভেরিয়েবল এবং গণনা প্রয়োজন। বিশেষত, আপনার অবস্থান, বেগ এবং মহাকর্ষের সংজ্ঞা দেওয়া দরকার এবং আপনার আপডেট লুপটি এর সাথে মোটামুটি অনুরূপ কিছু করা উচিত (সংঘর্ষ সনাক্তকরণ এবং সাবলীলতার জন্য বাদ দেওয়া):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

স্থির উচ্চতা জাম্প

আপনি যে চাপটি যতক্ষণ চাপুন না কেন, সর্বদা একই উচ্চতা সম্পন্ন একটি লাফের বাস্তবায়ন করার সহজতম উপায়টি হ'ল একবার উল্লম্ব গতি পরিবর্তন করা change এটি চরিত্রটিকে বাড়তে শুরু করবে, যখন মহাকর্ষ তাকে স্বয়ংক্রিয়ভাবে নামিয়ে আনার যত্ন নেবে:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

গুরুত্বপূর্ণ আপনার চরিত্রটি মাটিতে না থাকলে আপনি একটি লাফ শুরু করতে সক্ষম হতে চান না, সুতরাং আপনাকে এটির জন্য একটি চেক যোগ করতে হবে।

পরিবর্তনশীল উচ্চতা জাম্প

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

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

উপরের কোডে এই সমস্ত মান (যেমন সংখ্যার মতো 0.5, -12.0fবা -6.0f) গুলিকে টিকেট দেওয়া আপনি নিজের লাফের অনুভূতি পরিবর্তন করতে পারেন, তিনি কতটা উঁচুতে লাফান, জাম্প বোতামটি প্রকাশ করার পরেও তিনি কতটা গতি বজায় রাখেন, তিনি কতটা দ্রুত পড়ে যান ইত্যাদি etc ।

গুরুত্বপূর্ণ এই ফাংশনগুলিকে প্রতি ফ্রেমে কল করবেন না। কীটি চাপলে বা ছেড়ে দেওয়া হলে কেবল একবার তাদের কল করুন। অন্যথায় আপনার চরিত্রটি জাম্পের পরিবর্তে উড়ে যাবে।

কাজের উদাহরণ

আমি উপরে বর্ণিত কৌশলগুলির একটি দ্রুত উদাহরণ তৈরি করেছি, যা আপনি এখানে আপনার ব্রাউজারে চেষ্টা করতে পারেন (লাফানোর জন্য মাউস বোতাম টিপুন, লাফের উচ্চতা নিয়ন্ত্রণ করতে মাঝখানে এটি ছেড়ে দিন)। এটি জেএসে রয়েছে তবে আমি আগে যেমন বলেছি ভাষা এই ক্ষেত্রে অপ্রাসঙ্গিক।

http://jsfiddle.net/LyM87/


11
পাশাপাশি এই বিষয় সম্পর্কিত তথ্যের সাথে কয়েক দিন আগে লেখা এই আশ্চর্যজনক নিবন্ধটি ভাগ করে নেওয়ার সুযোগটি গ্রহণ করতে পারেন: 2 ডি প্ল্যাটফর্মারগুলি বাস্তবায়নের জন্য গাইড । এবং এটিও: সোনিক জাম্পিং
ডেভিড গাউভিয়া

2
নিবন্ধটি আপনার জবাবের চেয়ে ভেরিয়েবল জাম্পিংয়ের আলাদা পদ্ধতি বর্ণনা করে। এটি মাধ্যাকর্ষণ দমন করা বা বোতামটি ধরে রাখার সাথে সাথে আবেগ যুক্ত করা চালিয়ে যাওয়ার জন্য আহ্বান জানায়। আমি সাধারণত ডেভিড তার উত্তরে যা বলেছি তা করি, তবে নিবন্ধের পদ্ধতিগুলির মধ্যে কোনও চিন্তাভাবনা আছে?
জেফ

@ জেফ যা আমার দৃষ্টি আকর্ষণ করেছে এবং ঠিক এ কারণেই আমি উল্লেখ করেছি যে এটি বাস্তবায়নের একাধিক উপায় রয়েছে। প্রথম নিবন্ধে একই সমস্যাটি পরিচালনা করার দুটি অতিরিক্ত উপায় বর্ণনা করা হয়েছে, আমি যেভাবে বর্ণনা করেছি তা দ্বিতীয় প্রবন্ধের উপর ভিত্তি করে। আমি জানি না তারা কীভাবে একে অপরের সাথে তুলনা করে, যদিও এর মধ্যে কোনও বাস্তবায়ন করা বেশ সহজ। শেষ পর্যন্ত, আমি এই পদ্ধতিটি বেছে নিয়েছিলাম কারণ এটি ব্যাখ্যা করা সহজ ছিল এবং এর জন্য টাইমার যুক্ত করা বা হ্রাসকারী বিশালতার একাধিক প্রবণতাগুলি মোকাবেলা করার প্রয়োজন ছিল না।
ডেভিড গাউভিয়া

নির্দিষ্ট গেম এবং আপনি কত অ্যানিমেশন করতে চান তার উপর ভিত্তি করে উত্তরটি পৃথক হতে পারে। মেট্রয়েড একটি ধ্রুবক গতি ঝাঁপ: / বংশবৃদ্ধি ব্যবহার করে তবে এটিকে মসৃণ এবং জেনিথটিতে "বাঁকা" দেখানোর জন্য উচ্চ মানের অ্যানিমেশন কাজের সাথে এটি মাস্ক করে। অন্যান্য অনেক প্লাটফর্মারগুলি ভেরিয়েবল স্পিড জাম্প ব্যবহার করে, এটিকে আরও ভালভাবে চালিত করতে আরও কাজ করা প্রয়োজন।
শান মিডলডিচ

1
এটি খুব সহায়ক হয়েছিল, 5 বছর পরে :) এবং এই ফিডাল জিনিসটি খুব দুর্দান্ত - আমার জেএস শিখতে হবে!
তরলতা

1

পদার্থবিজ্ঞানের মতো। কেবলমাত্র আপনি যে মুহুর্তটি চাপুন jump keyএবং চরিত্রটি মাটিতে রয়েছে তার উপরের গতি যুক্ত করুন (এটিকে প্ররোচিত বলা হয়), তবে চরিত্রটিকে সর্বদা মহাকর্ষ দ্বারা পতিত করুন।

আপনি যদি না চান যে চরিত্রটি প্রতিবারই মাটিতে itsুকে পড়বে - কারণ আপনি ধরে আছেন jump key- এমন jump key is being pressedভেরিয়েবল যুক্ত করুন যা আপনি সাফ করার পরে পরিষ্কার করেছেন jump keyএবং পরে সেট হয়ে গেছে। সুডোকোড:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

আমি যদি আপনার উপায় ব্যবহার করি:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

কীভাবে donkey.yপরিবর্তন হবে আপনার ধারণার উপর নির্ভর করে। বেগটি আরও ছোট হওয়া উচিত হিজার গাধাটি এটিকে ভাল দেখানোর জন্য বাতাসে রয়েছে।

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