গেম ক্রিয়াগুলি সম্পূর্ণ হতে একাধিক ফ্রেম নেয়


20

আমি এর আগে সত্যিই খুব বেশি গেম প্রোগ্রামিং আগে কখনও করি নি, বেশ সোজা প্রশ্ন।

কল্পনা করুন যে আমি একটি টেট্রিস গেমটি তৈরি করছি, মূল লুপটি দেখতে এমন কিছু রয়েছে।

for every frame
    handle input
    if it's time to make the current block move down a row
        if we can move the block
            move the block
        else
            remove all complete rows
            move rows down so there are no gaps
            if we can spawn a new block
                spawn a new current block
            else
                game over

খেলা সবকিছু এতদূর অবিলম্বে ঘটবে - জিনিষ সঙ্গে সঙ্গে উত্পন্ন হওয়া হয়, সারি অবিলম্বে ইত্যাদি কিন্তু কি সরিয়ে ফেলা হয় যদি আমি না কিছু অবিলম্বে (অর্থাত সজীব জিনিষ) ঘটতে করতে চান?

for every frame
    handle input
    if it's time to make the current block move down a row
        if we can move the block
            move the block
        else
            ?? animate complete rows disappearing (somehow, wait over multiple frames until the animation is done)
            ?? animate rows moving downwards (and again, wait over multiple frames)
            if we can spawn a new block
                spawn a new current block
            else
                game over

আমার পং ক্লোনটিতে এটি কোনও সমস্যা ছিল না, কারণ প্রতিটি ফ্রেম আমি কেবল বলটি সরিয়েছিলাম এবং সংঘর্ষের জন্য যাচাই করছিলাম।

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

উত্তর:


11

এটির traditionalতিহ্যবাহী সমাধান হ'ল একটি সীমাবদ্ধ রাষ্ট্র মেশিন, যা বেশ কয়েকটি মন্তব্যে পরামর্শ দেওয়া হচ্ছে।

আমি সসীম রাষ্ট্রের মেশিনকে ঘৃণা করি।

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

যদি আপনি এমন কোনও ভাষা ব্যবহার করতে পারেন যা তাদের সমর্থন করে তবে আমি কর্টিনগুলি সুপারিশ করি। তারা আপনাকে এমন কোড লিখতে দেয় যা দেখতে দেখতে:

function TetrisPieceExplosion()
  for brightness = 0, 1, 0.2 do
    SetExplosionBrightness(brightness)
    coroutine.yield()
  end

  AllowNewBlockToFall()

  SpawnABunchOfParticles()

  RemoveBlockPhysics()

  for transparency = 0, 1, 0.5 do
    SetBlockTransparency(transparency)
    coroutine.yield()
  end

  RemoveBlockGraphics()
end

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

আমার জ্ঞানের সেরা হিসাবে, এই কার্যকারিতাটি সহজেই সি, সি ++, সি #, উদ্দেশ্য সি বা জাভাতে উপলভ্য নয়। আমি আমার সমস্ত গেম যুক্তির জন্য লুয়া ব্যবহার করার অন্যতম প্রধান কারণ এটি :)


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

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

সত্য, তবে টেট্রিস উদাহরণের জন্য এটি পর্যাপ্ত পরিমাণে হওয়া উচিত :)
বাম্মজ্যাক

সহ-রুটিন রক- তবে লুয়া একটি ভাষা হিসাবে অন্য অনেক উপায়ে সফল হয়, আমি এটির সুপারিশ করতে পারি না।
ডেড এমজি

যতক্ষণ না আপনার কেবল শীর্ষ স্তরে উত্পাদন করা প্রয়োজন (এবং কোনও নেস্টেড ফাংশন কল থেকে নয়), আপনি সি # তে একই জিনিসটি সম্পন্ন করতে পারবেন, তবে হ্যাঁ, লুয়া কর্টিনেস রক।
উপুড়হস্ত

8

আমি মেক ম্যাকশ্যাফ্রি দ্বারা সম্পূর্ণ গেম কোডিং সম্পূর্ণ থেকে এটি নিচ্ছি।

তিনি একটি 'প্রসেস ম্যানেজার' সম্পর্কে কথা বলেন, যা করা প্রয়োজন এমন একটি কাজের তালিকাতে উত্সাহিত করে। উদাহরণস্বরূপ, কোনও প্রক্রিয়া তরোয়াল আঁকার (অ্যানিমপ্রসেস) অ্যানিমেশন নিয়ন্ত্রণ করতে পারে, বা দরজা খোলার জন্য বা আপনার ক্ষেত্রে সারিটি অদৃশ্য হয়ে যায়।

