असल में, मेरे पास एक स्क्रीन है जहां मेरे पास एक चरित्र और एक बटन है। जब मैं स्क्रीन को छूता हूं तो चरित्र उछलता है (Gdx.input.justTouched का उपयोग करके कार्यान्वित)। बटन क्लिक करने पर पॉज़मेनू खोलता है (बटन एक मंच का एक अभिनेता है और बटन का उपयोग करके क्लिक लागू किया जाता है। एड लिस्टनर (नया चेंजलिस्टर() {...})। मेरा इनपुट प्रोसेसर मंच पर सेट है

Gdx.input.setInputProcessor(stage);

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

किसी भी सलाह के लिए धन्यवाद!

0
Enver Umerov 19 सितंबर 2018, 22:10

1 उत्तर

सबसे बढ़िया उत्तर

आप InputMultiplexer का उपयोग कर सकते हैं।

सबसे पहले InputMultiplexer कैसे काम करता है।
InputMultiplexer में आप कई InputProcessor कर सकते हैं और एक InputProcessor में ऐसी विधियां हैं जो बूलियन लौटाती हैं।
यह बूलियन मान बताता है कि ईवेंट को हैंडल किया गया था या नहीं।
इसलिए यदि विधि झूठी लौटती है, तो InputMultiplexer ईवेंट को अगले InputProcessor को दे देता है।
यदि विधि सही हो जाती है तो ईवेंट को हैंडल किया गया और ईवेंट अगले InputProcessor पर नहीं जाएगा।

अब हम इस मामले में अपनी स्क्रीन के लिए एक InputProcessor बनाते हैं TestScreenInput:

public class TestScreenInput implements InputProcessor {

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        System.out.println("Touch down");
        character.jump();
        return true;
    }

    @Override
    ... //all other methods from InputProcessor
}

touchDown विधि सही है, इसलिए अगले इनपुटप्रोसेसर को touchDown ईवेंट प्राप्त नहीं होगा

हमारी स्क्रीन क्लास (टेस्टस्क्रीन) में हम अपना Stage बनाते हैं:

public class TestScreen implements Screen {
    private Stage stage;

    @Override
    public void show() {
        stage = new Stage();
    }
}

अब हम एक ChangeListener के साथ अपना TextButton बनाएंगे।
समस्या यह है कि हम कैसे कह सकते हैं कि घटना को संभाला गया है?
ChangeListener::changed(ChangeEvent event, Actor actor) बूलियन नहीं लौटाता।

जब हम Stage कक्षा में देखते हैं तो हम touchDown विधि ढूंढ सकते हैं और विधि वापस आती है:

boolean handled = event.isHandled();
return handled;

event Event का एक प्रकार है और ChangeEvent का विस्तार Event
हमारी changed(ChangeEvent event, Actor actor) पद्धति में हमारे पास एक ChangeEvent है। तो हमें बस इतना करना है कि इस इवेंट को हैंडल करना है।
Event में एक विधि है:

public void handle () { handled = true;}

अब हम अपना बटन बनाने के लिए सब कुछ जानते हैं:

TextButton button = new TextButton("Click", skin);
button.addListener(new ChangeListener() {
    @Override
    public void changed(ChangeEvent event, Actor actor) {
        System.out.println("Click Button");
        event.handle(); //set the event handled = true
    }
});

stage.addActor(button);

अंत में, हम अपना InputMultiplexer बनाते हैं। महत्वपूर्ण यह है कि चरण हमारे TestScreenInput से पहले आता है क्योंकि TestScreenInput touchDown को हैंडल के रूप में चिह्नित करेगा और stage उन्हें कभी प्राप्त नहीं करेगा।

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(stage);
multiplexer.addProcessor(new TestScreenInput());
Gdx.input.setInputProcessor(multiplexer);
1
Morchul 30 मई 2020, 01:10