Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c++] allegro.h: il pacman non si ferma

    Salve. Volevo creare un programmino con allegro.h: pacman. Dopo due settimane di ricontrolli non sono riuscito a trovare l'errore nel mio codice. Praticamente: ho creato una matrice con dentro delle X, delle o e degli spazi vuoti. Poi con un doppio ciclo for ho disegnato dove ci sono le X dei muretti, dove ci sono le o delle palline e dove ci sono spazi vuoti degli spazi vuoti. Le coordinate dei muretti sono uguali ai contatori * 30.
    codice:
    char campo[21][31] =
    {
    
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "            XXXX            XX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    };
    void crea()
    {
    for (r = 0; r < 21 ; r++)
    {
        for ( c = 0; c < 31; c++)
        {
            if (campo [r][c] == 'X')
            {
    
                draw_sprite (buf, sprite, c * 30, r * 30);
            }
    
    
    
            if (campo [r][c] == 'O')
            {
                draw_sprite (buf, monete, c * 30, r * 30);
    
    
            if ((x / 30 == c) && (y / 30 == r)) // x/30 perchè la x è stata dichiarata x = c * 30,                   
                                                         // uguale per la y
            {
                campo [r][c] = ' ';
            }
    
            }
        }
    }
    }
    Ecco qui la matrice e il doppio ciclo for (le dichiarazioni delle variabili e la creazione del pacman li ho messi all'inizio del codice). Inoltre in questo doppio ciclo dico che, se il pacman è nella stessa posizione delle palline, le palline scompaiono.
    Infine, per far fermare il pacman ho scritto:
    se (schiaccio su)
    {
    se ( la casella in cui andrà il pacman non è una X)
    {
    direzione = 1
    }

    }
    se (direzione == 1)
    {
    sposta in su il pacman di 2 in 2
    }

    ovvero
    codice:
          if (key[KEY_UP])
        {
            if (campo[(y - 30 ) / 30 ][x / 30] != 'X' )
            {
            dir = 1;
            }
            else
            {
                dir = 0;
            }
    
        }
       if (dir == 1)
        {
    
            y -= 2;
    
    
        }
    All'inizio sto tentando di vedere se riesco a fermare il pacman verso su, poi, quando ci riuscirò, lo farò anche nelle altre direzioni.
    Il codice sembra giusto, ma il pacman nn si ferma, tuttavia, se sposto il pacman un po' più a sinistra il pacman si blocca:
    QUALE E' IL PROBLEMA?? Sto impazzendo da un mese!!!
    Potete anche nn scrivere il codice, mi basta sapere dove ho sbagliato
    tutto si può fare, bisogna solo volerlo
    http://italybrain.altervista.org/

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    è la stessa storia...
    stai calcolando di nuovo male le collisioni, quello che stai facendo è calcolare il lato sinistro della X.

    inoltre mancano tantissime condizioni, non puoi usare un semplice '!='

    devi calcolare ogni modo in cui pacman puo' collisionare con la X.

    devi ottenere le dimensioni della X ed in base a quello devi sapere se la posizione di pacman è maggiore o minore di essa.

    piu' di cosi non ti posso aiutare,il codice da scrivere è molto piu' complesso di quello che hai scritto tu, per spiegarlo nei minimi dettagli ci vorrebbe parecchio tempo.

  3. #3
    ok, ma calcola che io ho fatto questa procedura per tutte le direzioni (su, giù, destra e sinistra) e poi che la X non è creata come un oggetto (con le dimensioni), ma come cella della matrice, ma mi interessa
    quello che stai facendo è calcolare il lato sinistro della X.
    perchè? Forse è questo il problema
    tutto si può fare, bisogna solo volerlo
    http://italybrain.altervista.org/

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Originariamente inviato da g.b99pm10
    ok, ma calcola che io ho fatto questa procedura per tutte le direzioni (su, giù, destra e sinistra) e poi che la X non è creata come un oggetto (con le dimensioni), ma come cella della matrice, ma mi interessa

    perchè? Forse è questo il problema
    Te l'ho appena spiegato...non calcoli la larghezza delle collisioni...

    inoltre stai verificando se pacman equivale o non equivale ad X non se lo sta toccando...

  5. #5
    forse ho capito, inizio a modificare il codice.
    tutto si può fare, bisogna solo volerlo
    http://italybrain.altervista.org/

  6. #6
    ok, risolto!!! Il codice di prima era giusto. L'unico problema era il movimento del pacman.
    Rispiego velocemente il procedimento, forse non ero stato chiaro. Dunque

    1- creo una matrice, facciamo questa semplice
    codice:
    char mappa[4][3] =
    {
    "XXX",
    "XXX",
    "     ",
    "XXX",
    };
    ora con un doppio ciclo di for scansiono la matrice (i contatori li ho chiamati righe e colonne)
    All'interno del doppio ciclo for ho scritto un if che disegna un muretto quando i contatori incontrano una x. La posizione di ogni muretto è data dal contatore colonne * 30 e dal contatore righe * 30 (30 perchè se lasciassi solo righe e colonne, i muretti sarebbero attaccati l'un l'altro). Facciamo un esempio.
    il doppio ciclo for scansiona la matrice e quando arriva alle coordinate mappa[1][1] allora disegna un muretto nella seconda fila della seconda colonna con le coordinate 1 * 30 (x) e 1 * 30 (y) quindi le coordinate di quel muretto sono 30 e 30.

    Ora creiamo il pacman (le cui coordinate sono x e y). Esso dovrà stare in uno spazio vuoto. Per esempio quello della matrice mappa[2][1]. Per fare ciò basta scrivere

    x = 1 * 30; // 30
    y = 2 * 30; // 60

    Per farlo muovere aumenterò le varie coordinate di 30 (in questo modo andrà velocissimo, per renderlo più lento utilizzerò l'istruzione rest()).

    Adesso, per scrivere la collisione ho deciso di creare la stessa condizione dell'ultima volta, in questo caso solo per le collisioni verso l'alto, ma nel codice originale ho calcolato le collisioni per ogni direzione.

    if (mappa[(y - 30) / 30][ x / 30] != 'X')
    {
    muovi il pacman verso sopra
    }
    altrimenti no.

    proviamo a risolvere l'uguaglianza in modo matematico

    if (mappa [(60 - 30) / 30][30 / 30] != 'X')
    if (mappa [1][1] != 'X')
    {
    allora muovi verso sopra

    }
    altrimenti no

    In questo caso mappa[1][1] corrisponde a una X, quindi il pacman si ferma.


    Il mio errore è stato quello di aumentare la posizione del pacman di 2 ogni volta, in questo modo solo poche volte si incasellava perfettamente con la matrice. Spostandolo di 30 in 30 si incasella perfettamente, infatti la scala di proporzione è 30 : 1. Ora il mio unico problema è che usando rest, il pacman non reagisce subito ai comandi, ma gli ci vuole circa 1 / 2 di secondo. Qualche consiglio?
    tutto si può fare, bisogna solo volerlo
    http://italybrain.altervista.org/

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.