hola a todos
no se que hago mal pero las durezas no me funcionan,
cuando hago esto...
IF ( map_get_pixel ( fpg_fondo , 7 , x , y ) != colores [_AZUL] )
advance(-10);
END
siempre esta avanzando -10, mi personaje es un tanque y avanza 8 cuando pulso (up)
en global tengo esto...
int colores[6];
y en constante esto...
_ROJO = 1;
_VERDE = 2;
_AZUL = 3;
_AMARILLO = 4;
_ROSA = 5;
_CELESTE = 6;
y cuando ejecuto el juego llamo a un proceso que recoge los colores que hay en una imagen que tengo con 6 colores, que son con los que pinto las durezas
PROCESS inicia_durezas()
BEGIN
colores[_ROJO] = map_get_pixel (fpg_fondo,999,1,1);
colores[_VERDE] = map_get_pixel (fpg_fondo,999,2,1);
colores[_AZUL] = map_get_pixel (fpg_fondo,999,3,1);
colores[_AMARILLO] = map_get_pixel (fpg_fondo,999,4,1);
colores[_ROSA] = map_get_pixel (fpg_fondo,999,5,1);
colores[_CELESTE] = map_get_pixel (fpg_fondo,999,6,1);
END
bueno a ver si me podeis ayudar porque se que estoy haciendo algo mal (de echo no hace lo que quiero) pero no se el que
lo que quiero es que no atraviese las zonas que he pintado de color x, sobraba decirlo pero ahi queda
gracias a todos
utiliza say para ver que color estas obteniendo para comprobar que la igualdad del if se cumple
color = map_get_pixel ( fpg_fondo , 7 , x , y );
say(color);
say(colores [_AZUL]);
Quote from: FreeYourMind on July 26, 2010, 09:13:44 PM
utiliza say para ver que color estas obteniendo para comprobar que la igualdad del if se cumple
color = map_get_pixel ( fpg_fondo , 7 , x , y );
say(color);
say(colores [_AZUL]);
Vaya veo que le vas hacer caso a Splynter ,lo digo por los Say ,Free... ;P
Te recomiendo lo mismo que Free ,que compruebes que valores obtienes para ver si es porque no son los mismos...
Quote from: FreeYourMind on July 26, 2010, 09:13:44 PM
utiliza say para ver que color estas obteniendo para comprobar que la igualdad del if se cumple
color = map_get_pixel ( fpg_fondo , 7 , x , y );
say(color);
say(colores [_AZUL]);
;) muy bien, muy bien... me gusta ver que uno no habla al pedo y la gente toma los consejos... gracias... :)
me alegraste, te voy a dar 1 karma.
Vaya....
Pues os cuento un secreto, el say ya lo llevo usando hace tiempo (por lo menos en este proyecto es una constante, por los codigos de colores y demas cosillas ya que tambien uso mapas de durezas y he definido varios colores como aqui nuestro amigo).
Mi duda de ayer fue una idiotez, en la cual no se me paso por la cabeza utilizarlo en el case 0...
;D ;D
lo del say no lo entiendo muy bien
pero aparte yo en el if pongo x e y al pasarle las coordenadas pero
que tengo que poner para anticiparme un poco?
quiero decir que si mi protagonista se moviera en el eje x, pondria en el if x + 10
pero al moverse con advance como lo hago
Lo de say deves incluirle en el juego , import "mod_say" , luego haces como te explico Free y en la consola te pone los valores que vas recogiendo, lo de avance simplemente le tienes que poner el valor que quieres que avance en el angulo que tenga por ejemplo avance(10), lo que es un poco mas "complicadillo" en hacer que el personaje este en el angulo que deseas ,podrias hacerlo algo asi if ( key(_left) ) angle+=90000; end ...
vale ya he hecho say y los colores del scroll los pilla bien pero (_AZUL) o cualquier otro color me devuelven 1
que esta pasando
huy iva a guardar este post con ctr+s, bufff...
ya esta,
el problema es que al comprobar el color de mi grafico ponia como (y) un 1 pensando en el pixel 1, y es el (0)
a ver si me podeis resolver lo de advance
Me temo que advance actúa sobre X e Y, así que 1 de dos:
-O creas una funcion en la misma posición y ángulo, y haces que avance lo que sea y devuelva el color de dicha posición.
-O tiras de trigonometría básica: sabes la distancia, el ángulo y el punto de origen. Con el seno averiguas el avance en Y y con el coseno en X:
new_x=x+avanzar*cos(angle);
new_y=y+avanzar*sin(angle);
Espero no equivocarme, es un poco tarde :P
pero aun asi solo calculo si hay obstaculo justo delante de mi protagonista
que pasa si un objeto me da de lado?
tendria que calcular si hay obstaculo dentro de un radio determinado
he encontrado esto...
WHILE ( map_get_pixel ( fpg_fondo , 7 , x+radio , y ) == obstaculo ) x--; END
WHILE ( map_get_pixel ( fpg_fondo , 7 , x-radio , y ) == obstaculo ) x++; END
WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y+radio ) == obstaculo ) y++; END
WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y-radio ) == obstaculo ) y--; END
y esto funcionaria bien si mi personaje fuera un circulo pero es un rectangulo
aun asi me hace cosas raras
aqui os dejo mi juego completo para que probeis si os apetece
http://www.mediafire.com/?q3cy45r29vm2m9x (http://www.mediafire.com/?q3cy45r29vm2m9x)
hay que encontrar otra solucion
Tienes que poner un color distinto para cada esquina del rectangulo.
las durezas estan en el scroll con forma de arboles, o lo que sea
el rectangulo es mi personaje
Lo mismo.
Si tu personaje es un rectángulo tendrás que hacer la operación que te dije 4 veces, una por cada esquina, por lo que primero tendrás que determinar la posición de cada esquina (puedes hacerlo por trigonometría o usando puntos de control).
Sé que puedes pensar que los obstáculos se pueden colar por entre medias, pero entonces tendrías que hacer una comprobación por cada pixel del contorno para que fuese perfecto y ya no se si compensa tanta perfección por el trabajo que lleva.
Aprenderás que, en ocasiones, no hay que ser tan perfeccionista y concederse algunas "facilidades". Si es tu primer mapa de durezas, a menos que tu personaje sea gigante, puedes comprobar sólo el centro, y si no, pues con 4 esquinas vale (aunque sea un círculo).
vale gracias por las respuestas
voy a trabajar en ello y ya os contare
no se si con el advance funcionará, pero si son coordenadas comunes, lo que podes hacer es comprobarlas de a 1 en 1 dentro de un bucle, for por ejemplo, y luego avanzar todas juntas hasta donde se haya comprobado.
No se si se entiende, pero seria como:
Si queres avanzar 5, pregunta primero si podes avanzar 1, despues 2... y asi hasta el 5, y recien ahi avanza los 5 o lo que puedas.
El tema de las durezas siempres es peliagudo, he visto tu mapa de durezas y te recomendaria que en vez de la dureza fuera el contorno, lo hagas como un cuadrado tendras menos posibilidades que se te "cuele" el tanque,ya que asi corres el riesgo que te valla sorteando el tanque los pixeles correctos y te encuentres con el tanque encima del arbusto...no se si me explicado...
puede que funciones un poco mejor pero aun asi me hce cosas raras, creo que es porque las durezas son muy pequeñas
mm, cuando usas durezas necesitas asegurarte que siempre se van a poder detectar. si las durezas son de un pixel, y usas un gr[afico de durezas 5 veces más pequeño que el scroll, entonces tienes que revisar cada 5 pixels de movimiento de scroll en tu mapa de durezas.
esto ya no debe darte problemas
[code language="bennu"]for (rd=radio-v;rd<radio;rd++)
for (ang=0;ang<360000; ang+=30000)
if (map_get_pixel ( fpg_fondo , 7 , x+get_distx(ang,rd) , y+get_disty(ang,rd) ) == obstaculo )
x-=get_distx(ang,radio-rd); y-=get_disty(ang,radio-rd);
END
end
end
[/code]
el protagonista te quedaría así:
[code language="bennu"]PROCESS protagonista()
PRIVATE
int latencia=2;
midolor;
id_texto_mivida;
freno=0;
rato;
radio=80;
rd;
ang;
PUBLIC
vidaprota=1000;
BEGIN
ctype = C_scroll;
file = fpg_fondo;
graph = 1;
size = 100;
x=400;
y = 400;
Z = -1;
LOOP
latencia--;
IF ( key ( _up ) )
v = v + 0.1;
IF ( v > 8 );
v = 8;
END
freno=1;
ELSEIF ( key ( _down ) and freno==1 )
v = v - 0.2;
IF ( v < 0 );
v = 0;
freno=0;
rato=0;
END
ELSEIF ( key ( _down ) and freno==0 and rato > 10 )
v = v - 0.1;
IF ( v < -6 );
v = -6;
END
ELSE
freno=0;
IF ( v < 0 );
v=v+0.1;
END
IF ( v > 0 );
v=v-0.1;
freno=1;
END
END
rato++;
advance(v);
IF ( key ( _left ) )
angle = angle + 3000;
ELSEIF ( key ( _right ) )
angle = angle - 3000;
END
//WHILE ( map_get_pixel ( fpg_fondo , 7 , x+radio , y ) == obstaculo ) x--; END
//WHILE ( map_get_pixel ( fpg_fondo , 7 , x-radio , y ) == obstaculo ) x++; END
//WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y+radio ) == obstaculo ) y++; END
//WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y-radio ) == obstaculo ) y--; END
//ponemos los limites para que el protagonista no salga de la pantalla
IF ( x > scroll
- .x0 + C_RESOLUCIONX-10 )
x = scroll[0].x0 + C_RESOLUCIONX-10;
END
IF (x < scroll[0].x0 + 10 )
x = scroll[0].x0 + 10;
END
IF ( y > scroll - .y0 + C_RESOLUCIONY-10 )
y = scroll[0].y0 + C_RESOLUCIONY-10;
END
IF (y < scroll[0].y0 + 10 )
y = scroll[0].y0 + 10;
END
IF ( rand ( 1 , 50 ) == 1 )
enemigo();
END
IF ( midolor = collision ( type disparomalo ) )
vidaprota = vidaprota - 1;
signal ( midolor , S_KILL );
END
id_texto_mivida = write ( 0 , x-scroll[0].x0 , ( y - scroll[0].y0 ) + 40 , 4 , "vida:" + vidaprota );
for (rd=radio-v;rd<radio;rd++)
for (ang=0;ang<360000; ang+=30000)
if (map_get_pixel ( fpg_fondo , 7 , x+get_distx(ang,rd) , y+get_disty(ang,rd) ) == obstaculo )
x-=get_distx(ang,radio-rd); y-=get_disty(ang,radio-rd);
END
end
end
FRAME;
delete_text ( id_texto_mivida );
END
END
[/code]
solo que debes encoger el radio, que la verdad lo he probado acá (no se cuánto tienes de radio), pero no pasaba entre los arbustos. saludos
si señor, muchas gracias, funciona de lujo
en serio, muchas gracias y hasta otra