checkpoint

Stai vedendo 14 articoli - dal 1 a 14 (di 14 totali)
  • Autore
    Articoli
  • #16869

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    sono un novellino col game engine anche se me la so cavare, e volevo chiedere se era possibile creare dei checkpoint

    . aspetto risposte, grazie.

    #191565

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul Forum 456

    Certo che si può. Cosa ti serve esattamente?

    Un sistema che registra il progresso in un percorso tramite checkpoint?

    Un sistema che fa riapparire il giocatore (dopo la sua morte) in un punto di checkpoint?

    #191566

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul Forum 456

    Visto che da domani fino al 5 sono in vacanza (probabilmente senza internet), e visto anche che non ci sono moltissimi utenti che rispondono a domande sul ge, provo a rispondere ora alla domanda.

    Se è il primo caso (“un sistema che registra il progresso in un percorso tramite checkpoint”):

    Immagino che serva per un gioco di macchine… quindi c'è una scena con un percorso. Il giocatore può seguirlo oppure tagliare in mezzo. Se non taglia completa il giro e (che ne so…) vince il gioco. Se taglia il percorso (se non passa da tutti i checkpoint) non completa il gioco e deve rifare il giro.

    Predisponi il percorso e decidi con quale frequenza mettere checkpoints.

    Tieni conto che più checkpoint ci sono e meglio sarà  per costringere il giocatore a seguire il percorso… ma è anche una fatica in più! Quindi ci sarà  come minimo un checkpoint ad ogni curva… poi fa tu.

    Un checkpoint sarà  un parallelepipedo, largo come il percorso, alto poco più del veicolo e non eccessivamente spesso; oggetti statici, “Ghost” e invisibili.

    Inizia facendone uno, che poi duplicherai alla fine.

    I checkpoint saranno numerati, il primo che incontra è “1” e via dicendo “2”, “3”…

    Il giocatore deve avere una proprietà  chiamata “checkpoint”, di tipo integer, settata a 0 di default.

    Ogni checkpoint ha questi logic bricks:

    Collision (veicolo del giocatore)


    Python script


    Message (nome attuatore “message”, To: player, Subject: “addcheckpoint”)

    Il checkpoint dovrà  eseguire uno script… Qualcosa di questo tipo:

    Code:
    import bge
    cont = bge.logic.getCurrentController()
    act = cont.actuators[“message”]
    checknum = int(cont.owner.name)
    player = bge.logic.getCurrentScene().objects[“NOME”] #Sostituisci a NOME il nome dell'oggetto-giocatore
    lastcheck = player[“checkpoint”]
    if checknum == lastcheck +1:
    cont.activate(act)
    else:
    player[“checkpoint”] = 0 #Questo costringe il giocatore a rifare il giro da capo se salta anche un solo checkpoint.
    #Se vuoi lasciargli una scappatoia (retromarcia nel punto saltato) elimina le ultime due righe da “else” incluso

    In pratica lo script controlla qual'è l'ultimo checkpoint contenuto nella proprietà  del giocatore.

    Poi lo confronta con il nome del checkpoint (che rappresenta il numero del checkpoint appena raggiunto).

    Se il checkpoint appena raggiunto è il successivo dell'ultimo attraversato, allora attiva l'attuatore che hai impostato.

    Il veicolo, quando riceve quel messaggio, aggiunge “1” alla variabile.

    Poi piazza un altro checkpoint chiamato “start” appena prima del punto dove il giocatore parte (non a contatto)… insomma, all'arrivo.

    “start” ha questi logic bricks:

    Collision (veicolo del giocatore)


    Python script


    Attuatore che ti fa vincere il gioco

    Questo script è un po' diverso dal precedente:

    Code:
    import bge
    cont = bge.logic.getCurrentController()
    act = cont.actuators[“NOME”] #cambia NOME col nome dell'attuatore
    player = bge.logic.getCurrentScene().objects[“NOME”] #Sostituisci a NOME il nome dell'oggetto-giocatore
    checkpoints = player[“checkpoint”]
    if checkpoints == NUMERO: #sostituisci a NUMERO il nome dell'ultimo checkpoint prima della fine (niente virgolette)
    cont.activate(act)
    else:
    player[“checkpoint”] = 0 #Questo costringe il giocatore a rifare il giro da capo se salta anche un solo checkpoint.
    #Se vuoi lasciargli una scappatoia (retromarcia nel punto saltato) elimina le ultime due righe da “else” incluso

    Ok, in teoria dovrebbe funzionare (forse solo in teoria perché sono andato a memoria icon_redface.gif).

    Se è il secondo caso (“un sistema che fa riapparire il giocatore (dopo la sua morte) in un punto di checkpoint”):

    Il metodo è molto simile al precedente.

    I checkpoint sono cubi molto grandi… Li piazzi dove vuoi, anche dappertutto. Ma potrebbe essere simpatico far riapparire il giocatore in punti precisi, i grandi “monoliti della resurrezione” o che so io.

    Metti un Empty in aria, al centro del soffitto (in modo che ti sia ben visibile)… non conta la posizione, è per comodità  tua.

    Lo chiami “ContCheckpoint” e gli metti la proprietà  “checkpoint” (0 default, integer) e questi logic bricks:

    Message (“Playerisdead”)


    Python script


    Message(nome attuatore: “message”, To: (vuoto), subject: “spawnplayer”)

    L'empty riceve il messaggio “Playerisdead” quando il giocatore deve riapparire.

    Lo script:

    Code:
    import bge
    cont = bge.logic.getCurrentController()
    act = cont.actuators[“message”]
    checkpoint = cont.owner[“checkpoint”]
    act.to_property = str(checkpoint)
    cont.activate(act)

    Questo script decide a chi mandare l'ordine di rimettere in gioco il giocatore. Prende la sua proprietà  e considera come nome dell'oggetto destinatario del messaggio.

    Ora, fai i tuoi checkpoint e dai a ognuno un nome specifico (“1”, “3”, “84”….) non importa l'ordine, non importa se ci sono dei buchi nella sequenza numerica, basta che siano numeri interi.

    Ogni checkpoint ha questi logic bricks:

    Message (“spawnplayer”)


    AND


    Edit object (add object player)

    Collision(giocatore)


    Python script

    Lo script:

    Code:
    import bge
    cont = bge.logic.getCurrentController()
    checkpoint = int(cont.owner.name)
    empty = bge.logic.getCurrentScene().objects[“ContCheckpoint”]
    empty[“checkpoint”] = checkpoint

    Ribadisco che non sono sicuro al mille per cento che funzioni tutto a dovere.

    Spero di aver risolto il problema… altrimenti ti auguro di trovare qualcun altro disponibile in fretta! icon_e_biggrin.gif

    #191567

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    grazie, Qwerty, ma non ho ben capito se “playerisdead” è il nome del messaggio o se è il subject. e l'empty la devo posizionare sopra il cubo del checkpoint?

    #191568

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul Forum 456

    L'empty lo posizioni dove ti pare, non importa, mettilo in un posto in cui lo puoi trovare subito.

    “playerisdead” è il soggetto del messaggio.

    #191569

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    ok grazie! se poi non funziona ti avverto…

    #191570

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    non sono riuscito a farlo funzionare, non è che ci sarebbe un modo per fare i checkpoint con i logic brick (senza python)?

    (comunque era il secondo caso, ovvero quando muore il personaggio)

    #191571

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    ho trovato una cosa del genere per blender 2.49, ma non riesco ad adattarla a blender 2.5

    Code:
    import GameLogic

    player = GameLogic.getCurrentScene().objects['OBNomeplayer']
    check = GameLogic.getCurrentScene().objects['OBCHECKPOINT']

    player.position = check.position

    potresti darmi una mano… grazie

    #191572

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul Forum 456
    Code:
    import bge
    player = bge.logic.getCurrentScene().objects['Nomeplayer']
    check = bge.logic.getCurreentScene().objects['CHECKPOINT']
    player.position = check.position

    Comunque mi sembra strano che il metodo che ti avevo consigliato non funzioni… posta il file (lo guarderò solo il 5, non ho blender qui)

    #191573

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    non mi allega il file… 😳

    #191574

    Anonimo
    Membro
    • Veterano Oro
    • ★★★★★
    • Post sul Forum 4019

    allegalo come .ZIP

    #191575

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263
    #191576

    Qwerty
    Partecipante
    • Veterano
    • ★★
    • Post sul Forum 456

    Quando usi l'add object l'oggetto deve essere sempre in un layer nascosto (non visibile).

    Insomma, all'inizio il giocatore viene aggiunto nella posizione di partenza, non esiste già  fin dall'inizio.

    Se il cubo “1” è settato su “no collision” non potrà  collidere con il giocatore e quindi non attiverà  lo script! Invece che “No collision” settalo su “static” e attiva il “ghost”.

    Il cubo di checkpoint “1” si attiva quando tocca qualcosa che ha la proprietà  “player”. Il giocatore ha la proprietà  “Player”! Occhio alle maiuscole! “player” è diverso da “Player”.

    Stesso dicasi per il piano che “uccide” il giocatore (sarebbe meglio anche aggiungere un “end object” al cubo quando lo tocca).

    Lo script “checkpoint cube” va a cercare l'oggetto “ContCheckpoint”. Ma l'empty di controllo lo hai chiamato “Cont Checkpoint”, quindi non lo trova.

    L'empty non ha un attuatore “Message”, ma un attuatore “Message1”. Rinomina.

    Resta però un problema, non mi riconosce il “to_property”.icon_neutral.gif

    Ci penserò su.

    Intanto c'è questa soluzione, non proprio “pulita” ma meglio che niente.

    Sostituisci lo script dell'empty con questo:

    Code:
    import bge
    cont = bge.logic.getCurrentController()
    checkpoint = cont.owner[“checkpoint”]
    act = cont.actuators[“msg”+str(checkpoint)]
    cont.activate(act)

    Poi fai tanti attuatori “message” quanti sono i checkpoint, e li chiami “msg0”, “msg1”, “msg2” etc.

    In “msg0” il destinatario sarà  l'empty che aggiunge il giocatore all'inizio (aggiungi anche a lui i logic bricks che generano il giocatore se riceve il messaggio).

    In “msg1” sarà  il checkpoint 1 e via dicendo.

    Il messaggio è sempre lo stesso: “spawnplayer”.

    Qui c'è il file, ho aggiunto un altro checkpoint e ho messo un blocco che impedisce al checkpoint di creare un giocatore se ne ha appena creato uno (senza il blocco crea 2 giocatori insieme).

    [attachment=5224:Checkpoint.zip]

    Bada bene però di creare i checkpoint in “zone franche”, prive di nemici e di oggetti dannosi.

    Se il giocatore muore entro un decimo di secondo dalla sua creazione non verrà  più ricreato! https://www.blender.it/uploads/monthly_08_2011/post-8123-0-10513600-1312626244.ipb

    #191577

    eliteXXL
    Partecipante
    • Blenderista
    • Post sul Forum 263

    grazie mille, non sapevo più dove sbattere la testa! 😡

Stai vedendo 14 articoli - dal 1 a 14 (di 14 totali)

Devi essere loggato per rispondere a questa discussione.