আমি কীভাবে কোনও স্প্রিটকে সামনে নিয়ে যাচ্ছি তার দিকে যেতে পারি?


11

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

সম্পাদনা করুন: এখানে ঘূর্ণন কোড (যা অন্য কিছু অদ্ভুত করে: /programming/12610320/why-is-my-image-rotating-off-center )

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng); 

এবং আন্দোলনের কোড। আমি কেবল পর্দার বাম দিকে যেতে পারি ...

double ang = sprite.angle;
            Input input = gc.getInput();

            if(input.isKeyDown(sprite.up)){
                sprite.x += Math.cos(ang)*sprite.moveSpeed;
                sprite.y += Math.sin(ang)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.down)){
                sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.left)){
                sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.right)){
                sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }

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

না এটি আমার ব্যবহার করা কোড যা সমস্যার সৃষ্টি করেছে। নীচের মন্তব্য দেখুন। কেউ এটি চেয়েছিলেন।
rphello101

আপনি কোথায় স্প্রাইট.মোভস্পিড গণনা করেন তা আমি দেখতে পাচ্ছি না?
আতুরস্যামস

মুভিস্পিড একটি ধ্রুবক, এই ক্ষেত্রে .3
rphello101

উত্তর:


14

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

//first get the direction the entity is pointed
direction.x = (float) Math.cos(Math.toRadians(rotation));
direction.y = (float) Math.sin(Math.toRadians(rotation));
if (direction.length() > 0) {
    direction = direction.normalise();
}
//Then scale it by the current speed to get the velocity
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;

সুতরাং এখন আপনি আপনার ঘূর্ণনের উপর ভিত্তি করে আপনার বেগটি জানেন। আপনি সেই তথ্য দিয়ে আপনার অবস্থান আপডেট করতে পারেন।

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;

এই (সমস্ত কিছু) অন্তর্ভুক্ত এমন একটি (opড়ু) শ্রেণীর জন্য আপনি এখানে লুডুম
সাহসী

ধন্যবাদ. কয়েকটি পরিবর্তন করার পরে, এটি কাজ করেছিল। আপনার কাছে আমার আরও একটি প্রশ্ন রয়েছে যদিও আপনি এটি পড়েন: স্প্রিটকে পেছনের দিকে সরিয়ে নেওয়া ঠিক - = আপনার এখানে যা আছে তার চেয়ে ঠিক = আমি কীভাবে এটিকে বাম বা ডানদিকে সরানো করব?
rphello101

@ rphello101 ভাল প্রশ্ন, আপনার একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত। আরও বেশি লোক উপকৃত হবেন এবং আমার কাছে থাকা উত্তরটির চেয়ে আপনি আরও ভাল উত্তর পেতে পারেন।
মাইকেলহাউস

3

আপনি মাউস অবস্থান পেতে

mouseX = ... 
mouseY = ...

আপনি স্প্রাইট অবস্থান পান

spriteX = ...
spriteY = ...

আপনি কোণ খুঁজে

angle = Math.atan2(mouseY - spriteY, mouseX - spriteX);

আপনার আন্দোলন হবে:

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;

টিপ হিসাবে: কোস জন্য একটি টেবিল (অ্যারে) তৈরি করুন এবং প্রাক-গণিত মান সহ পাপ করুন। সুতরাং আপনি কেবল কাস্টবেবল [(অন্তর্নিহিত কোণ]] * গতি * সময় এবং সিনট্যাবল [(ইনট) কোণ] * গতি * সময় এটি সঠিক হিসাবে করতে পারেন না। তবে আপনি আপনার মানগুলি দ্রুত পান।
সিডার

এটি স্প্রাইটটি মাউসের দিকে নিয়ে যাবে, তবে স্প্রাইটটি যে দিকের মুখোমুখি হচ্ছে সেভাবে এটি একই নয়। ঘূর্ণন গতি ক্যাপ করা থাকে বা অন্য কোনও কারণে যদি স্প্রাইটটি এখনও মাউসের মুখোমুখি হতে পারে। মূলত, আপনি ভুল প্রশ্নের উত্তর দিচ্ছেন।
MichaelHouse

@ বাইট 56 তিনি বলেছিলেন "যখন আমি" ফরোয়ার্ডগুলি "আঘাত করি তখন স্প্রাইটটি প্রয়োজনীয়ভাবে মাউসের দিকে অগ্রসর হয় না" আমি মনে করি এটি সে সম্পর্কে জিজ্ঞাসা করেছিল। আপনি যদিও সঠিক হতে পারে।
আতুরস্যামস

এটি নিশ্চিতভাবে একধরনের অস্পষ্টতা। আমি কেবল এই ক্ষেত্রে প্রশ্নের শিরোনামে খেলাপি হয়েছি। আমাকে ভুল করবেন না, আপনার উত্তর ভাল। আমি অনুমান করি যে ওপি যখন / তারা ফিরে আসে তখন আমরা কী চাইতাম find
MichaelHouse

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