আমি কীভাবে লিবিজিডিএক্সে একটি অন-স্ক্রিন এইচইউডি করব?


23

আমি libgdx এ নতুন, এবং আমি খুঁজে পাচ্ছি যে আমি সহজতম জিনিসগুলির দ্বারা স্তব্ধ হয়ে যাচ্ছি। দেখে মনে হচ্ছে যে আমি জিনিসগুলি একটি নির্দিষ্ট উপায়ে করতে চাইছি, তবে ডকুমেন্টেশনটি সেগুলি আমাকে বলে না।

আমি একটি খুব সাধারণ 2 ডি গেম তৈরি করতে চাই যাতে খেলোয়াড় কোনও স্পেসশিপ নিয়ন্ত্রণ করে। মাউস হুইলটি জুম ইন এবং আউট করবে এবং তথ্য এবং নিয়ন্ত্রণগুলি স্ক্রিনে প্রদর্শিত হবে।

তবে আমি মাউস হুইলটি ইউআইটি জুম করে ফেলব বলে মনে হচ্ছে না। আমি মাঝখানে প্রোজেকশন ম্যাট্রিক্সের সাথে ফিউজিংয়ের চেষ্টা করেছি

এখানে আমার (বর্তমান) কোডটি রয়েছে:

public class PlayStage extends Stage {
...
    public void draw() {
    // tell the camera to update its matrices.
    camera.update();

    // tell the SpriteBatch to render in the
    // coordinate system specified by the camera.
    spriteBatch.setProjectionMatrix(camera.combined);

    spriteBatch.begin();

    aButton.draw(spriteBatch, 1F);

    playerShip.draw(spriteBatch, 1F);

    spriteBatch.end();
}
}

ক্যামেরা.জুম স্ক্রোলড (ইনট পরিমাণ) দ্বারা সেট করা হয়েছে।

আমি বোতামটি আঁকার পরে ক্যামেরাটির প্রজেকশন ম্যাট্রিক্স পরিবর্তন করার থিমটিতে প্রায় এক ডজন প্রকরণের চেষ্টা করেছি, জাহাজটি আসার আগে, তবে আমি কী করি তা নয়, বোতাম এবং জাহাজ উভয়ের ক্ষেত্রে একই জিনিস ঘটে। তাই:

অন-স্ক্রিন ইউআই বাস্তবায়নের স্বাভাবিক লিবিজিডিএক্স উপায় কী যা ক্যামেরার প্রজেকশন ম্যাট্রিক্স / জুম দ্বারা রূপান্তরিত হয় না?


আপনি camera.project(Vector3 screenCoords)বিশ্বের স্থানাঙ্ক থেকে স্ক্রিন কর্ডগুলিতে কিছু প্রজেক্ট করতে ব্যবহার করতে পারেন ।
জেডিএসওয়েটবিট

উত্তর:


17

আপনি এইচইউডি আঁকার জন্য প্রজেকশন ম্যাট্রিক্স সেট না করেই অন্য একটি স্প্রিটব্যাচ ব্যবহার করতে পারেন,

camera.update();
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.begin();
aButton.draw(spriteBatch, 1F);
playerShip.draw(spriteBatch, 1F);
spriteBatch.end();

hudBatch.begin();
//Draw using hudBatch
hudBatch.end();

1
আমি যা করছিলাম তার জন্য, আমি এটি পেয়েছি সহজ পদ্ধিতি হিসাবে, বেসিক ইউআই যা সর্বদা পর্দার একই জায়গায় উপস্থিত হওয়া উচিত (যেমন স্কোর, জীবন ইত্যাদি)
রিচার্ড

প্রজেকশন ম্যাট্রিক্স ছাড়াই স্প্রিটব্যাচ থাকার কারণে যখন আমি এটি চেষ্টা করেছি তখন বিভিন্ন পর্দার রেজোলিউশনে বিভিন্ন অবস্থানের দিকে নিয়ে যায়
কোডুলিকে

8

