Skip to content

v4.0 - Gestione di una texture per il serpente e per la frutta

Choose a tag to compare

@AlbyMiscy AlbyMiscy released this 16 Nov 16:00
· 18 commits to main since this release
55fedae

step04

πŸ“Œ Descrizione

In questo aggiornamento di NeoSnake Γ¨ stato introdotto un sistema di skin dinamiche sia per il serpente che per il frutto.
Lo scopo Γ¨ migliorare l’impatto visivo del gioco rendendo gli elementi piΓΉ riconoscibili, vari e piacevoli per l’utente.

Di seguito sono elencate tutte le modifiche apportate ai file del progetto, con una breve spiegazione del loro ruolo.

🎨 skin del serpente

snake_skin_1-1

  • Aggiunta una texture dedicata al serpente: Essa contiene due frame in un'unica riga (HEAD, BODY).

  • snake.hpp: Aggiunti i metodi:

    • setTexture(sf::Texture* texture)
    • setTextureRect(const sf::IntRect& rect)
    • setRotation(float angle)
    • Modificato getShape(): ora ritorna un riferimento, evitando copie inutili.
  • snake.cpp: Implementazione delle nuovi funzioni.

  • engine.hpp:

    • Aggiunto sf::Texture snakeSkin allo scopo di conservarne in memoria l'atlas del serpente e fornirlo a tutte le sue sezioni.
  • engine.cpp:

    • Caricamento della skin in startGame().
    • Dopo la creazione del serpente (newSnake()), ogni sezione ottiene:
      • la texture condivisa
      • il frame corretto (testa o corpo)
      • un'orientazione iniziale coerente
  • snakeFunction.cpp

    • In newSnake(): ogni sezione riceve immediatamente head/body rect e rotazione iniziale.
    • In addSnakeSection(): le nuove sezioni ereditano automaticamente la skin e un frame BODY.
  • update.cpp:

    • Durante l’update del movimento:
      • La testa usa headRect e ruota in base a snakeDirection.
      • Ogni sezione del corpo usa bodyRect e ruota in base al segmento precedente.
    • Lo scopo Γ¨ quello di orientare il serpente in modo corretto senza richiedere sprite differenti per ogni direzione.

🍎 Skin del Frutto

fruit

  • Aggiunta una texture con tre frutti diversi resources/texture/fruit.png che contiene:

    • banana
    • mela
    • ciliegia

    È un atlas con tre frame affiancati orizzontalmente.

  • fruit.hpp

    • setTexture(const sf::Texture* tex, int frames)
    • pickRandomFrame()
    • Lo scopo Γ¨ quello di gestire un atlas multi-frame e selezionare un frutto casuale.
  • fruit.cpp: Implementata la logica del fruit atlas:

    • calcolo automatico della larghezza di ogni frame,
    • generatore casuale moderno std::mt19937,
    • scelta casuale del frame,
    • applicazione del textureRect corretto allo shape del frutto.
    • Lo scopo Γ¨ quello di rendere il frutto diverso ad ogni spawn.
  • fruitFunction.cpp

    • In moveFruit() dopo aver trovato una posizione valida:
      • Applicata la texture del frutto,
      • chiamato fruit.pickRandomFrame() per selezionare una sprite casuale.
  • NeoSnake
     β”‚
     β”œβ”€β”€ πŸ“‚handlers/
     β”‚   β”œβ”€β”€ draw.cpp
     β”‚   β”œβ”€β”€ fruitFunction.cpp
     β”‚   β”œβ”€β”€ input.cpp
     β”‚   β”œβ”€β”€ snakeFunction.cpp
     β”‚   └── update.cpp
     β”‚
     β”œβ”€β”€ πŸ“‚header/
     β”‚   β”œβ”€β”€ engine.hpp
     β”‚   β”œβ”€β”€ fruit.hpp
     β”‚   β”œβ”€β”€ snake.hpp
     β”‚   β”œβ”€β”€ resource_path.h.in
     β”‚   └── map.hpp
     β”‚
     β”œβ”€β”€ πŸ“‚src/
     β”‚   β”œβ”€β”€ engine.cpp
     β”‚   β”œβ”€β”€ fruit.cpp
     β”‚   β”œβ”€β”€ main.cpp
     β”‚   β”œβ”€β”€ snake.cpp
     β”‚   └── map.cpp
     β”‚
     └── πŸ“‚resources/
         β”œβ”€β”€ πŸ“‚levels/
         β”‚   └── Level01.png
         β”‚
         └── πŸ“‚texture/
    +         β”œβ”€πŸ“‚skin/
    +         β”‚  └── snake_skin_1-1.png
    +         β”œβ”€β”€ snake.cpp 
              └── wall.png

    πŸ”— Link utili