मैं उस दिशा में स्प्राइट को कैसे स्थानांतरित कर सकता हूं?


11

मैं Java / Slick 2D का उपयोग कर रहा हूं। मैं माउस का उपयोग करने के लिए स्प्राइट और तीर कुंजी को घुमाने के लिए घुमाता हूं। मैं स्प्राइट को बिना किसी समस्या के घुमाने के लिए प्राप्त कर सकता हूं, लेकिन मैं इसे उस दिशा में नहीं ले जा सकता जहां इसे माना जाता है। जब मैं "फॉरवर्ड" मारता हूं, तो स्प्राइट आवश्यक रूप से माउस की ओर नहीं बढ़ता है। वास्तव में, यह केवल स्क्रीन के बाईं ओर बढ़ेगा। मुझे यकीन है कि इसके लिए कुछ मानक कोड होना चाहिए क्योंकि कई गेम इस गति की शैली का उपयोग करते हैं। क्या कोई मेरी मदद कर सकता है कि ट्रिगर क्या माना जाता है? धन्यवाद

संपादित करें: यहाँ रोटेशन कोड है (जो कुछ और अजीब करता है: /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;
            }

आपके द्वारा जोड़े गए कोड का क्या मतलब है? क्या यह एक नई समस्या है? यदि यह एक नई समस्या है, तो कृपया एक नया प्रश्न खोलें। कृपया केवल इस प्रश्न को अपडेट करें कि स्प्राइट को उस दिशा में ले जाने से संबंधित जानकारी जो उसका सामना कर रहा है।
MichaelHouse

नहीं, यह वह कोड है जिसका मैंने इस्तेमाल किया जिससे समस्या पैदा हुई। नीचे टिप्पणी देखें। किसी ने मांगा।
rphello101

मैं यह नहीं देखता कि आप स्प्राइट.movespeed की गणना कहाँ करते हैं?
AturSams

Movespeed एक स्थिरांक है, इस मामले में .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;

एक स्लॉपी (मैला) वर्ग के लिए जिसमें यह सब होता है, आप एक लुडम डेयर 21 प्रविष्टि देख सकते हैं, जो मैंने यहां एक साथ रखी है: bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/…
माइकलहॉउस

धन्यवाद। कुछ संशोधनों के बाद, इसने काम किया। मेरे पास आपके लिए एक और प्रश्न है, हालांकि अगर आप इसे पढ़ते हैं: पीछे की ओर जाने के लिए स्प्राइट प्राप्त करना आपके लिए यहाँ है - = हालांकि मैं इसे बाएं या दाएं कैसे घुमाऊं?
rphello101

@ rphello101 अच्छा सवाल, आपको एक नया सवाल पूछना चाहिए। अधिक लोगों को लाभ होगा और आपके पास मेरे पास से बेहतर जवाब मिल सकता है।
MichaelHouse

3

आप माउस की स्थिति प्राप्त करें

mouseX = ... 
mouseY = ...

आपको स्प्राइट पोजीशन मिलती है

spriteX = ...
spriteY = ...

आप कोण ढूंढिए

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

आपका आंदोलन होगा:

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

एक टिप के रूप में: पूर्व-गणना मूल्यों के साथ कॉस और पाप के लिए एक तालिका (सरणी) बनाएं। तो आप बस cosTable [(int) कोण] * गति * समय और sinTable [(int) कोण] * गति * समय कर सकते हैं यह उतना सटीक नहीं है। लेकिन आप अपने मूल्यों को तेजी से प्राप्त करते हैं।
सिदार

यह स्प्राइट को माउस की ओर ले जाएगा, लेकिन यह उस दिशा के समान नहीं है जैसा कि स्प्राइट का सामना कर रहा है। स्प्राइट अभी भी माउस का सामना कर सकता है यदि यह रोटेशन की गति छाया हुआ है या किसी अन्य कारण से है। मूल रूप से, आप गलत प्रश्न का उत्तर दे रहे हैं।
MichaelHouse

@ Byte56 उन्होंने कहा "जब मैंने" आगे की ओर मारा ", प्रेत जरूरी नहीं कि माउस की ओर बढ़े" मुझे लगता है कि वह वही है जिसके बारे में मैंने पूछा है। हालांकि आप सही हो सकते हैं।
AturSams

यह सुनिश्चित करने के लिए अस्पष्ट है। मैं इस मामले में सवाल के शीर्षक के लिए बस चूक गया। मुझे गलत मत समझिए, आपका जवाब अच्छा है। मुझे लगता है कि हम यह पता लगाएंगे कि ओपी कब / क्या चाहते थे।
MichaelHouse

2
@Sidar यह समयपूर्व अनुकूलन होगा। पाप / कॉस ऑपरेशन को अड़चन के रूप में पहचाने बिना सिन / कॉस टेबल का निर्माण समय की बर्बादी है।
bummzack
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.