আমি মনে করি একটি হুড মানচিত্র সম্পাদন করার সবচেয়ে সহজ উপায় হ'ল দ্বিতীয় ক্যামেরা ব্যবহার এবং সেগুলি ওভারলে করা। এই ইস্যুটি libgdx ফোরামে কিছুক্ষণ আগে আলোচনা করা হয়েছে এবং আমি মনে করি সেখানে কেউ তাদের হড কোড পোস্ট করেছে ing আপনি সেখানে প্রায় কোথাও ঝাঁকুনি দেখতে পারেন এবং আপনি কী নিয়ে এসেছেন তা দেখতে চাইতে পারেন।


2
হ্যাঁ, এটি সঠিক উত্তর। বা হুডের জন্য আলাদা স্টেজ ব্যবহার করুন এবং গেম স্টাফের পরে এটি আঁকুন।
ম্যাটসেম্যান

3
ধন্যবাদ. আমি উভয় চেষ্টা করব। আমি বুঝতে পারি নি যে স্ক্রিনে একাধিক স্টেজ বা ক্যামেরা রাখা সাধারণ অনুশীলন।
ডেভিন কারলেস

4
আপনি কি দয়া করে কিছু নমুনা কোড যুক্ত করতে পারেন, বা সম্ভবত @ ডেভিনিয়ারলেস?
ashes999

6

একটি একক ব্যাচের সাথে কাজ করার জন্য আমি এখানে একটি পদ্ধতি ব্যবহার করছি:

প্রথমে অন্য সব কিছু আঁকুন, তারপরে আপনার এইচইডি সর্বশেষ আঁকুন:

Matrix4 uiMatrix = cam.combined.cpy();
uiMatrix.setToOrtho2D(0, 0, WIDTH, HEIGHT);
batch.setProjectionMatrix(uiMatrix);
batch.begin();

আপনি যদি আরও পরে আঁকতে চান তবে নিশ্চিত করুন যে আপনি প্রজেকশন ম্যাট্রিক্স যা যা প্রয়োজন তা পুনরায় সেট করেছেন।


সতর্কতা অবলম্বন করুন যে আপনি খুব দ্রুত মেমরিতে অনেকগুলি ম্যাট্রিক্স শেষ করবেন (কারণ .cpu()প্রতিবার একটি নতুন ম্যাট্রিক্স তৈরি করে)। স্থায়ী বাফার ম্যাট্রিক্স আরও ভাল এবং প্রতিটি ফ্রেম এর মান সেট করে।
ডেনিস নাইয়াজেভ

1

মনে রাখবেন, প্রথম ক্যামেরাটি যেখানে ব্যাকগ্রাউন্ডটি স্থির করা হয়েছে। দ্বিতীয়টি যেখানে স্থলটি সরে যায়। আপনি যদি ভাবছেন তবে স্প্রাইট কেন মঞ্চে চলে। কেননা এটি গোপন স্থল যা চলন্ত। আপনি তৃতীয় ক্যামেরা ব্যবহার করার পরে স্প্রাইটটি ঠিক জায়গায় চলছে। আপনি দ্বিতীয় ক্যামেরার গ্রাউন্ডটি স্ক্রোল করে থাকতে পারেন তবে এইচইউডি এখনও তৃতীয় স্থানে রয়েছে। কথা দাও, সত্য! তৃতীয় ক্যামেরাটি যেখানে এটি স্প্রাইটটি নির্দেশের জন্য কেন্দ্রে প্রদর্শিত হয়, সে সামান্য অ্যানিমেশন কোডের সাহায্যে বামে বা ডানে যায় কিনা, এবং এইচডিডি (অর্থাত, স্কোর, বাকী জীবন, আইটেম ব্যবহৃত হয়)। আপনার যদি কিছু দরকার হয়, আমাকে জিজ্ঞাসা করুন।


আমি কীভাবে দ্বিতীয় ক্যামেরা থেকে স্প্রিটকে আলাদা করতে পারি? আমি যা করতে চাই তা পাঠ্য আঁকাই, তবে এটি বড় to ... সুতরাং আমার অন্য একটি ক্যামেরা প্রয়োজন, তবে যখন আমি এটি করি তখন পাঠ্যটি আমার সাথে যায় the প্লেয়ারের সাথে, আমার পর্দার সাথে ... এটি কিছুটা সরে যায় পর্দার শত্রুর মতো তবে এটি এখনও আমার সাথেই রয়েছে ... আপনি কি দয়া করে পরামর্শ দিতে পারেন?
নিমিট্যাক

