কোনও গেমের অভিনেতাদের কি তাদের আঁকার জন্য দায়বদ্ধ হওয়া উচিত?


41

আমি গেম ডেভলপমেন্টে খুব নতুন, তবে প্রোগ্রামিংয়ে নয়।

আমি জাভাস্ক্রিপ্টের canvasউপাদানটি ব্যবহার করে (আবার) পং টাইপের গেমটি খেলছি ।

আমি একটি Paddleঅবজেক্ট তৈরি করেছি যার মধ্যে নিম্নলিখিত বৈশিষ্ট্য রয়েছে ...

  • width
  • height
  • x
  • y
  • colour

আমার এমন একটি Pongবস্তুও রয়েছে যার মতো বৈশিষ্ট্য রয়েছে ...

  • width
  • height
  • backgroundColour
  • draw()

draw()পদ্ধতি বর্তমানে রিসেট করা হয় canvasএবং যে যেখানে একটি প্রশ্ন এসেছেন।

যদি Paddleচিত্রটির draw()অঙ্কনের জন্য কোনও জিনিসের দায়বদ্ধ থাকতে পারে বা তার অভিনেতাদের আঁকার জন্য draw()কোনও Pongঅবজেক্টের দায়বদ্ধ হওয়া উচিত (আমি মনে করি এটি সঠিক শব্দ, দয়া করে আমি ভুল হয়ে থাকলে আমাকে সংশোধন করুন)।

আমি বুঝতে পেরেছিলাম যে এটি Paddleদুটি আঁকতে এটি নিজেই আঁকার জন্য সুবিধাজনক হবে , এবং আমি দুটি বস্তু ইনস্ট্যান্ট করি Playerএবং Enemy। যদি ছিল না Pongএর draw(), আমি অনুরূপ কোড দুইবার লিখতে প্রয়োজন চাই।

এখানে সেরা অনুশীলন কি?

ধন্যবাদ।


উত্তর:


49

অভিনেতাদের আঁকানো দুটি মূল কারণের জন্য নিজেরাই ভাল নকশা নয়:

1) এটি একক দায়িত্বের নীতি লঙ্ঘন করে , কারণ এই অভিনেতাদের সম্ভবত তাদের মধ্যে কোড রেন্ডার করার আগে আরও কাজ করার ছিল।

2) এটি এক্সটেনশনকে কঠিন করে তোলে; যদি প্রতিটি অভিনেতার ধরণের নিজস্ব অঙ্কন প্রয়োগ করে এবং আপনার সাধারণভাবে আঁকার উপায়টি পরিবর্তন করতে হয় তবে আপনাকে প্রচুর কোড পরিবর্তন করতে হবে। উত্তরাধিকারের অতিরিক্ত ব্যবহার এড়ানো কিছুটা হলেও এটিকে হ্রাস করতে পারে, তবে সম্পূর্ণ নয়।

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

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

তারপরে আপনি সহজেই প্রতিটি দৃশ্যমান অভিনেতাকে পুনরাবৃত্তি করতে পারেন, তাদের রেন্ডারগুলিতে রেন্ডারটির বিবরণকে বোঝাতে পারেন এবং এটি এর কাজটি করতে দিন (মূলত; আপনি আরও সাধারণীকরণ করতে পারেন)।


14
"রেন্ডারিং অঙ্কন কোডের জন্য +1", তবে একক দায়িত্বের নীতির জন্য -1, যা প্রোগ্রামাররা ভালের চেয়ে বেশি ক্ষতি করেছে । এটি সঠিক ধারণা পেয়েছে (উদ্বেগের বিভাজন) , তবে এটি যেভাবে বলা হয়েছে ("প্রত্যেক শ্রেণীর কেবল একটি দায়িত্ব থাকা উচিত, এবং / অথবা পরিবর্তনের একমাত্র কারণ") কেবল ভুল
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

2
-1 ফর 1), যেমন নীলরাজ রাজা নির্দেশ করেছেন, এই নীতিটি আদর্শবাদী, তবে ব্যবহারিক নয়। -1 for 2) কারণ এটি এক্সটেনশনটিকে উল্লেখযোগ্যভাবে আরও কঠিন করে না। আপনার যদি আপনার পুরো রেন্ডারিং ইঞ্জিনটি পরিবর্তন করতে হয় তবে আপনার অভিনেতার কোডে যা কিছু কম রয়েছে তার চেয়ে আপনার অনেক বেশি কোড পরিবর্তন করতে চলেছেন। আমি actor.draw(renderer,x,y)তুলনায় অনেক পছন্দ করব renderer.draw(actor.getAttribs(),x,y)
কর্সিকা

1
ভাল উত্তর! আচ্ছা "আপনি একক দায়িত্বের নীতি লঙ্ঘন করবেন না" আমার ডেসলগের ভিতরে নয়, তবে এটি বিবেচনার জন্য এখনও একটি ভাল নীতি
FxIII

