XNA – Tvorba menu v Xna
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

XNA – Tvorba menu v XnaXNA – Tvorba menu v Xna

 

XNA – Tvorba menu v Xna

Google       Google       17. 12. 2008       19 112×

V tomto článku sa naučíme, ako vytvoriť triedu Menu, ktorá môže byť rýchlo a ľahko presunutá aj do iného programu v XNA. Navyše je veľmi jednoduché prispôsobiť túto triedu, keď už je raz hotová.

Reklama
Reklama

Toto je rovnaké menu, aké vytvoril Dane Anderson vo svojej XNA hry “Box Wars”. Tu je odkaz na video, ak chcete vidieť toto menu v akcii. V hre menu vyzerá rozmazane, lebo bol použitý bloom efekt. Takže už máte nejaké extra informácie o menu, ktoré budete vytvárať v tomto článku. Pustime sa teda do tvorenia triedy s názvom “Menu”, ktorú môžete veľmi jednoducho začleniť do vašej hry. Po vytvorení novej triedy vo vašom projekte by ste mali dostať kód podobný nasledujúcemu:

using System;
using System.Collections.Generic;
using System.Text;

namespace Box_Wars
{
    class Menu
    {
    }
}

Pred tým, než začneme písať kód, pridajme tieto riadky k našim using príkazom:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

Teraz môžeme začať s písaním kódu pre našu triedu. Najprv pridajme tieto premenné:

private static int MAX = 20;
private int menuItemCount;
private int curMenuItem;
private string[] menuItems;
private Vector2[] pos;
private double[] scale;
private Color unselected;
private Color selected;
private SpriteFont font;

MAX
maximálny počet prvkov povolených v tomto menu. Môžete ho zmeniť na ľubovoľnú hodnotu, ale pochybujem, že vaša hra bude niekedy mať viac ako 20 prvkov v jednom menu.
menuItemCount
celkový počet prvkov menu.
curMenuItem
index práve označeného prvku menu.
menuItems
pole, ktoré obsahuje všetky texty prvkov poľa.
pos
pole obsahujúce pozície každého prvku menu.
scale
pole obsahujúce hodnotu zväčšenia každého prvku menu.
unselected
farba neoznačeného prvku menu.
selected
farba označeného prvku menu.
font
SpriteFont, ktorý bude použitý na vypisovanie textu v menu.

Potom, čo ste pridali všetky premenné pre túto triedu, môžete pridať aj konštruktor:

public Menu(Color unslectedColor, Color selectedColor, SpriteFont sp)
{
    font = sp;
    menuItems = new string[MAX];
    pos = new Vector2[MAX];
    scale = new double[MAX];
    unselected = unslectedColor;
    selected = selectedColor;
    menuItemCount = 0;
    curMenuItem = 0;
}

Ďalej môžeme pridať funkciu, ktorá vám umožní jednoducho pridať prvky do vášho menu:

public void addMenuItem(string name, Vector2 p)
{
    if (menuItemCount < MAX)
    {
        menuItems[menuItemCount] = name;
        scale[menuItemCount] = 1.0f;
        pos[menuItemCount++] = p;
    }
}

Teraz pridajme možnosť pre jednoduché označenie nasledujúceho alebo predchádzajúceho prvku menu. Kód umožní užívateľovi označovať prvky menu dookola. To znamená, že ak sú naspodku zoznamu a stlačia tlačidlo pre ďalší prvok, prenesie ich to na začiatok. To spravíme týmito dvoma funkciami:

public void selectNext()
{
    if (curMenuItem < menuItemCount-1)
        curMenuItem++;
    else
        curMenuItem = 0;
}

public void selectPrev()
{
    if (curMenuItem > 0)
        curMenuItem--;
    else
        curMenuItem = menuItemCount-1;
}

Potom pridajme tieto prístupové metódy, ktoré vrátia index práve označeného prvku a jeho index:

public int getSelectedNum()
{
    return curMenuItem;
}

public string getSelectedName()
{
    return menuItems[curMenuItem];
}

Keď už toto máme hotové, je čas pridať posledné dve metódy našej triedy, Draw a Update. Metóda Update bude vyzerať takto:

public void Update(GameTime gameTime)
{
    for (int x = 0; x < menuItemCount; x++)
    {
        if (x == curMenuItem)
        {
            if (scale[x] < 2.0f)
                scale[x] += 0.04 + 10.0f * gameTime.ElapsedGameTime.Seconds;
        }
        else if (scale[x] > 1.0f && x!=curMenuItem)
            scale[x] -= 0.04 + 10.0f * gameTime.ElapsedGameTime.Seconds;
    }
}

V metóde Update prejdeme v cykle všetky prvky menu a pridáme efekty zväčšovania a zmenšovania sa na základe toho, či je prvok označený alebo nie. Toto je miesto, ktoré budete chcieť upraviť, keď budete chcieť pridať iné efekty.

Teraz môžete pridať metódu Draw:

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Begin();
    for (int x = 0; x < menuItemCount; x++)
    {
        if (x == curMenuItem)
        {
            Vector2 p = pos[x];
            p.X -= (float)(22 * scale[x] / 2);
            p.Y -= (float)(22 * scale[x] / 2);
            spriteBatch.DrawString(font,
                                   menuItems[x],
                                   p,
                                   selected,
                                   0.0f,
                                   new Vector2(0, 0),
                                   (float)scale[x],
                                   SpriteEffects.None,
                                   0);
        }
        else
        {
            Vector2 p = pos[x];
            p.X -= (float)(22 * scale[x] / 2);
            p.Y -= (float)(22 * scale[x] / 2);
            spriteBatch.DrawString(font,
                                   menuItems[x],
                                   p,
                                   unselected,
                                   0.0f,
                                   new Vector2(0, 0),
                                   (float)scale[x],
                                   SpriteEffects.None,
                                   0);
        }
    }

    spriteBatch.End();
}

Metóda Draw prispôsobuje vykresľovanie na základe veľkosti písma a jeho zväčšenia. Nakoniec máme kompletnú triedu Menu.

K tomuto článku je k dispozícii na stiahnutie zdrojový súbor a príkladový projekt.

Zdroj: http://www.ziggyware.com/readarticle.php?article_id=188

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Autor programuje v Jave už 4 roky a podieľal sa niekoľkých opensource projektoch. Ovláda značnú časť Java SE, z EE trochu JSP a servlety a nedávno sa začal zaoberať ME. Ďalej ovláda C#, (X)HTML, JavaScript, PHP, SQL a trochu Pascal, Delphi, C, C++.

Nové články

Obrázek ke článku NEWTON Media prohledá 200  milionů mediálních zpráv během sekund díky Cisco UCS

NEWTON Media prohledá 200 milionů mediálních zpráv během sekund díky Cisco UCS

Česká společnost NEWTON Media provozuje největší archiv mediálních zpráv ve střední a východní Evropě. Mezi její zákazníky patří například ministerstva, evropské instituce nebo komerční firmy z nejrůznějších oborů. NEWTON Media rozesílá svým zákazníkům každý den monitoring médií podle nastavených klíčových slov a nabízí online službu, kde lze vyhledat mediální výstupy v plném znění od roku 1996.

Reklama
Reklama
Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý