Salto di altezza variabile nei cursori laterali


10

Come posso fare in modo che il giocatore salti più in alto se il tasto di salto viene tenuto premuto più a lungo? Attualmente sto solo riducendo la gravità finché si tiene premuto il tasto e il giocatore salta, ma sembra strano.


forse solo con qualche modifica di quanto riduci la gravità ottieni una migliore azione di salto.
Ali1S232

@Gajet È piuttosto goffo e sembra un modo strano di farlo.
Il comunista Duck il

Hmm stai dicendo che ridurre la gravità non implica che stai usando un motore fisico. È questo il caso? Stai usando Impulses per saltare?
Jonathan Connell,

Non esiste un motore fisico e non sto usando Impulses
John Stimac il

In tal caso, come cade il giocatore? Traducete semplicemente la sua posizione secondo un vettore di gravità movimento * salto *?
Jonathan Connell,

Risposte:


9

Per prima cosa devi decidere come vuoi che sia il salto.

Nella vita reale, l'altezza del salto è decisa nel momento in cui lasci il terreno. Non puoi continuare a saltare più in alto mentre sei già a mezz'aria.

Quindi, se riesci a controllare l'altezza del tuo salto mentre sei già in aria, otterrai una sorta di effetto "jet-pack".

Mi sembra di ricordare un sidescroller che aveva due diverse altezze di salto, penso che fosse uno dei giochi di super mario. Il salto più alto si è verificato quando hai tenuto premuto il pulsante di salto e il salto è stato in realtà un salto in due parti, a partire dal salto normale iniziale, seguito da un secondo impulso che ti ha portato più in alto.

Allora, come vuoi che sia il tuo salto? Che tipo di controllo vuoi che il giocatore abbia sul salto?

Quello che vorrei iniziare è questo:

Lasciare sola la gravità (cioè non cambiarla mai). Quando un giocatore preme il pulsante di salto, applica la forza di salto finché il giocatore sta premendo il pulsante di salto (fino a un certo limite di tempo). Quindi, quando il giocatore rilascia il pulsante di salto, non può applicare di nuovo alcuna forza di salto (cioè non può iniziare di nuovo un salto) fino a quando non tocca prima il terreno, a quel punto i salti vengono riattivati.


L'ho provato e ho ottenuto l'effetto jetpack. Mi chiedevo se ci fosse un modo per evitarlo.
John Stimac,

1
Forse non è il gioco che hai in mente, ma in Super Mario 2 sei saltato più in alto abbassandoti un po 'prima di saltare. (Il che ha un certo senso di senso intuitivo, dal momento che non salti molto lontano se provi a farlo direttamente da una posizione eretta.)
Darien

3
Jcubed: Invece di aggiungere forza alla velocità, prova ad aggiungere la forza direttamente alla posizione. Quindi il giocatore si sposterà linearmente verso l'alto, invece di accelerare verso l'alto.
Olhovsky,

@Jcubed: quando giochi ad alcuni giochi come super meat boy, penso che abbia lo stesso effetto di salto che desideri, sembra che finché tieni premuto il pulsante di salto si applica una forza al personaggio, è opposto alla gravità e più piccolo di esso, e il il riposo è come quello che ha detto alhovsky. se dovessi implementare qualcosa del genere, inizierei con qualcosa come il 60% -80% di gravità come forza di salto.
Ali1S232

1
Lo faccio sempre, mantieni il tempo durante il quale imposti la velocità di salto verso l'alto tenendo premuto il pulsante abbastanza breve da non essere un evidente effetto jet pack - quindi sarà come Super Mario abbastanza facilmente, con un po 'di magia modifiche al numero. Non ridurre la "forza", continua a reimpostare la velocità alla massima velocità di salto fino alla scadenza del JumpHigherTime o al rilascio del pulsante da parte del giocatore ... Inoltre, sento i ragazzi super-carne che saltano per essere imprecisi e fastidiosi, come qualsiasi piattaforma che salta che si basa solo su un motore fisico; p
Oskar Duveborn il

7

Ho visto alcune persone fare questo:

  1. Crea una variabile (la chiamerò jumpTime) (numero / doppio / float). Quando si preme il tasto di salto, impostare un jumpTimecerto numero (cioè 0.5. Questo sarà il numero di secondi che avrà effetto sul mantenimento del tasto di salto).

  2. Quindi, per ogni passaggio, impostare la velocità su jumpTimemoltiplicata per qualche altro numero e diminuire jumpTimedi delta(la differenza di tempo tra ogni passaggio).

  3. Ripeti fino a jumpTimeraggiungere zero o al di sotto, o quando il giocatore rilascia il tasto di salto. Dopo ciò accade, usa la fisica normale (applica un'accelerazione negativa costante fino a quando il giocatore non raggiunge il suolo).

Potrebbe essere necessario utilizzare tentativi ed errori (o "ipotesi logiche") per trovare valori adeguati per questi "alcuni numeri", a meno che non si sappia come farlo.


AGGIORNAMENTO: ho trovato il trucco che rende il salto un po 'più realistico (dato che in origine è lento salire ma poi scendere velocemente). Infinite Mario utilizza anche la seguente riga (293 di Character.js della versione JavaScript) ... this.Ya *= 0.85;Questo è semplicemente come "trascinamento dell'aria" e limita / rallenta la velocità del personaggio quando è a mezz'aria. Quindi ogni frame, moltiplicare il y-velocità (velocità verticale) di un numero inferiore a uno in modo che rallenta quando ridiscendere verso il basso (e quindi sia andando verso l'alto e andando verso il basso durante un salto saranno simili e più realistico). Lo so, sono cattivo a spiegare ...

Quando il personaggio salta usando il metodo che ho descritto in precedenza, "sale" più velocemente e poi "ricade verso il basso". Il trascinamento, tuttavia, rallenta la velocità verticale. Poiché impostiamo la velocità verticale in modo che sia proporzionale a jumpTimeogni fotogramma, questo trascinamento non influisce molto sulla prima metà del salto. Tuttavia nella metà successiva (ricadendo verso il basso), la velocità verticale non viene impostata su ogni fotogramma, ma semplicemente aggiunta da un altro numero (in questo caso è la costante gravitazionale). Pertanto, il trascinamento ha effetto nella caduta e poiché diminuisce la velocità (in qualsiasi direzione), rallenta la caduta, rendendola simile alla prima metà.

Esistono altri modi per risolvere questo problema, come diminuire l'effetto della gravità sul personaggio mentre cade. Tuttavia, dobbiamo scoprire quanto dovremmo ridurre la gravità.


Caso di studio: Mario infinito

Questo è quello che ho trovato (dalla linea 206 di Mario.java di Markus Persson (Notch)):

    if (keys[KEY_JUMP] || (jumpTime < 0 && !onGround && !sliding))
    {
        if (jumpTime < 0)
        {
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            jumpTime++;
        }
        else if (onGround && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = 0;
            yJumpSpeed = -1.9f;
            jumpTime = 7;
            ya = jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;
        }
        else if (sliding && mayJump)
        {
            world.sound.play(Art.samples[Art.SAMPLE_MARIO_JUMP], this, 1, 1, 1);
            xJumpSpeed = -facing * 6.0f;
            yJumpSpeed = -2.0f;
            jumpTime = -6;
            xa = xJumpSpeed;
            ya = -jumpTime * yJumpSpeed;
            onGround = false;
            sliding = false;

            facing = -facing;
        }
        else if (jumpTime > 0)
        {
            xa += xJumpSpeed;
            ya = jumpTime * yJumpSpeed;
            jumpTime--;
        }
    }
    else
    {
        jumpTime = 0;
    }

La versione javascript è sostanzialmente la stessa https://github.com/robertkleffner/mariohtml5/blob/master/code/character.js

Questo è simile al suggerimento di Olhovsky, ma in questo caso la forza sarà proporzionale al tempo trascorso dopo che il giocatore ha premuto il tasto di salto.

La mia versione javascript:

    if ( onGround && jump && !jumped ) {
        jumpTime = maxJumpTime;
        onGround = false;
        jumped = true;
        this.vel.y = jumpTime * jumpConstant;
        A = true;
    } else if ( !onGround && jump && jumpTime > 0 && !released ) {
        jumpTime -= evt.delta;
        this.vel.y = jumpTime * jumpConstant;
        B = true;
    } else if ( !onGround && ( !jump || jumpTime <= 0 ) ) {
        this.vel.y -= gravityConstant * evt.delta;
        jumpTime = 0
        released = true;
    } if ( this.pos.y < 0 && !A && !B ) {
        onGround = true;
        released = false;
        this.pos.y = 0;
        this.vel.y = 0;
    }
    if ( !jump && onGround ) jumped = false;

Tuttavia, alcuni valori per le costanti (ad es. "GravityConstant" e "jumpConstant") daranno comunque un salto non realistico. Ma a volte i giochi non devono essere realistici! ( aggiornamento vedere la sezione di aggiornamento sopra)

Questa domanda ha già più di un anno, ma spero che questo aiuti!


2

Come ha detto Olhovsky, l'altezza del salto viene decisa nel momento in cui lasci il terreno, non dopo.

Se vuoi davvero evitare l'effetto jetpack, vedo solo due modi: una combinazione di tasti per saltare più in alto o cambiare sostanzialmente il modo in cui funziona il tasto di salto:

Invece di far saltare il giocatore non appena si preme il tasto, ritardare il salto fino al rilascio del tasto . Quindi, in sostanza, la durata della pressione del tasto controlla la tensione della molla nelle gambe del giocatore, che viene successivamente rilasciata.

Naturalmente, questo altera fondamentalmente le meccaniche di gioco e potrebbe non avere familiarità con il giocatore. Ma l'effetto potrebbe essere piuttosto interessante e potrebbe valere la pena di familiarità.


2
Penso di ricordare di aver giocato a un platform con esattamente quel meccanico: non lasciare il terreno fino a quando non hai "caricato" il salto. Con alcune animazioni carine (come la nuvola di polvere che cresce ai piedi del personaggio) questo può essere fatto per sentirsi intuitivo.
Jari Komppa,

2

Ho trovato un'altra soluzione nella risposta di David Gouveia alla domanda " Come far saltare un personaggio? "

Sommario:

La sua idea era quella di impostare una velocità quando il giocatore preme il pulsante di salto. In ogni frame calcola solo la gravità. Tuttavia, quando il giocatore rilascia il pulsante, imposta la velocità su un valore inferiore se la velocità è maggiore di essa. La velocità viene ridotta solo di ciascun fotogramma dalla gravità.

Non dovrei rubare la sua risposta, quindi vai avanti e leggi il suo post. La sua soluzione è nella sezione " Salto di altezza variabile ".

Quindi davvero le persone hanno escogitato molti modi diversi per risolvere questo problema ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.