প্রক্রিয়াটি ম্যানেজারের তালিকায় প্রক্রিয়া যুক্ত হবে, যা প্রতিটি ফ্রেমে পুনরাবৃত্তি হবে এবং প্রতিটিকে আপডেট () ডাকা হবে। খুব সাদামাটা সত্তা, কিন্তু কর্মের জন্য। এটি শেষ হয়ে গেলে তালিকা থেকে সরানোর জন্য একটি কিল পতাকা থাকবে।

তাদের সম্পর্কে অন্য ঝরঝরে জিনিস হ'ল পরবর্তী প্রক্রিয়াটির পয়েন্টার রেখে তারা কীভাবে লিঙ্ক করতে পারে। এইভাবে, আপনার অ্যানিমেট সারি প্রক্রিয়াটি আসলে থাকতে পারে:

  • সারিটি অদৃশ্য হওয়ার জন্য একটি অ্যানিমেশনপ্রসেস
  • টুকরো অপসারণ করার জন্য একটি মুভমেন্টপ্রসেস
  • স্কোর পয়েন্ট যোগ করার জন্য একটি স্কোরপ্রসেস

(যেহেতু প্রক্রিয়াগুলি এক-ব্যবহৃত জিনিস হতে পারে, শর্তাধীন সেখানে বা সেখানে X পরিমাণের জন্য)

আপনি যদি আরও বিশদ চান, তবে জিজ্ঞাসা করুন।


3

আপনি ক্রিয়াকলাপের একটি অগ্রাধিকার সারি ব্যবহার করতে পারেন। আপনি একটি ক্রিয়া এবং একটি সময় ধাক্কা। প্রতিটি ফ্রেম, আপনি সময় পাবেন এবং আপনি সেই সময়ের মতো নির্দিষ্ট সময় নির্ধারিত সমস্ত ক্রিয়াকলাপটি পপ অফ করে তাদের কার্যকর করে দিন। বোনাস: পদ্ধতির সুন্দরভাবে সমান্তরাল করে তোলে এবং আপনি আসলে প্রায় সমস্ত গেমের যুক্তিটি এভাবে প্রয়োগ করতে পারেন।


1

আপনার সর্বদা আগের এবং বর্তমান ফ্রেমের মধ্যে সময়ের পার্থক্যটি জানতে হবে, তারপরে আপনাকে দুটি জিনিস করতে হবে।

- আপনার মডেলটি কখন আপডেট করবেন তা নির্ধারণ করুন: যেমন eg টেট্রিসে যখন একটি সারি অপসারণ শুরু হয়, আপনি আর সারিটির সাথে স্টাফের সংঘর্ষ চান না, তাই আপনি আপনার অ্যাপ্লিকেশনটির 'মডেল' থেকে সারিটি সরিয়ে ফেলুন।

-তখন আপনাকে এমন একটি বস্তু হ্যান্ডেল করতে হবে যা স্থানান্তরের অবস্থায় রয়েছে একটি পৃথক শ্রেণিতে যা অ্যানিমেশন / ইভেন্টকে সময়ের সাথে সাথে সমাধান করে। তেঁতুলের উদাহরণে আপনার সারিটি আস্তে আস্তে ম্লান হয়ে যাবে (প্রতিটি ফ্রেমের অস্বচ্ছতাটি কিছুটা পরিবর্তন করুন)। অস্বচ্ছতা 0 হওয়ার পরে আপনি সারির উপরে সমস্ত ব্লককে নীচে স্থানান্তর করেন।

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


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

0

আপনাকে গেমটি "সসীম স্টেট মেশিন" হিসাবে ভাবতে হবে। গেমটি বেশ কয়েকটি রাজ্যের একটিতে হতে পারে: আপনার ক্ষেত্রে, "ইনপুট প্রত্যাশা করা", "টুকরোটা নীচে চলেছে", "সারি বিস্ফোরণ"।

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

if state == ACCEPTING_INPUT:
    if player presses any key:
        handle input
    row_timer = row_timer - time_since_last_frame
    if row_timer < 0:
        state = MOVING_PIECE_DOWN
elif state == MOVING_PIECE_DOWN:
    piece.y = piece.y + piece.speed*time_since_last_frame
    if piece.y >= target_piece_y:
        piece.y = target_piece_y
        state = ACCEPTING_INPUT
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.