LibGdx - स्प्राइट एक लाइन पथ का पालन करें - जावा, ग्राफिक्स, libgdx

मेरे पास एक आइसोमेट्रिक नक्शा खींचा गया है।

मैं अपने स्प्राइट की वर्तमान स्थिति लेता हूं और लक्ष्य के बाद मेरा स्प्राइट होना चाहिए:

    // region is my TextureRegion.
int x1 = getIsometricX(1,1,region);
int x2 = getIsometricX(1,2,region);

int y1= getIsometricY(1,1,region);
int y2 = getIsometricY(1,2,region);

और फिर मैं एक साधारण लाइन का उपयोग कर खींचता हूं ShapeRenderer यह देखने के लिए कि क्या स्थानीय / लक्ष्य बिंदु सही तरीके से सेट हैं, और आयताकार ताकि आप देख सकें कि स्प्राइट प्रतिपादन कहां से शुरू होता है।

    renderer.setProjectionMatrix(camera.combined);
renderer.begin(ShapeRenderer.ShapeType.Line);
renderer.setColor(Color.RED);
renderer.line(x1 + location.getOffsetx(), y1 + location.getOffsety(), x2 + location.getOffsetx(), y2 + location.getOffsety());
renderer.rect(x1 + location.getOffsetx(), y1 + location.getOffsety(), region.getRegionWidth(), region.getRegionHeight());
renderer.end();

मेरे प्रत्येक स्प्राइट ने ऑफसेट एक्स और ऑफसेट वाई को आइसोमेट्रिक टाइल पर अपना स्थान समायोजित करने के लिए सेट किया है, क्योंकि प्रत्येक स्प्राइट अलग होता है।

आउटपुट इस तरह दिखता है:

img

आप यहां क्या देख सकते हैं, यह प्रारंभिक बिंदु है जहां स्प्राइट आकर्षित करना शुरू होता है (आप देखते हैं कि ऑफ़सेट इसे समायोजित करते हैं ताकि स्प्राइट इसके जैसा दिखता हो 1,1 टाइल।

और आप उस रेखा को देख सकते हैं जो स्प्राइट के प्रारंभिक ड्रॉ पॉइंट पर शुरू होता है, और स्प्राइट के लक्ष्य ड्रॉ पॉइंट पर समाप्त होता है।

अब मेरा सवाल यह है कि, मैं उस रेखा के पथ पर उस स्प्राइट कदम को कैसे बना सकता हूं, तो ऐसा लगता है कि जहाज आगे बढ़ रहा है?

तो सवाल की मुख्य अवधारणा है.. आप स्थानीय बिंदु से लक्ष्य बिंदु तक, सीधी रेखा में एक स्प्राइट कदम कैसे बना सकते हैं?

कुछ फ़ंक्शंस जिन्हें आपको देखने की आवश्यकता हो सकती है:

public int getIsometricX(int x, int y, TextureRegion region) {
return (x * GameTile.TILE_WIDTH / 2) - (y * GameTile.TILE_WIDTH / 2) - (region.getRegionWidth() / 2);
}

public int getIsometricY(int x, int y, TextureRegion region) {
return (x * GameTile.TILE_HEIGHT / 2) + (y * GameTile.TILE_HEIGHT / 2) - (region.getRegionHeight() / 2);
}

टाइल्स को उसी विधि का उपयोग करके खींचा जाता है, बस टाइल के बनावट के साथ।

उत्तर:

उत्तर № 1 के लिए 1

मैं खुद को इस सवाल का जवाब देना चाहूंगा, क्योंकि अन्य लोगों के पास एक ही समस्या हो सकती है और यह मेरे जैसे ही जटिल हो सकती है।

यदि आप अपने आइसोमेट्रिक मानचित्र पर कोई भी कदम करना चाहते हैं, तो मेरी गलतफहमी का पालन न करें और इसे आइसोमेट्रिक निर्देशांक पर गणना करें।

आपको इसे अपने फ्लैट स्क्रीन मैट्रिक्स निर्देशांक पर गणना करना होगा, और फिर इसे आइसोमेट्रिक निर्देशांक में परिवर्तित करना होगा।

उदाहरण के लिए, मैं इस लाइन की तरह आगे बढ़ना चाहता हूं, मुझे बस इतना करना है:

ship.y += 0.1f // when it reaches 1, then it will be at 0, 1

तो आप जानते हैं कि आप रहना चाहते हैं 0,1 आपके गैर-आइसोमेट्रिक मानचित्र पर।

तो आप इस वृद्धि को करते हैं, और फिर आखिरकार, आपको ड्राइंग से पहले इसे सममित समरूप में परिवर्तित करना होगा:

float x = (ship.x * GameTile.TILE_WIDTH / 2) - (ship.y * GameTile.TILE_WIDTH / 2) - (textyure.getWidth() / 2);

float y = (ship.x * GameTile.TILE_HEIGHT / 2) + (ship.y * GameTile.TILE_HEIGHT / 2) - (texture.getHeight() / 2);

और यह आपके स्क्रीन-निर्देशांक की तरह, लेकिन एक आइसोमेट्रिक प्रारूप पर, आइसोमेट्रिक मानचित्र पर आकर्षित करेगा।


जवाब के लिए 0 № 2
for(float x : new float[targetx - currentx]) {ship.setPosition(ship.getX + x, ship.getY); }

और आप वाई के लिए भी ऐसा ही करेंगे।

संपादित करें:

मुझे लगता है कि यह गलत है क्योंकि आप इसे मानते हुए हर फ्रेम को बुला रहे हैं।

इसके बजाय आप लक्ष्य और जहाज के बीच यात्रा की अपनी दूरी का ट्रैक रखेंगे और जब तक यह दूरी तक नहीं पहुंच जाता तब तक आप प्रत्येक बार 1 और 1 तक एसआईपी स्थिति बढ़ाएंगे।


सबसे लोकप्रिय