প্রতিবিম্বের কোণ


11

আমার এই "ব্রেক ব্রেক আউট স্টাইল" গেমটি আছে।

আমার কেন্দ্রে একটি কামান রয়েছে, কামানের চারপাশে ব্লক রয়েছে এবং ব্লকের চারপাশে প্যাড রয়েছে। খেলাটি এরকম দেখাচ্ছে:

একটি বিজ্ঞপ্তি ব্রেকআউট খেলা

আমি প্রতি পিক্সেল সংঘর্ষে পরিচালিত হয়েছি এবং আমার বলটি নিম্নলিখিত গণিতের সাথে ব্লকগুলির সাথে যোগাযোগের ক্ষেত্রে " প্রতিফলিত করে ":

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

প্রতিবিম্ব গণনার একটি কোণ চিত্রিত চিত্র

যেখানে নীল রেখাটি বলের দিক এবং কালো রেখা (বেস লাইন) হ'ল ব্লক পৃষ্ঠ surface

দিকটি হ'ল রেডিয়ানে প্রকাশিত একটি কোণ (এটি অবশ্যই ডিগ্রিতে রূপান্তরিত হতে পারে)।
বলটি সরানো হয়েছে:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

এ পর্যন্ত সব ঠিকই.

প্যাডগুলি (ছোট রঙিন ব্লকের চারপাশে 3 গা dark় এবং বড় ব্লক) দিয়ে আমার সমস্যাটি এখন চলে আসে।

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

PS : যদি প্রয়োজন হয়, আমি কোড এবং একটি প্লেযোগ্য swf সরবরাহ করতে পারি।


সম্পাদন করা

ঠিক আছে, কোণগুলির সাথে সমস্যাটি ভেক্টরগুলির সাথে সমাধান করা হয়েছিল , তবে আমার পাশ এবং পিছনের সংঘর্ষের সাথে এখনও সমস্যা রয়েছে।

আমি এটির জন্য আরও একটি প্রশ্ন খুলব এবং এটি এখানে লিঙ্ক করব।


3
আপনি যদি আপনার অ্যাকাউন্টগুলি পুনঃসংযোগ করেন তবে আপনার +100 খ্যাতি বোনাস পাওয়া উচিত। এটি আপনার প্রোফাইলের অ্যাকাউন্ট অ্যাকাউন্টে একটি বিকল্প হওয়া উচিত। মাঝামাঝি সময়ে, যদিও আমি আপনার জন্য এই চিত্রগুলি পোস্ট করব।
গ্রেস নোট

আমি সংগ্রহ করি আপনার দিকটি 0 এবং 360 এর মধ্যে একটি কোণ এবং আপনি যে বলটি ত্রিকোণমিতি ব্যবহার করছেন তা সরানোর জন্য?
জোনাথন কনেল

@ গ্রেস, ছবিগুলির জন্য আপনাকে অনেক ধন্যবাদ ... @ 3nixios, আমি কোণ এবং গতি সম্পর্কে আরও তথ্য যুক্ত করেছি।
নিমোস্টেইন

আপনি যদি প্রতি ব্লকে কেবল একটি "দিকনির্দেশ" সঞ্চয় করেন তবে আপনি প্রতিটি কালো ব্লককে চারটি পৃথক ব্লকের একটি গ্রুপ হিসাবে পুনরায় কল্পনা করতে পারেন যেখানে "দিকনির্দেশ" মুখটি সর্বদা বাহিরের দিকে মুখ করে থাকে। চারটি কোণে সম্ভবত প্রান্তের কেস থাকবে।
হোরাটিও

উত্তর:


8

আমি আপনার সমস্যাটি সঠিকভাবে বুঝতে পেরেছি কিনা তা নিশ্চিত নই, তবে আমি ধরে নিয়েছি যে আপনি যা করতে চান তা হ'ল সংঘর্ষের পরে আপনার বলের ফলাফলের দিকটি খুঁজে পাওয়া যায়।

এখানে আমার সাদা বোর্ডে একটি দ্রুত অঙ্কন রয়েছে যা এটির জন্য একটি সম্ভাব্য সমাধান দেখায়:

এখানে চিত্র বর্ণনা লিখুন

সবুজ তীরগুলি বলের বেগকে (ভেক্টর হিসাবে) উপস্থাপন করে, নীল ব্লকগুলি আপনার বৃহত কালো ব্লকগুলিকে উপস্থাপন করে এবং লাল তীরটি ফলস্বরূপ ভেক্টর।

