পং-এ, প্যাডেলটি বাউন্স করার সময় আপনি বলটির দিকনির্দেশনা কীভাবে গণনা করবেন?


28

আমি গেম বিকাশের এই হ্যালো ওয়ার্ল্ড-ওয়াইয়ের সমস্যাটিকে ঘিরে আমার মাথা গুটিয়ে দেওয়ার চেষ্টা করছি। আমি এক্সএনএ-তে একটি টিকট্যাকও গেম তৈরি করেছি যাতে আমি অনুমান করি যে পরবর্তী পদক্ষেপটি একটি ব্রেকআউট ক্লোন হবে।

মনে রাখবেন যে গেম প্রোগ্রামিং সম্পর্কে আমার কোন জ্ঞান নেই বা কোথাও আমার কী গণিতের প্রয়োগ করা উচিত। এই কারণেই আমি এই প্রশ্নটি করছি।


প্রশ্নের উত্তর: পর্দার নীচে প্যাডেলটি আঘাত করলে বলটি কোথায় বাউন্স করা উচিত তা আমি কীভাবে নির্ধারণ করতে পারি?

আমি ভাবতাম এটি এমন কিছু হবে:

  1. আগত বল থেকে গতি এবং কোণ ক্যাপচার করুন।
  2. এটি বারটি কোথায় ছুঁয়েছে তা সনাক্ত করুন (খুব বাম দিকে, ডানদিকে, মাঝখানে) এবং সে অনুসারে এটি বাইরের অঞ্চলে স্পর্শ করলে এটি একটি উচ্চ গতি দিন।
  3. এখানেই আমি আটকে আছি। হে হে।

কোন অন্তর্দৃষ্টি? আমি বুঝতে পেরেছি যে এটি কোনও সরল উত্তর ধরণের প্রশ্ন নয়, তবে আমি নিশ্চিত যে এটি এক পর্যায়ে প্রত্যেকে মুখোমুখি।

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


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

উত্তর:


30

আমি আমার হোমপৃষ্ঠায় পংগুলিতে যে প্রাসঙ্গিক যুক্তিটি ব্যবহার করেছি তা এখানে :

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

var relativeIntersectY = (paddle1Y+(PADDLEHEIGHT/2)) - intersectY;

প্যাডলের মাঝারি ওয়াই মানটি ধরুন এবং বলের Y ছেদটি বিয়োগ করুন। প্যাডেলটি যদি 10 পিক্সেল বেশি হয় তবে এই সংখ্যাটি -5 এবং 5 এর মধ্যে হবে I

var normalizedRelativeIntersectionY = (relativeIntersectY/(PADDLEHEIGHT/2));
var bounceAngle = normalizedRelativeIntersectionY * MAXBOUNCEANGLE;

আপেক্ষিক চৌরাস্তা নিন এবং প্যাডলের উচ্চতার অর্ধেক দ্বারা ভাগ করুন। এখন আমাদের -5 থেকে 5 নম্বর দশমিক -1 থেকে 1; এটা স্বাভাবিক করা হয়েছে । তারপরে এটি সর্বাধিক কোণ দিয়ে গুন করুন যার মাধ্যমে আপনি বলটি বাউন্স করতে চান। আমি এটি 5 * পাই / 12 রেডিয়েন (75 ডিগ্রি) এ সেট করেছি।

ballVx = BALLSPEED*Math.cos(bounceAngle);
ballVy = BALLSPEED*-Math.sin(bounceAngle);

অবশেষে, সহজ ত্রিকোণমিতি ব্যবহার করে নতুন বলের বেগ গণনা করুন।

এটি আপনি যে প্রভাবটির জন্য যাচ্ছেন তা পুরোপুরি নাও হতে পারে, বা আপনি সর্বোচ্চ গতিতে স্বাভাবিক আপেক্ষিক ছেদটি গুণ করে একটি গতিও নির্ধারণ করতে চাইতে পারেন; এটি বলটিকে কোনও প্যাডেলের প্রান্তের নিকটে আঘাত করলে, বা এটি কেন্দ্রের কাছে আঘাত করলে ধীর গতিতে এগিয়ে যাবে।


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

