Bennu Game Development

Foros en EspaƱol => Mesa de Ayuda => Topic started by: TYCO on October 09, 2008, 07:13:22 PM

Title: ANGLE+FLAGS y ADVANCE(1)
Post by: TYCO on October 09, 2008, 07:13:22 PM
Program pruebas;

Begin
    set_mode(640,480,16);

    graph=new_map(30,10,16);
    map_clear(0,graph,rgb(0,255,0));

    write_int(0,0,0,0,&angle);

    x=220;
    y=220;
    angle=135000;
    size=400;

    detectores();
    obstaculo();

    While (not key(_esc))
      If (key(_right))
            angle-=5000;
        End
        If (key(_left))
            angle+=5000;
        End
        If (key(_down))
            advance(-5);
        End
        If (key(_up))
            advance(4);
        End
//*******************************************************************
// ESTE ADVANCE(1) NO FUNCIONA SI ANGLE NO VALE 0, 90, 180, 270 o 360
        advance(1);
//*******************************************************************
        Frame;
    End
End

Process detectores()

Private
    int colision;

Begin
    graph=new_map(220,80,16);
    set_center(0,graph,110,40);
    drawing_map(0,graph);
    drawing_color(rgb(255,0,0));
    draw_box(40,0,180,5);
    draw_box(180,0,220,20);

    write_int(0,0,10,0,&flags);

    While (not key(_esc))
        x=father.x;
        y=father.y;

        If (flags == 0)
            angle=father.angle;

            colision=collision(Type obstaculo);
            If (colision <> 0)
                flags=2;
            End
        Else
            angle=-father.angle;

            colision=collision(Type obstaculo);
            If (colision <> 0)
                flags=0;
            End
        End
    Frame;
    End
End

Process obstaculo()

Begin
    graph=new_map(80,80,16);
    map_clear(0,graph,rgb(0,0,255));

    x=100;
    y=100;

    While (not key(_esc))
Frame;
    End
End



1. El advance o xadvance no funciona si el angle no vale: 0, 90, 180, 270 o 360. Esto me suena de que se hablo ya, y creo recordar que se soluciono.

2. Ejecutando ese codigo: El rectangulo verde que manejas tu con las "fechas" tiene dos sensores rojos uno a la izquierda y el otro a la derecha que es un unico proceso, con flags "0" y "2" se va colocando a cada lado. Por ultimo hay un cuadrado azul haciendo de obstaculo.

PROBLEMA: Si tocamos el cuadrado azul SOLO con un flags (el "0" o el "2") cambia al otro flags, pero si tocamos con ambos flags al cuadrado azul el angle no es correcto en su colacion. Puede ser este problema venga del bugfix de los Mirrors???

Title: Re: ANGLE+FLAGS y ADVANCE(1)
Post by: SplinterGU on October 09, 2008, 08:07:26 PM
Por supuesto no funciona... erroneamente yo cambie que si el advance daba 0, debia avanzar 1... pero eso esta mal, al advance dar un valor menor a 1 y mayor a 0, y por ser valores enteros, no avanza... lo que hay que usar en estos casos de incrementos tan reducidos es usar resolution...

No entiendo tu 2do planteo, pero supongo que te referiras a lo que corrijo en el siguiente codigo


Program pruebas;

import "mod_video";
import "mod_text";
import "mod_key";
import "mod_map";
import "mod_grproc";
import "mod_draw";


Begin
    set_mode(640,480,16);

    graph=new_map(30,10,16);
    map_clear(0,graph,rgb(0,255,0));

    write_int(0,0,0,0,&angle);

    x=220;
    y=220;
    angle=135000;
    size=400;

    detectores();
    obstaculo();

    resolution = 10; // Splinter

    While (not key(_esc))
      If (key(_right))
            angle-=5000;
        End
        If (key(_left))
            angle+=5000;
        End
        If (key(_down))
            advance(-50);
        End
        If (key(_up))
            advance(40);
        End
//*******************************************************************
// ESTE ADVANCE(1) NO FUNCIONA SI ANGLE NO VALE 0, 90, 180, 270 o 360
        advance(10); // Splinter
//*******************************************************************
        Frame;
    End
End

Process detectores()

Private
    int colision;

Begin
    graph=new_map(220,80,16);
    set_center(0,graph,110,40);
    drawing_map(0,graph);
    drawing_color(rgb(255,0,0));
    draw_box(40,0,180,5);
    draw_box(180,0,220,20);

    write_int(0,0,10,0,&flags);

    priority = father.priority - 1; // Splinter
    resolution = 10; // Splinter

    While (not key(_esc))
        x=father.x;
        y=father.y;

        If (flags == 0)
            angle=father.angle;
            colision=collision(Type obstaculo);
            If (colision <> 0)
                flags=2;
                angle=-father.angle; // Splinter
            End

        Else
            angle=-father.angle;
            colision=collision(Type obstaculo);
            If (colision <> 0)
                flags=0;
                angle=father.angle; // Splinter
            End
        End
    Frame;
    End
End

Process obstaculo()

Begin
    graph=new_map(80,80,16);
    map_clear(0,graph,rgb(0,0,255));

    x=100;
    y=100;

    priority = father.priority + 1; // Splinter

    While (not key(_esc))
Frame;
    End
End


Por favor, confirmame si esto resuelve tu problema.
Title: Re: ANGLE+FLAGS y ADVANCE(1)
Post by: TYCO on October 09, 2008, 08:40:21 PM
1. Efectivamente con ese codigo funciona bien todo, gracias por las aclaraciones, error mio de novato.

2. Mira que le di vueltas al tema (se que viene el problema por el ultimo bugfix de los Mirrors) y por eso postee.

En esta parte del codigo:
        If (flags == 0)
            angle=father.angle;
            colision=collision(Type obstaculo);
            If (colision <> 0)
                flags=2;
No me fije en que si se cumplia "collision" hacia un cambio flags seguido un frame, pero no cambiaba el angle antes del frame (grave error). De hecho el problema era apreciable (con lupa y camara lenta) al cambiar de un flag a otro.
Title: Re: ANGLE+FLAGS y ADVANCE(1)
Post by: SplinterGU on October 09, 2008, 09:00:20 PM
hay que decir que lo del mirror mas que un bugfix (que en verdad lo es) es un cambio de comportamiento a como funcionaba fenix (y que no era correcto)

me alegro de haber sido de ayuda... y espero que te guste el nuevo comportamiento de los mirrors... se pueden hacer unos efectos muy interesantes...