Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-01-2010, 11:41   #1
Ethoel
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 28
[C++][SDL] problema scrolling dello sfondo

Salve a tutti, mi sono da poco appassionato all'uso delle SDL dopo aver attraversato il periodo Allegro, stò seguendo i tutorial di Lazy Foo:
http://lazyfoo.net/SDL_tutorials/index.php

Solo che ora sono bloccato allo scrolling dello sfondo della semplice applicazione e non riesco a trovare soluzione al problema, chiedo a voi guru un piccolo aiuto.



Ecco i vari codici:

MyEngine.h
Codice:
#include "SDL.h"
#include <string>

SDL_Surface *load_image(std::string filename);

bool init();
bool load_files();

void eventsKeys(SDL_Event event);
void fillScreen();
void update_screen();
void clean_up();
void delay();
void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip);

class Player
{
    private:
    //The X and Y offsets of the dot
    int x, y;
    
    //The velocity of the dot
    int xVel, yVel;
    
    public:
    //Initializes the variables
    Player();
    
    //Takes key presses and adjusts the dot's velocity
    void handle_input(SDL_Event event);
    
    //Moves the dot
    void move();
    
    //Shows the dot on the screen
    void show();

	//Sets the camera over the dot
    void set_camera();
};
MyEngine.cpp
Codice:
#include "SDL.h"
#include "MyEngine.h"


const int screen_X = 640;
const int screen_Y = 480;
const int profondScreen = 16;

SDL_Surface *sfondo = NULL;
SDL_Surface *screen;
SDL_Rect camera = { 0, 0, screen_X, screen_Y };

const int PLAYER_WIDTH = 20;
const int PLAYER_HEIGHT = 20;

const int LEVEL_WIDTH = 1280;
const int LEVEL_HEIGHT = 960;

SDL_Event event;

SDL_Surface *dot = NULL;

SDL_Surface *load_image( std::string filename ) 
{
    //Memorizzazione temporanea per il caricamento dell'immagine
    SDL_Surface* loadedImage = NULL;
    
    //L'immagine ottimizzata che verrà usata
    SDL_Surface* optimizedImage = NULL;

	//Carica l'immagine
    loadedImage = SDL_LoadBMP(filename.c_str());

	 //Se nulla và storto...
    if( loadedImage != NULL )
    {
        //Crea un'immagine ottimizzata
        optimizedImage = SDL_DisplayFormat( loadedImage );
        
        //Libera la vecchia immagine
        SDL_FreeSurface( loadedImage );

		//Se l'immagine è stata ottimizzata bene
        if( optimizedImage != NULL )
        {
            //Mappa il colorkey
            Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 255, 0, 255);
			//Setta il colore trasparente
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
        }
    }
	//Ritorna l'immagine ottimizzata
    return optimizedImage;
}

bool init()
{
    //Inizializza tutti i sottosistemi SDL
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;    
    }
    
    //Setta lo schermo
    screen = SDL_SetVideoMode( screen_X, screen_Y, profondScreen, SDL_SWSURFACE );
    
    //Se c'è un errore nel settaggio dello schermo
    if( screen == NULL )
    {
        return false;    
    }
    
    //Setta il titolo della finestra
    SDL_WM_SetCaption( "Event test", NULL );
    
    //Se tutto è inizializzato bene
    return true;
}

bool load_files()
{
    //Load the image
	dot = load_image("dot.bmp");
	sfondo = load_image("sfondo.bmp");
    
    //Se c'è un'errore nel caricamento dell'immagine
    /*if( image == NULL )
    {
        return false;    
    }*/
    
    //If everything loaded fine
    return true;    
}

void eventsKeys(SDL_Event event)
{
	//Se un tasto viene premuto
            if( event.type == SDL_KEYDOWN )
            {
				switch( event.key.keysym.sym )
                {
                    case SDLK_UP: SDL_WM_SetCaption( "Sopra", NULL ); break;
                    case SDLK_DOWN: SDL_WM_SetCaption( "Sotto", NULL ); break;
                    case SDLK_LEFT: SDL_WM_SetCaption( "Sinistra", NULL ); break;
                    case SDLK_RIGHT: SDL_WM_SetCaption( "Destra", NULL ); break;
                }
            }
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL)
{
    //Crea un rettangolo temporaneo per catturare l'immagine
    SDL_Rect offset;
    
    //Dà gli offesets al rettangolo
    offset.x = x;
    offset.y = y;
	//Blinda il surface
    SDL_BlitSurface( source, NULL, destination, &offset );
}

void fillScreen()
{
	apply_surface(0,0,sfondo,screen,&camera);
}