কোনও ভেক্টরে গতি এবং দিক উভয়ই অন্তর্নিহিতভাবে থাকে। আমি আমার ভেক্টরটিকে "ভিএক্স" এবং "ভিআই" হিসাবে সঞ্চয় করি; অর্থাৎ x দিকের গতি এবং y দিকের গতি। আপনি যদি পদার্থবিজ্ঞানে কোনও প্রাথমিক কোর্স না নিয়ে থাকেন তবে এটি আপনার কাছে কিছুটা বিদেশী বলে মনে হতে পারে।

আমি এটি করার কারণ হ'ল এটি প্রতি ফ্রেমের প্রয়োজনীয় গণনা হ্রাস করে; প্রতিটি ফ্রেম, আপনি কেবল করেন x += vx * time;এবং y += vy * time;সর্বশেষ ফ্রেমের পর থেকে সময়টি যেখানে মিলি সেকেন্ডে হয় (তাই বেগ প্রতি মিলি সেকেন্ডে পিক্সেল হয়)।


বলটি বাঁকানোর ক্ষমতা বাস্তবায়নের বিষয়ে:

প্রথমত, বল আঘাত করার সময় আপনাকে প্যাডেলের গতিবেগ জানতে হবে; যার অর্থ আপনার প্যাডেলের ইতিহাস সম্পর্কে নজর রাখা দরকার, যাতে আপনি প্যাডেলের অতীত অবস্থানগুলির এক বা একাধিক জানতে পারেন যাতে আপনি তাদের বর্তমান অবস্থার সাথে তুলনা করতে পারেন এটি সরিয়ে নিয়েছে কিনা তা দেখতে। (পজিশনে পরিবর্তন / সময়ে পরিবর্তন = গতিবেগ; সুতরাং আপনার 2 বা ততোধিক অবস্থানের প্রয়োজন এবং সেই অবস্থানগুলির সময়)

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

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


এই প্রভাব আমি যাচ্ছি; এটি বারের প্রান্তগুলিতে তত দ্রুত গতি পায়। এটি লেখার জন্য সময় দেওয়ার জন্য একগুচ্ছ ধন্যবাদ। যদিও কিছু জিনিস বুঝতে আমার কিছুটা সমস্যা হচ্ছে; উদাহরণস্বরূপ, প্রথম স্নিপারে, 'ছেদযুক্ত' কী? এছাড়াও, 'প্যাডেল 1 ওয়াই' বারের উচ্চতাটি সঠিক?

ছেদকীটি বলের অবস্থান যেখানে ছেদকে ছেদ করে inters আমি একটি অত্যধিক জটিল হিসাব করি যা আমি এখনই সৎভাবে বুঝতে পারি না, তবে মূলত এটি বলটির ধাক্কা দেওয়ার সময় এটির ওয়াই মান। প্যাডল 1 ওয়াই প্যাডেলের শীর্ষস্থানীয় প্যাডেলের ওয়াই মান; প্যাডলেহাইটটি প্যাডলের উচ্চতা ("বার")।
রিকিট

"বক্ররেখা" বলগুলিকে অনুমতি দেওয়ার জন্য আপনার কী যুক্ত করতে হবে? উদাহরণস্বরূপ, যখন বল প্যাডেলটি আঘাত করতে চলেছে তখন আপনি বল বক্ররেখার জন্য প্যাডেলটি সরিয়ে রাখুন। এরকম কিছু: এন.ইউইকিপিডিয়া.আর
উইকি

সম্পাদনাটি দেখুন এবং আপনি কী ভাবেন তা আমাকে জানান (যদি আপনার কোনও বিষয়ে আরও তথ্যের প্রয়োজন হয় তবে কিছু পান না))
রিকিট