1

আমি এটি এইভাবে সম্পন্ন করেছি:

প্রথমে আমি হুদ নামে একটি নতুন ক্লাস তৈরি করেছি। Disposableরিসোর্স ম্যানেজমেন্টের কারণে এটি প্রয়োগ করে । তারপরে আপনাকে Stageআপনার সামগ্রীর জন্য একটি এবং একটি নতুন নির্ধারণ করতে হবে viewportকারণ একটি নতুন ক্যামেরা ব্যবহৃত হবে। আপনাকে একটি নতুন সংজ্ঞা দেওয়া দরকার Tableযা আপনি যুক্ত করতে পারেন Stage। আপনি নিজের কন্টেন্টটি tableযথারীতি যুক্ত করতে পারেন। কোডটি বাকীভাবে দেখায় এটি কীভাবে কাজ করে তা গেমের জন্য নির্দিষ্ট কী তা কেবল এটিকে এড়িয়ে যান।

public class Hud implements Disposable{

public Stage stage;
private Viewport viewport;

//score && time tracking variables
private Integer worldTimer;
private float timeCount;
private static Integer score;
private boolean timeUp;

//Scene2D Widgets
private Label countdownLabel, timeLabel, linkLabel;
private static Label scoreLabel;

public Hud (SpriteBatch sb){
    //define tracking variables
    worldTimer = 250;
    timeCount = 0;
    score = 0;

    //setup the HUD viewport using a new camera seperate from gamecam
    //define stage using that viewport and games spritebatch
    viewport = new FitViewport(GetTheTriforce.V_WIDTH, GetTheTriforce.V_HEIGHT, new OrthographicCamera());
    stage = new Stage(viewport, sb);

    //define labels using the String, and a Label style consisting of a font and color
    countdownLabel = new Label(String.format("%03d", worldTimer), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    scoreLabel =new Label(String.format("%06d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    timeLabel = new Label("LEFTOVER TIME", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
    linkLabel = new Label("POINTS", new Label.LabelStyle(new BitmapFont(), Color.WHITE));

    //define a table used to organize hud's labels
    Table table = new Table();
    table.top();
    table.setFillParent(true);

    //add labels to table, padding the top, and giving them all equal width with expandX
    table.add(linkLabel).expandX().padTop(10);
    table.add(timeLabel).expandX().padTop(10);
    table.row();
    table.add(scoreLabel).expandX();
    table.add(countdownLabel).expandX();

    //add table to the stage
    stage.addActor(table);

}

public void update(float dt){
    timeCount += dt;
    if(timeCount >= 1){
        if (worldTimer > 0) {
            worldTimer--;
        } else {
            timeUp = true;
        }
        countdownLabel.setText(String.format("%03d", worldTimer));
        timeCount = 0;
    }
}

public static void addScore(int value){
    score += value;
    scoreLabel.setText(String.format("%06d", score));
}

@Override
public void dispose() { stage.dispose(); }

public boolean isTimeUp() { return timeUp; }


public static Label getScoreLabel() {
    return scoreLabel;
}

public static Integer getScore() {
    return score;
}

}

এবং তারপরে প্লেস্ক্রিনে:

আপনার হুডের রেফারেন্স দেওয়ার জন্য প্রথমে আপনার একটি ভেরিয়েবলের দরকার:

private Hud hud; 

এবং তারপরে কনস্ট্রাক্টরে আপনি আপনার শ্রেণীর একটি নতুন উদাহরণ তৈরি করবেন:

hud= new Hud(); 

আপডেট-পদ্ধতিতে আপনাকে কোডের এই লাইনগুলি তৈরি করতে হবে যেহেতু আমার মনে হয় আপনি কিছু গেমের তথ্য যেমন পয়েন্ট বা বাকী জীবনগুলি প্রদর্শন করতে চান:

hud.update();

রেন্ডার পদ্ধতিতে এটি করুন:

//Set batch to now draw what the Hud camera sees.
game.batch.setProjectionMatrix(hud.stage.getCamera().combined);
hud.stage.draw();

এবং শেষে নিষ্পত্তি পদ্ধতিতে আপনার হড নিষ্পত্তি করতে ভুলবেন না

আমি আশা করি এটি সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.