V souvislosti s přepisem hry Sheeps Go Home do Kotlinu bych se chtěl podělit o to, jakým způsobem jsem si zkrášlil kód při práci s LibGDX tak, aby se to dalo používat trochu lidsky 🙂 . LibGDX je supr knihovna na vývoj (především) 2D her, ale co se jejích UI prvků týče, práce s nimi mi nepřišla úplně košér. Podívejme se např. na triviální klik na tlačítko. Původní kód v Javě vypadal např. takto:
buttonLeaderboard.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { ((Game) Gdx.app.getApplicationListener()).setScreen(new LeaderboardScreen()); } });
Kde ClickListener není interface, ale třída. Sice nechápu proč, ale kvůli toho nemůžu použít ani klasickou lambdu. Jak bych si osobně představoval (a teď přejděme do Kotlinu), že by měl tento kód vypadat? Jako docela lidský způsob volání mi přijde např. tento:
buttonLeaderboard.onClick { //code goes here ... }
Můžu něčeho takového docílit? Samozřejmě, že můžu, stačí si TextButtonu trošku rozšířit:
fun TextButton.onClick(action: () -> Unit) = addListener(object : ClickListener() { override fun clicked(event: InputEvent?, x: Float, y: Float) { action() } })
A nyní pro každé textové tlačítko, u kterého budu chtít definovat akci po kliku, bude tento úkol jako procházka růžovým sadem 🙂 .