void update_screen()
{
	SDL_Flip(screen);
}

void clean_up()
{
    //Libera le immagini
	SDL_FreeSurface(dot);
	SDL_FreeSurface(sfondo);
    
    //Quit SDL
    SDL_Quit();    
}

void delay()
{
	SDL_Delay(2000);
}

Player::Player()
{
    //Initialize the offsets
    x = 0;
    y = 0;
    
    //Initialize the velocity
    xVel = 0;
    yVel = 0;
}

void Player::handle_input(SDL_Event event)
{
    //If a key was pressed
    if( event.type == SDL_KEYDOWN )
    {
        //Adjust the velocity
        switch( event.key.keysym.sym )
        {
            case SDLK_UP: yVel -= PLAYER_HEIGHT / 2; break;
            case SDLK_DOWN: yVel += PLAYER_HEIGHT / 2; break;
            case SDLK_LEFT: xVel -= PLAYER_WIDTH / 2; break;
            case SDLK_RIGHT: xVel += PLAYER_WIDTH / 2; break;    
        }
    }
	//If a key was released
    else if( event.type == SDL_KEYUP )
    {
        //Adjust the velocity
        switch( event.key.keysym.sym )
        {
            case SDLK_UP: yVel += PLAYER_HEIGHT / 2; break;
            case SDLK_DOWN: yVel -= PLAYER_HEIGHT / 2; break;
            case SDLK_LEFT: xVel += PLAYER_WIDTH / 2; break;
            case SDLK_RIGHT: xVel -= PLAYER_WIDTH / 2; break;   
        }        
    }
}

void Player::move()
{
    //Move the dot left or right
    x += xVel;
    
    //If the dot went too far to the left or right
    if( ( x < 0 ) || ( x + PLAYER_WIDTH > LEVEL_WIDTH ) )
    {
        //move back
        x -= xVel;    
    }
    
    //Move the dot up or down
    y += yVel;
    
    //If the dot went too far up or down
    if( ( y < 0 ) || ( y + PLAYER_HEIGHT > LEVEL_HEIGHT ) )
    {
        //move back
        y -= yVel;    
    }
}

void Player::set_camera()
{
    //Center the camera over the dot
    camera.x = ( x + PLAYER_WIDTH / 2 ) - screen_X / 2;
    camera.y = ( y + PLAYER_HEIGHT / 2 ) - screen_Y / 2;
    
    //Keep the camera in bounds.
    if( camera.x < 0 )
    {
        camera.x = 0;    
    }
    if( camera.y < 0 )
    {
        camera.y = 0;    
    }
    if( camera.x > LEVEL_WIDTH - camera.w )
    {
        camera.x = LEVEL_WIDTH - camera.w;    
    }
    if( camera.y > LEVEL_HEIGHT - camera.h )
    {
        camera.y = LEVEL_HEIGHT - camera.h;    
    }    
}

void Player::show()
{
    //Show the dot
    apply_surface( x - camera.x, y - camera.y, dot, screen );
}
Main.cpp
Codice:
#include "SDL.h"
#include "MyEngine.h"
#include "Timer.h"

//SDL_Event event;

int main( int argc, char* args[] )
{
	SDL_Event event;

	Player myPlayer;

	bool uscita = false;

	//inizializzazione
    if( init() == false )
    {
        return 1;    
    }
	//caricamento file
    if( load_files() == false )
    {
        return 1;    
    }

	//While che termina quando quit = true
    while( uscita == false )
    {
		//While c'è un evento
        while( SDL_PollEvent( &event ) )
        {
			myPlayer.handle_input(event);

			eventsKeys(event);

			//Se l'utente ha premuto la X
            if( event.type == SDL_QUIT )
            {
                //Esci dal programma
                uscita = true;
            }

        }
		myPlayer.move();

		//Set the camera
        myPlayer.set_camera();

		fillScreen();

		myPlayer.show();

		//Aggiorna lo schermo
	   update_screen();
    }
	//pulisce tutto
	clean_up();
    
    //Esce sdl
    SDL_Quit();
    
    return 0;    
}
Scusate la lunghezza dei codici ma almeno è tutto chiaro, non fate caso a #include "Timer.h" ma nel caso in questione non serve a niente e nel main non c'è nessuna chiamata alle funzioni di Timer...

Grazie per l'aiuto, io non so più che pesci pigliare
Ethoel è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2010, 21:12   #2
Ethoel
Junior Member
 
Iscritto dal: Apr 2008
Messaggi: 28
Risolto
Ethoel è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
World of Warcraft: Forever è il Classic+...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:50.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v