Beispiel #1
0
void normaliza(pixel *linha, int largura, int fluxoDesejado) {  /* Normaliza a linha para ter o fluxo desejado */
    int i = 0;
    float fluxoObtido = 0;
    float novaVel, vel;
    
    for (i = 0; i < largura; i++)       /* O fluxo obtido é a soma de todas as velocidades */
        if (tipo(& linha[i] ) != TERRA)
            fluxoObtido += velocidade(&linha[i]);
    
    for (i = 0; i < largura; i++) {     /* Transforma a linha numa que tenha o fluxo desejado */
        if (tipo(&linha[i]) != TERRA){
            vel = velocidade(&linha[i]);
            novaVel = 1.0*vel*fluxoDesejado/fluxoObtido;
            setaVelocidade(&linha[i], novaVel);
        }
    }
}
Beispiel #2
0
int main ()
{
    display tela;
    display_create(&tela, 52, 25);

    char direcao = 77;
    int posicao[2] = {tela.width/2, tela.height/2 + 1};

    int inimigos[23*48 - 1][2];
    int n_inimigos = 0;
	int vel = 150;

	menu(&tela);
    criar_cobra(&tela);

    while (1) {
        display_clear(&tela);

        criar_inimigo(&tela, inimigos, &n_inimigos);
        int i;
        for (i = 0; i < n_inimigos; i++)
            display_put_raw(&tela, inimigos[i][0], inimigos[i][1], 'X');

        criar_bordas(&tela);
        display_paint(&tela, posicao[0], posicao[1]);

        while (kbhit()){
            char aux = getch();
            if (aux == CIMA || aux == BAIXO || aux == ESQUERDA || aux == DIREITA)
                direcao = aux;
        }

        switch (direcao)
        {
            case CIMA:
                posicao[1]++;
                break;
            case BAIXO:
                posicao[1]--;
                break;
            case ESQUERDA:
                posicao[0]--;
                break;
            case DIREITA:
                posicao[0]++;
                break;
        }

        velocidade(&vel);
        placar(&tela, n_inimigos);
        verificar_morte(&tela, posicao);
        display_show(&tela);
		Sleep(vel);
    }

    return 0;
}
Beispiel #3
0
void suavizaVelocidades (pixel *linha, int largura) {
    int i = 0;
    
    int tamanhoDaMargemEsquerda = margemEsquerda(linha);
    int tamanhoDaMargemDireita = margemDireita(linha, largura);
    
    float velocidadeAnterior = 0;
    
    for (i = tamanhoDaMargemEsquerda; i < largura - tamanhoDaMargemDireita; i++) {
        if (velocidade(&linha[i]) != 0) {
            float velocidadeNova = (velocidadeAnterior + velocidade(&linha[i]) + velocidade(&linha[i+1]))/3;
            velocidadeAnterior = velocidade(&linha[i]);
            setaVelocidade(&linha[i], velocidadeNova);
        }
        else {
            velocidadeAnterior = 0;
        }
    }
}
int testaCorrecao(pixel *linha, int fluxoDesejado, int largura){
    /*verifica se para uma dada linha o fluxo obtido eh igual ao fluxo desejado*/
    
    int i;
    float fluxo = 0;
    
    for(i = 0; i < largura; i++)
        fluxo += velocidade( &linha[i] );
    
    if( abs( fluxoDesejado - fluxo) == 0 ) /*compensa erro de aproxiacao de float*/
        return 1;
    
    return 0;
}
int calculaVariacoes(pixel **grade, int largura, int altura, int fluxoDesejado,
                     float *velMin, float *velMedia, float *velMax,
                     int *margEsqMin, float *margEsqMedia, int* margEsqMax,
                     int *margDirMin, float *margDirMedia, int *margDirMax){
    
    
    int i, j;
    int pixelsDeAgua = 0;
    float velMed = 0;
    float velAux = 0;
    int margDirAux = 0;
    int margEsqAux = 0;
    int linhasComFluxoCorreto = 0;
    
    for(i = 0; i < altura; i++){
        
        margEsqAux = margemEsquerda(grade[i]);
        margDirAux = margemDireita(grade[i], largura);
        
        if (margEsqAux > *margEsqMax) *margEsqMax = margEsqAux;
        if (margEsqAux < *margEsqMin) *margEsqMin = margEsqAux;
        if (margDirAux > *margDirMax) *margDirMax = margDirAux;
        if (margDirAux < *margDirMin) *margDirMin = margDirAux;
        
        *margEsqMedia += 1.0* margEsqAux/altura;
        *margDirMedia += 1.0* margDirAux/altura;
        
        linhasComFluxoCorreto += testaCorrecao( grade[i], fluxoDesejado, largura );
        
        for(j = 0; j < largura; j++){
            
            velAux = velocidade(&grade[i][j]);
            
            if (velAux > *velMax) *velMax = velAux;
            if (velAux < *velMin) *velMin = velAux;
            
            if (tipo(&grade[i][j]) == AGUA) {
                velMed += velAux;
                pixelsDeAgua++;
            }
            
        }
        
        velMed /= pixelsDeAgua;
        *velMedia += velMed;
    }
    
    return linhasComFluxoCorreto;
    
}
Beispiel #6
0
void velocidadeProximaLinha (pixel *linha, pixel *linhaAnterior, int fluxoDesejado, int largura) {
    int i = 0;
    
    int tamanhoDaMargemEsquerda = margemEsquerda(linha);
    int tamanhoDaMargemDireita = margemDireita(linha, largura);
    
    for (i = tamanhoDaMargemEsquerda; i < largura-tamanhoDaMargemDireita; i++) {
        if (tipo(&linha[i-1]) == TERRA || tipo(&linha[i]) == TERRA || tipo(&linha[i+1]) == TERRA) {
            setaVelocidade(&linha[i], 0);
        }
        else {
            float velocidadeAnterior = velocidade(&linhaAnterior[i]);
            float aleatorio = realRandomico(0.9, 1.1);
            float velocidadeNova = velocidadeAnterior*aleatorio;
            if (velocidadeNova == 0) {
                velocidadeNova = aleatorio*fluxoDesejado/(largura*8);
            }
            setaVelocidade(&linha[i], velocidadeNova);
        }
    }
    
}