ধন্যবাদ! দুর্দান্ত উত্তর, আমি সবসময় ভাবছিলাম যে কীভাবে এই প্রভাবটি অর্জন করা যায়!
জোলোমন

8

এই কাজটি করার পরে বেশ কিছুদিন হয়ে গেছে, তবে আমি মনে করি আমি এই অধিকার পেয়েছি।

একটি নিখুঁত সংঘর্ষ দেওয়া, প্রতিবিম্বের কোণটি ঘটনার কোণের সমান।

আপনি নিজের প্যাডেলের সাধারণ জিনিসটি জানেন (একটি সমতল পৃষ্ঠকে ধরে রাখছেন): আপনি নিজের বলের মূল অবস্থানটি জানেন (আপনার টাইমস্টেপের শুরুতে): পি আপনি নিজের বলের নতুন অবস্থানটি (টাইমস্টেপের শেষে) জানেন: পি 'আপনি নিজের সংঘর্ষের বিষয়টি জানেন: সি ধরে নিচ্ছেন যে আপনি গণনা করেছেন যে বিভাগটি P -> পি' আপনার প্যাডেলের মধ্য দিয়ে যায়, আপনার নতুন প্রতিচ্ছবিযুক্ত পোস্ট (পি '') হবে:

পি '+ 2 * (এন * (পি' ডট-এন))