প্রথম ক্ষেত্রে, নীল ব্লকের 30 ডিগ্রির ঝোঁক রয়েছে। সংঘর্ষের সমস্যার সমাধানের একটি উপায় হ'ল অনুভূমিক অক্ষের উপরে সবকিছু ফিরিয়ে আনা। আপনাকে যা করতে হবে তা হ'ল সবকিছুকে 30 ডিগ্রি (ব্লকের প্রবণতা) দ্বারা আবর্তিত করা (আপনি তার জন্য ম্যাট্রিক ব্যবহার করতে পারেন)।

তারপরে, আপনি পরীক্ষা করে দেখুন যে সংঘর্ষটি কোথা থেকে হয়েছিল । সংঘর্ষটি যদি অনুভূমিক হয় তবে গতির x উপাদানটি বিপরীত করুন। যদি এটি উল্লম্ব ছিল (এই ক্ষেত্রে যেমন), y উপাদান ( ball.Velocity.Y = -ball.Velocity.Y)। কোণটি আঘাত করলে এটি বলকে সঠিকভাবে কাজ করবে (এটি উভয় উপাদানকে বিপরীত করবে)। এর পরে, আপনাকে কেবল আসল অবস্থানে ফিরে যেতে হবে (যা অঙ্কন নয়) on

দ্বিতীয় ক্ষেত্রে, বলের গতিবেগটি ব্লকের লম্ব নয়, ব্যতীত এটি একই জিনিস। আপনি 70 ডিগ্রি ঘোরান, সংঘটনটি কোথা থেকে এসেছে তা পরীক্ষা করুন এবং উপযুক্ত উপাদানগুলি বিপরীত করুন। এর পরে, আপনি আপনার বাস্তব পরিস্থিতিতে ফিরে ঘোরান।

দ্রষ্টব্য: আমি লক্ষ্য করেছি যে আপনি কোনও ভেক্টরের পরিবর্তে দিকটি উপস্থাপন করতে একটি কোণ ব্যবহার করছেন। আপনি এই গণনাগুলির জন্য কেবল একটি ভেক্টর তৈরি করতে পারেন বা একই সাধারণ ধারণা রাখতে পারেন তবে কোণগুলির সাথে কাজ করছেন।

এটি অবশ্যই যাওয়ার সর্বোত্তম উপায় নয় এবং আমি নিশ্চিত যে আপনি এটি কোনও উপায়ে গণনা করতে পারবেন তবে আমি মনে করি এটি আপনার সমস্যার সম্ভাব্য সমাধান।


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

হাহা আমার ক্ষীণ অঙ্কনের দক্ষতা ক্ষমা করুন।
জেসি এমন্ড

ওফস, অঙ্কন করার সময় আমি একটি গুরুত্বপূর্ণ পদক্ষেপটি ভুলে গিয়েছিলাম .. -block inclination angleএকটি যথাযথ সংঘর্ষের প্রতিক্রিয়া পেতে আপনাকে ফিরে ঘোরানো দরকার .. বোকা আমার।
জেসি এমন্ড

আমার ধারণা এটি ব্যক্তিগত পছন্দ সম্পর্কে, তবে আমি ভেক্টরকে অনেক বেশি পছন্দ করি। আপনাকে বেশিরভাগ সময় তাদের পিছনে গণিত সম্পর্কে ভাবতে হবে না এবং এটি সাধারণত কোড ক্লিনার করে তোলে। তাই আপনি যদি একটি রাখতে পারে Direction(একটি ভেক্টর) এবং তাই মত বলের অবস্থান আপডেট করুন: ball.Position += ball.Direction * ball.Speed;
জেসি এমন্ড

@ জেসি, আমি এখন পর্যন্ত এটি করতে পারিনি। আমি আপনার পদ্ধতিটি পুরোপুরি বুঝতে পেরেছি, তবে এটি কার্যকর করতে পারিনি। এটি করার জন্য আমাকে ভেক্টরগুলি ব্যবহার করতে রেডিয়ান এঙ্গেলগুলি ব্যবহার করে এমন পুরো অংশটি আবার লিখতে হবে (এটি আসলে বেশি নয়)। আপাতত আমি অন্যান্য বিকল্পগুলি চেষ্টা করব এবং আপনার যদি অন্য একটি থাকে তবে আমি চেষ্টা করে খুশি হব। ধন্যবাদ।
নিমোস্টেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.