@ গ্লোকোডার এই পয়েন্টটি নয়, আপনি অভিনেতা.ড্রেও () সংরক্ষণ করতে পারবেন, যা nd রেন্ডারআরড্রু (জাল, অ্যাগ্রিভস, ট্রান্সফর্ম) হিসাবে সংজ্ঞায়িত হয়েছে; }। ওপেনজিএলে, আমি struct RenderDetail { glVAO* vao; int shader; int texture; Matrix4f* transform; }আমার রেন্ডারারের জন্য কম বেশি বজায় রাখি। এইভাবে উপাত্ত কী উপাত্ত উপস্থাপন করে তা যত্ন করে না, এটি কেবল এটি প্রক্রিয়া করে। এই তথ্যের ভিত্তিতে, আমি তখনও সিদ্ধান্ত নিতে পারি যে সামগ্রিক জিপিইউ কলগুলি হ্রাস করার জন্য ড্র কলগুলির ক্রম বাছাই করতে হবে কিনা।
মিথ্যাচারিত ক্যাভিয়ার

16

ভিজিটর প্যাটার্ন এখানে উপযোগী হতে পারে।

আপনি যা করতে পারেন তার একটি রেন্ডারার ইন্টারফেস যা প্রতিটি বস্তুকে কীভাবে আঁকতে হয় এবং প্রতিটি অভিনেতাতে "নিজেকে আঁকুন" পদ্ধতি যা কোন (নির্দিষ্ট) উপস্থাপক পদ্ধতিটি কল করতে পারে তা নির্ধারণ করে have

interface Renderer {
    void drawPaddle(Player owner, Rectangle position);
    // Note: the Renderer chooses the Color based on which player the paddle belongs to

    // Also drawBackground, drawBall etc.
}

interface Actor {
    void draw(Renderer renderer);
}

class Paddle implements Actor {
    void draw(Renderer renderer) {
        renderer.drawPaddle(this.owner, this.getBounds());
    }
}

এইভাবে অন্য গ্রাফিক্স লাইব্রেরি বা কাঠামোটিতে পোর্ট করা এখনও সহজ (আমি একবার সুইং / জাভা 2 ডি থেকে এলডাব্লুজেজিএল-তে একটি খেলা পোর্ট করেছি এবং খুব আনন্দিত যে আমি Graphics2Dপ্রায় পাশ করার পরিবর্তে এই প্যাটার্নটি ব্যবহার করেছি ।)

এর আরও একটি সুবিধা রয়েছে: যে কোনও অভিনেতার কোড থেকে রেন্ডারারের পরীক্ষা করা যেতে পারে can


2

আপনার উদাহরণে আপনি পং অবজেক্টগুলি ড্র () প্রয়োগ করতে এবং তাদের রেন্ডার করতে চান।

যদিও আপনি এই আকারের কোনও প্রকল্পে কোনও উল্লেখযোগ্য লাভ লক্ষ্য করবেন না, সাধারণত গেমের যুক্তি এবং তাদের ভিজ্যুয়াল উপস্থাপনা (উপস্থাপনা) আলাদা করা একটি সার্থক কার্যকলাপ।

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

তারপরে আপনার কাছে পং রেন্ডারার () শ্রেণি রয়েছে যার একটি পং অবজেক্টের রেফারেন্স রয়েছে এবং এটি পং () শ্রেণীর রেন্ডারিংয়ের দায়িত্ব নেয়, এটি প্যাডেলস রেন্ডারিং বা প্যাডেলরেন্ডারারের ক্লাসের যত্ন নিতে পারে।

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


-1

যদি আপনি এটি Pong'এর অঙ্কনে () করেন তবে আপনার কোডটি নকল করতে হবে না - কেবল আপনার Paddleপ্রতিটি প্যাডেলের জন্য' ড্র '() ফাংশনটি কল করুন । সুতরাং আপনার Pongআঁকায় () আপনি পাবেন

humanPaddle.draw();
compPaddle.draw();

-1

প্রতিটি বস্তুর নিজস্ব ড্র ফাংশন থাকা উচিত যা গেম আপডেট কোড বা অঙ্কন কোড দ্বারা কল করা উচিত। মত

class X
{
  public void Draw( )
  {
     // Do something 
  } 
}

class Y
{
  public void Draw( )
   { // Do Something 
   } 
}

class Game
{
  X objX;
  Y objY;

  @Override
  public void OnDraw( )
  {
      objX.Draw( );
      objY.Draw( ); 
  } 
}

এটি কোনও কোড নয় তবে কেবল চিত্র প্রদর্শনের জন্য, কীভাবে অঙ্কন করা উচিত


2
এটি "কীভাবে অঙ্কন করা উচিত" নয় এটি করার একক উপায়। পূর্ববর্তী উত্তরে উল্লিখিত হিসাবে, অন্যান্য পদ্ধতিতে উল্লেখযোগ্য সুবিধা এবং নমনীয়তা রয়েছে যদিও এই পদ্ধতির কিছু ত্রুটি এবং কয়েকটি সুবিধা রয়েছে।
ট্রয়সিফ

আমি প্রশংসা করি তবে যেহেতু দৃশ্যে অভিনেতাদের আঁকার বিভিন্ন উপায়ের একটি সহজ উদাহরণ দেওয়া হয়েছিল, আমি এইভাবে উল্লেখ করেছি।
ব্যবহারকারীর 43609
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.