Domanda

Sto costruendo un gioco pacman. Fondamentalmente, voglio avere una rappresentazione della mappa di questa finestra composta da blocchi / tessere. Quindi, mentre il personaggio / fantasma di pacman si muove, cambierei la loro posizione sulla mappa per rappresentare ciò che è sullo schermo e lo userei per il rilevamento delle collisioni ecc.

Come posso costruire questa mappa, specialmente perché lo schermo è fatto di coordinate x, y, quindi come posso rappresentarle correttamente in riquadri / su questa mappa?

È stato utile?

Soluzione

So che è allettante iniziare a pensare a oggetti e interfacce ma hai pensato a un array bidimensionale con ogni elemento che rappresenta 40 pixel o qualcosa del genere? Non ricordo che Pacman fosse preciso al pixel quando si trattava di una collisione, più una questione di direzione in cui si muoveva ogni pezzo.

Altri suggerimenti

Generalmente hai una rappresentazione astratta che non fa riferimento ai pixel in quanto tali (ad esempio, forse il labirinto di Pac-Man è semplicemente w unità di larghezza), e quindi hai una trasformazione lineare (sai, y = mx + b ) per trasportare la rappresentazione astratta in pixel effettivi.

Per renderlo concreto, supponiamo che tu voglia che la tua rappresentazione astratta sia larga 100 unità e che tu voglia renderizzarla come 400 pixel. Quindi la trasformazione è solo scrn_x = 4 * x.

Un po 'difficile trovare questo senza scriverlo da solo ma.

Per prima cosa dovrai creare le definizioni delle entità che implementano ICollidable. Le entità dovrebbero includere fantasmi, pacman, punti e potenziamenti. Ogni elemento nella mappa conterrebbe, insieme ad altre informazioni, un elenco di tutte le entità presenti con una sorta di "posizione". valore per una maggiore precisione. L'interfaccia ICollidable includerebbe non solo la logica per determinare quali entità si scontrano tra loro (ad esempio i fantasmi non si scontrano con punti). Ma determinano se sono in grado di scontrarsi tra loro. Cioè se pacman sta entrando in uno spazio da destra e un fantasma sta lasciando quello spazio da sinistra non c'è collisione. Aiuterà anche a determinare quando esattamente pacman ha mangiato un punto in modo che appaia graficamente corretto. Cioè se distruggi un punto proprio mentre Pacman entra in uno spazio, sparirà prima ancora che lo tocchi graficamente.

I tuoi folletti come pacman e il fantasma sono rappresentati da posizioni (x, y). Per determinare se si scontrano tra loro, utilizzare questo psuedocode:

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

Nota che questo non coinvolge affatto la mappa. Possiamo verificare le collisioni tra pacman e la mappa separatamente. Il trucco chiave qui è dividere la coordinata dei pixel di ciascuno dei lati di pacman (in alto, in basso, a sinistra, a destra) e controllare le collisioni. Ad esempio, se pacman sta andando a destra, dobbiamo verificare il margine destro per una collisione:

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

Ora, se hai un numero enorme di sprite sullo schermo, puoi ottimizzare il rilevamento delle collisioni da sprite a sprite memorizzando quali sprite esistono su una particolare tessera nella mappa, e quindi devi solo confrontare gli sprite in piastrelle adiacenti. Ma per un primo passaggio e per questo gioco pacman, probabilmente non è un'ottimizzazione necessaria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top