এন * (পি 'ডট-এন) সুপ এক্সপ্রেসনটি বলটি যে যাত্রা করেছিল তার সংঘর্ষের স্বাভাবিকতার সাথে গভীরতা গণনা করে। বিয়োগ চিহ্নটি হ'ল আমরা সাধারণের দিকের বিপরীতে গভীরতার জন্য যাচাই করি for

পি '+ 2 * স্যুব এক্সপ্রেশনের অংশটি বলটিকে সংঘর্ষের বিমানের উপরে পিছনে নিয়ে যায়, সংঘর্ষের গভীরতার 2 গুণ বেশি করে।

আপনি যদি নিখুঁত সংঘর্ষের চেয়ে কম চান তবে 2 গুণকটিকে (1 + (1-কে)) হিসাবে পরিবর্তন করুন যেখানে k আপনার ঘর্ষণের সহগ। একটি নিখুঁত সংঘর্ষের আক মান 0 থাকে, যার ফলে প্রতিবিম্ব কোণটি আগত কোণগুলির মতো হয়। 1 কে এর মান একটি সংঘর্ষের কারণ যেখানে বলটি সংঘর্ষের বিমানের পৃষ্ঠের উপরে থাকবে।

আপনার নতুন বেগের ভেক্টর, ভি '', দিকটি হবে পি '' - সি এটি সাধারণ করুন এবং আপনার আগত বেগ দিয়ে গুণ করুন এবং আপনার ফলস্বরূপ বেগটি একই হবে তবে নতুন দিকে in আপনি এই গতি সহ বানরকে একটি গুণফল, এল দ্বারা গুণিত করতে পারেন যা হয় হয় (l> 1) বা হ্রাস (l <1) ফলে গতিবেগ।

সংক্ষেপ:

পি '' = পি '+ (1-কে) * (এন * (পি ডট-এন)) ভি' '= l * ভি * ((পি' '- সি) / | পি' '- সি |)

যেখানে কে এবং এল আপনার চয়ন করার সহগ রয়েছে।


5

প্রতিবিম্ব হয় হয় "ডান" বা সম্পন্ন "সহজ"।

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

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


উপরে বর্ণিত "সহজ" উপায় এবং "সঠিক" উপায়টি মূলত একই নয় ??
টম

প্রাচীরগুলি প্রধান অক্ষ সহ বরাবর থাকে তবে তারা ঠিক একই। যদি দেয়ালগুলি সমস্ত এক্স, ওয়াই এবং জেড অক্ষের সাথে না থাকে তবে না, দুটি সম্পূর্ণ আলাদা।
ড্যাশ-টম-ব্যাং

5

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

  • অবশ্যই, বলের গতি সময়ের সাথে সাথে আমি x এর আগে / পরে বিভক্ত করেছিলাম, সঠিক সংঘর্ষ সনাক্তকরণের জন্য y পদক্ষেপগুলি, সমস্ত "স্টেপএক্স" এবং "স্টেপওয়াই" দিয়ে লুপিং যা ভেক্টরের মডুলাস দ্বারা প্রতিটি গতির উপাদানকে বিভক্ত করে গণনা করা হয় বর্তমান এবং ভবিষ্যতের বল অবস্থানের দ্বারা।

  • যদি প্যাডলের বিপরীতে সংঘর্ষ হয় আমি Y এর গতি 20 দ্বারা বিভক্ত করি। বলটি প্যাডেলের পাশে আঘাত করলে আমার ফলস্বরূপ সর্বোচ্চ কোণটি পাওয়া এই "20" সর্বাধিক সুবিধাজনক মান, তবে আপনি যা কিছুতেই পরিবর্তন করতে পারেন আপনার প্রয়োজনগুলি হ'ল কিছু মান নিয়ে খেলুন এবং আপনার জন্য আরও ভাল চয়ন করুন। ভাগ করে, 5 এর গতি বলি, যা এই সংখ্যার (20) দ্বারা আমার প্রাথমিক গতির গতি, আমি 0.25 এর একটি "রিবাউন্ড ফ্যাক্টর" পাই। এই গণনাটি আমার কোণগুলিকে বেশ সমানুপাতিক রাখে যখন সময়ে আমার সর্বোচ্চ গতির মান পর্যন্ত গতি বৃদ্ধি পায় যা উদাহরণস্বরূপ, 15 হতে পারে (সেই ক্ষেত্রে: 15/20 = 0.75)। আমার প্যাডল এক্স, ওয়াই কর্ডগুলি মিডহ্যান্ডেল করা বিবেচনা করে (x এবং y প্যাডেলের কেন্দ্রকে উপস্থাপন করে), আমি তখন বলের অবস্থান এবং প্যাডলের অবস্থানের মধ্যে পার্থক্য দ্বারা এই ফলাফলটিকে বহুগুণ করি। তত বেশি পার্থক্য, গ্রেটয়ার ফলাফল কোণ। পাশাপাশি, মিডহ্যান্ডলড প্যাডেল ব্যবহার করে, আপনি কেন্দ্রটি নির্ধারণের বিষয়ে চিন্তা না করে বলটি যেদিকে আঘাত করে, তার উপর নির্ভর করে আপনি এক্স ইনক্রিমেন্টের জন্য সঠিক চিহ্নটি পাবেন। সিউডো কোডে:

N = 0 থেকে মডুলাসের জন্য ...

যদি সংঘর্ষ_পরিচিত হয় তবে স্পিডএক্স = - (স্পিডওয়াই / 20) * (প্যাডেলএক্স - বলএক্স); স্পিডওয়াই =-স্পিডওয়াই;
থেকে প্রস্থান; শেষ যদি

...

এক্স = এক্স + স্টেপ এক্স; y = y + stepsY;

জন্য শেষ

স্মরণকারী, সবসময় জিনিসগুলিকে সহজ রাখার চেষ্টা করুন। আমি আসা করি এটা সাহায্য করবে!


4

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

মূল বিষয়টি হ'ল বলের গতি নয়, প্রতিবিম্বের কোণটি যা পরিবর্তিত হয়। বলের গতি সাধারণত সময়ের সাথে ধীরে ধীরে বৃদ্ধি পায়।


1
আপনি একটি বাঁকা পৃষ্ঠ হিসাবে বলছেন এবং এটি আমার মাথার মধ্যে যৌক্তিক মনে হয় তবে আমি কোড কোডের দিক দিয়ে এটি একবার চিন্তা করার চেষ্টা করলে জিনিসগুলি দ্রুত ঝাপসা হয়ে যায়। আমি কীভাবে কোডটিতে ভেরিয়েবল বা কিছু হিসাবে এটি কীভাবে ঘোষণা করতে পারি।

এরকম কিছু angle = 1 - 2 * (ball.x - paddle.left) / paddle.widthআপনাকে 1 এবং -1 এর মধ্যে একটি নম্বর দেবে; এটি (আপনার গেম মেকানিক্সের জন্য কিছুটা মূল্য চিহ্নিত করা হয়েছে) বলটি সংঘর্ষের সময় স্পর্শকাতর লাইনের opeাল। কঠোরভাবে অনুভূমিক একের চেয়ে সেই লাইনটি প্রতিফলিত করুন।

4

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

শুরু করার জন্য আপনি বাম এবং ডানদিকে 45 ডিগ্রি পর্যন্ত কোণ তৈরি করতে পারেন। একবার আপনি গেমটি শেষ করার পরে আপনি যদি ফিরে যান এবং আরও জটিল করতে চান তবে আপনি এটি শুরু করার মতো সহজ করে তুলুন।


1
আমি সেই মূল বক্তব্যটিও দেখেছি, তাঁর বক্তব্যটি হ'ল এটি একটি গণিতের সিদ্ধান্ত নয়, এটি একটি নকশার সিদ্ধান্ত ছিল: "ঘটনার কোণ = প্রতিবিম্বের কোণ" সঠিক হবে তবে দুর্বল গেমপ্লে জন্য তৈরি করুন। মূল পং এবং ব্রেকআউট-এ, গতি ছিল কতগুলি বল / প্যাডেলের সংঘর্ষ ছিল তার একটি ফাংশন (যাতে এটি সময়ের সাথে সাথে গতি বাড়ায়)। তারা নির্দিষ্ট সংখ্যক হিট পরে প্যাডেলের আকারও হ্রাস করেছে। আমি যদিও বলটিকে সরাসরি উপরে উঠতে দেব না তবে আপনি সেখানে অনির্দিষ্টকালের জন্য প্যাডেলটি রেখে যেতে পারেন।
ইয়ান শ্রায়বার

4

পদার্থবিজ্ঞান ভিত্তিক গেম প্রোগ্রামিংয়ের বিশ্বে ডুবতে শুরু করার জন্য ব্রেকআউট একটি ক্লাসিক শুরুর কাজ। মূলত বলটি যখন একটি দেয়ালে আঘাত করে তখন একটি বাউন্সের গতি থাকে। উপরের কেউ প্রস্তাবিত ঘটনার কোণ প্রতিবিম্বের কোণের সমান। কিন্তু যখন আপনি প্যাডেল আঘাত বল বিবেচনা। যুক্তিটি 3 ভাগে বিভক্ত। 1.) বলটি প্যাডেলের মধ্যভাগে আঘাত করছে। ২) বলটি প্যাডেলের বাম দিকের অংশে আঘাত করছে। ৩) বলটি প্যাডেলের ডানদিকে অবস্থানে আঘাত করছে।

