Pomocí dotykového displeje pro ovládání herní

hlasů
8

Já pracuji na svém prvním videohry pro platformu Android jako trochu v noci ao víkendech projektu.

To přichází spolu hezky, ale já jsem velmi spokojen s kontrolním sensativity.

V této hře se budete pohybovat objekt vlevo a vpravo na obrazovce. V dolní části obrazovky je „touchpad“ svého druhu, což je místo, kde prst by měl odpočívat.

/-------------------------\
|                         |
|                         |
|                         |
|       Game Area         |
|                         |
|                         |
|                         |
|                         |
|                         |
/-------------------------\
|                         |
|       Touch Area        |
|                         |
\-------------------------/

V současné době jsem pomocí stavovou proměnnou držet „MOVING_LEFT, MOVING_RIGHT, NOT_MOVING“ a já se aktualizuje umístění objektu hráče každého snímku na základě této proměnné.

Nicméně, můj kód, který čte vstup dotykový displej a nastaví tento stav proměnná je buď příliš sensative, nebo příliš laggy, v závislosti na tom, jak se mi to vyladit:

public void doTouch (MotionEvent e) {
    int action = e.getAction();

    if (action == MotionEvent.ACTION_DOWN) {
        this.mTouchX = (int)e.getX();
        this.mTouchY = (int)e.getY();           
    } 
    else if (action == MotionEvent.ACTION_MOVE) {
        if ((int)e.getX() >= this.mTouchX) {
            this.mTouchX = (int)e.getX();
            this.mTouchY = (int)e.getY();   
            if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {              
                this.mTouchDirection = MOVING_RIGHT;
            }
        } 
        else if ((int)e.getX() <= this.mTouchX) {
            this.mTouchX = (int)e.getX();
            this.mTouchY = (int)e.getY();
            if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {              
                this.mTouchDirection = MOVING_LEFT;
            }
        }
        else {
            this.mTouchDirection = NOT_MOVING;
        }               
    } 
    else if (action == MotionEvent.ACTION_UP) {
        this.mTouchDirection = NOT_MOVING;
    }       
}

Myšlenka je, že pokud existuje nějaký pohyb, jsem zkontrolovat předchozí umístění prstu uživatele a pak přijít na to, jakým směrem se pohybovat hráče.

To nefunguje dobře, jsem přijít existují iPhone / Android vývojáři na tu, kteří zjistili, jak dělat dobré ovládání pomocí dotykového displeje a může dát nějakou radu.

Položena 15/03/2009 v 03:05
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Jedním ze zřejmých Problém je v tom, že nikde berete v úvahu čas od posledního kontaktu.

Navrhoval bych vám léčit hráči dotýkat jako vyjádření požadovaného pohybu na analogovém rozsahu -x/+xa -y/+ypak provést skutečný pohyb jinde na základě času.

Např

objectPos += objectPos + (joyPos * timeDelta * maxSpeed);

Takže pokud maximální rychlosti vašeho objektu je 10 ms-1 a hráči prst na 0,5 na ovládacím panelu pak objekt bude pohybující 5 metrů za sekundu. Pokud je vaše hra běží na 10 snímků za sekundu a pak každý snímek objekt by se pohybovala 0,5 metrů.

Tyto údaje jsou fiktivní, ale doufejme, že ukazují, že je třeba oddělit řízení z pohybu a pak faktor v čase.

Odpovězeno 15/03/2009 v 03:39
zdroj uživatelem

hlasů
2

Mohli byste zkusit něco podobného „táhnout obdélníky“ na Windows. Když budete držet stisknuté tlačítko myši na něco, nechcete zahájit operaci tažení, dokud myši pohybuje mimo malé oblasti kolem myši dolů místě. Důvodem je, že je velmi těžké udržet kurzor na stejný pixel při kliknutí.

Takže první pokus by mohl být (int)e.getX() >= this.mTouchX + DEAD_ZONEi podobné druhém případě, kde DEAD_ZONEje malé celé číslo.

To se nezabývá otočil v témže úderu, nicméně. Dalo by se s tím vypořádat pouze o odbočka vlevo, když je aktuální poloha je alespoň DEAD_ZONEpixelů nalevo od posledního místa po odbočka vpravo, a vice versa.

Odpovězeno 15/03/2009 v 03:24
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more