আপনি যখন কেন্দ্রের অংশটি বিবেচনা করবেন: বলটি আঘাত করার সময় আপনার প্রয়োগ হওয়া বাউন্স এফেক্টের আলাদা হওয়া দরকার না। বলটি কেবলমাত্র স্বাভাবিকভাবেই প্রতিবিম্বিত হয় B তবে, যখন উভয় দিকই আঘাত হানে তখন কেসটি আলাদা।

বলটি যখন বাম দিকের দিকে আঘাত করা হয়, অর্থাৎ বলটি স্ক্রিনের বাম দিক থেকে আসছে এবং ডান দিক থেকে প্যাডেলটি নিয়ে আসছেন consider তারপরে আপনি যখন বাম দিকের অংশটি দিয়ে বলটি আঘাত করেন, তখন বলটি the দিক থেকে আসা দিকটি প্রতিফলিত করা উচিত ie একই বিপরীত ক্ষেত্রে। ডান দিকের অংশেও একই জিনিস প্রযোজ্য।

বল আঘাত হানার সময় বাম বা ডানদিকে দিকের এই গতিবিধি এটি আরও বিশ্বাসযোগ্য করে তোলে।

আশা করি আপনি ধারণাটি পেয়েছেন, অন্তত যুক্তিযুক্ত বুদ্ধিমান। ধন্যবাদ


1

কল্পনা করুন যে আপনি প্যাডেলের কেন্দ্র এবং যে পয়েন্টটি বল ওয়াই আঘাত করেছে এবং এটি কল করে তার মধ্যবর্তী দূরত্ব গণনা করে d। ধরা যাক dবল প্যাডেলের কেন্দ্রের উপরে যখন বল আঘাত করে তখন একটি ইতিবাচক মান রয়েছে। আপনি এখন d * -0.1আপনার বলের ওয়াই গতিতে যোগ করতে পারেন এবং এটি দিক পরিবর্তন শুরু করবে। এখানে জাভাস্ক্রিপ্টের একটি উদাহরণ যা সহজে সি # তে অনুবাদ করা যায়!

var canvas = document.querySelector('canvas');
var resize = function () {
  canvas.width = innerWidth;
  canvas.height = innerHeight;
};
resize();
var ctx = canvas.getContext('2d');
var ball = {
  size: 3,
  x: 1,
  y: canvas.height/2,
  vx: 2,
  vy: 0
};
var paddle = {
  height: 40,
  width: 3,
  x: canvas.width/2,
  y: canvas.height/2
};
addEventListener('mousemove', function (e) {
  paddle.y = e.clientY - (paddle.height/2);
});
var loop = function () {
  resize();
  ball.x += ball.vx;
  ball.y += ball.vy;
  if (ball.x > canvas.width || ball.x < 0) ball.vx *= -1; // horiz wall hit
  if (ball.y > canvas.height || ball.y < 0) ball.vy *= -1; // vert wall hit
  if (ball.x >= paddle.x && ball.x <= paddle.x + paddle.width && ball.y >= paddle.y && ball.y <= paddle.y + paddle.height) {
    // paddle hit
    var paddleCenter = paddle.y + (paddle.height/2);
    var d = paddleCenter - ball.y;
    ball.vy += d * -0.1; // here's the trick
    ball.vx *= -1;
  }
  ctx.fillRect(ball.x,ball.y,ball.size,ball.size);
  ctx.fillRect(paddle.x,paddle.y,paddle.width,paddle.height);
  requestAnimationFrame(loop);
};
loop();
body {overflow: hidden; margin: 0}
canvas {width: 100vw; height: 100vh}
<canvas></canvas>


0

এটি http://www-classes.usc.edu/engr/ee-s/477p/s00/pong.html আপনাকে এক্স এবং ওয়াই স্ক্রিনটি কোথায় হিট করবে তার উপর নির্ভর করে উল্টাতে সহায়তা করবে । যদি এটি উপরে যায় এবং শীর্ষে আঘাত করে তবে এক্স বেগ রাখার সময় এটি y গতিবেগকে উল্টে দেয়


0

হাই আমার সম্প্রতি একটি বল গেম করার চেষ্টা করা হয়েছে এবং এর সমাধান খুঁজে পেয়েছি। সুতরাং আমি যা করেছি: প্যাডেল চলন্ত অবস্থায় আমরা গেমটি খেলছি moving আমার সমন্বিত সিস্টেমটি যেমন রয়েছে তেমনই ক্যানভাসের উপরের বাম দিকটি 0,0। এই সমন্বয় ব্যবস্থায় প্যাডেল চলমান। X অক্ষটি 0 থেকে ক্যানভাস প্রস্থে নির্দেশ করে, এবং y অক্ষ 0 থেকে ক্যানভাস উচ্চতায় নির্দেশ করছে। আমি স্থির আকার 100 প্রস্থ এবং 20 উচ্চতা সহ একটি প্যাডেল তৈরি করেছি। এবং তারপরে আমি এর চারপাশে একটি কল্পনাযুক্ত বৃত্ত আঁকছি। যখন বল প্যাডেলটি আঘাত করে তখন আমি প্যাডেলের সেন্টারপয়েন্টটি গণনা করি

double paddleCenter=Squash.paddle.getXpos()+Squash.paddle.getPaddleWidth()/2;

তারপরে আমি বলটির বর্তমান অবস্থান থেকে কেন্দ্রটি বিয়োগ করব এভাবে সমন্বিত ব্যবস্থা প্যাডেলের কেন্দ্রস্থলে থাকবে, বলসেন্টারটি এমন এক বিন্দু যেখানে বলটি প্যাডেলকে আঘাত করে (- (প্যাডলউইথ + আর)) .. 0 .. (প্যাডলিউইথ + আর )) এটি প্যাডেলের হিটিং পয়েন্টটি উদ্ধার করা ছাড়া আর কিছুই নয়

double x0 = ballCenterX-paddleCenter;

বলটির হিটিং পয়েন্ট (x0) এর সাহায্যে বৃত্তের ছেদ বিন্দুটি গণনা করুন এটি পুনরুক্তি, আমরা x0 ইতিমধ্যে পরিচিত স্থানাঙ্কের সাথে বৃত্তের y স্থানাঙ্কের জন্য জিজ্ঞাসা করি এবং y অক্ষের জন্য একটি ফ্লিপ দরকার ছিল

double y0 = -Math.sqrt(paddleRadius*paddleRadius-x0*x0);

রেডিস প্যাডেলরেডিয়াস f (x, y) = x ^ 2 + y ^ 2-r ^ 2 দিয়ে প্যাডেলের চারপাশে সংজ্ঞায়িত করা বৃত্তের সাধারণ সমীকরণের উত্সকে গণনা করুন

double normalX=2*x0;
double normalY=2*y0;

N ভেক্টরকে স্বাভাবিক করুন, পৃষ্ঠের স্বাভাবিকের জন্য ইউনিট ভেক্টর পেতে

double normalizer=Math.sqrt(normalX*normalX + normalY*normalY);
normalX=normalX/normalizer;
normalY=normalY/normalizer;

প্যাডলের জন্য এখন আমাদের নরমালাইজড (ইউনিট) পৃষ্ঠের নরমাল রয়েছে। এই পৃষ্ঠের নরমালগুলির সাথে নতুন দিকটি গণনা করুন, এটি প্রতিবিম্ব ভেক্টর সূত্রের সাহায্যে গণনা করা হবে: new_direction = old_direction-2 * বিন্দু (N, old_direction) * N, তবে পরিবর্তে পৃষ্ঠটি সর্বদা উপরের দিকে নির্দেশ করে, স্বাভাবিকের ইচ্ছাশক্তি বল প্যাডেল হিট যেখানে বিন্দু থেকে পয়েন্টে পরিবর্তন করা

double eta=2; //this is the constant which gives now perfect reflection but with different normal vectors, for now this set to 2, to give perfect reflection
double dotprod=vX*normalX+vY*normalY;
vX=vX-eta*dotprod*normalX;//compute the reflection and get the new direction on the x direction
vY=-vY;//y direction is remain the same (but inverted), as we just want to have a change in the x direction

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

https://github.com/zoli333/BricksGame

গ্রহের সাথে জাভাতে লেখা। বল.জবাতে এই মন্তব্য করার জন্য আরও একটি সমাধান রয়েছে, যেখানে উদ্ধার ঘটে না আমি স্থানাঙ্কিত সমন্বয় ব্যবস্থাটিকে প্যাডেলের কেন্দ্র বিন্দুতে সরিয়ে রাখি না, পরিবর্তে আমি উপরের বাম 0,0 সমন্বিত সিস্টেমের তুলনায় উপরের সমস্তগুলি গণনা করি প্যাডলের কেন্দ্র পয়েন্ট এটিও কাজ করে।

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