C/Visual C - Resultado ilógico

 
Vista:
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Resultado ilógico

Publicado por Josema (17 intervenciones) el 27/02/2017 00:40:17
Buenas, estaba trabajado en mi programa cuando al intentar añadir colisiones entre el personaje y el enemigo, me daba un resultado que no llego a entender. Decidí hacerlo mediante círculos, asi que cojo los 2 radios, y las coordenadas X e Y de cada centro, y habrá colisión si la suma de los radios es mayor que la distancia entre sus centros. Pues bien, al no funcionar esto, hice un printf por curiosidad de lo que salia al sumar los radios:

1
2
3
4
5
6
x1=personaje1.px; x2=enemigo1.px; y1=personaje1.py; y2=enemigo1.py;
r1=100.0;
r2=75.0;
sr=r1+r2;
dc=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
if (sr>dc) colision=1;


Siendo enteros me daban numeros enormes como 82149283, pero al ponerlo en float he conseguido arreglar la suma de los radios, que me da 176, algo es algo. DC me da un numero gigante todavía.

Estoy abierto a todas las ideas, las mias se me acaban. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Dionicio
Val: 91
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Dionicio (22 intervenciones) el 27/02/2017 04:11:19
Cuidado si la variable dc no está inicializada aveces es causa de muchos dolores de cabeza. De lo contrario prueba cual es el resultado que devuelve la suma de las potencias en la operación dc = ...

Sino es nada de lo anterior mencionado deja parte de tu código tal vez así te echemos una mano. :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por agustin (272 intervenciones) el 27/02/2017 10:18:34
Sin ver el resto del código es dificil.
De momento si yo hago esto:
1
2
3
4
5
6
7
8
9
#include  <stdio.h>
 
int main ()
{
	float r1=100.0, r2=75.0, sr;
	sr=r1+r2;
	printf ("%f",sr);
	return 0;
}
A mi me da 175.000000 y no me da resultados extraños.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Josema (17 intervenciones) el 27/02/2017 10:47:28
Pues yo basicamente haciendo eso me da numeros desorbitados :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Josema (17 intervenciones) el 27/02/2017 10:28:48
Gracias por responder, sigue sin funcionar, cada vez que compilo me da un valor diferente y muy alto, como si fuese 'basura'. No quería poner todo el codigo porque eran unas 100 lineas y no queria molestar mucho, pero bueno si veis algo que yo no viene bien:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "Pantalla.h"
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main(int argc, char **argv)
{
    Pantalla_Crea("pantalla",800,600);
    Imagen fondo=Pantalla_ImagenLee("fondo.bmp",0);
    Imagen personaje=Pantalla_ImagenLee("personaje.bmp",1);
    Imagen enemigo=Pantalla_ImagenLee("enemigo.bmp",1);
    int terminado = 0;
    char texto[100];
    double x1,x2,y1,y2,r1,r2,sr,dc;
 
 
 
    srand(time(NULL));
 
    FILE *fichero;
    fichero = fopen("puntuaciones.txt", "rb+");
 
    int RA;
 
    struct PersonajeRep{
        int h,w,px,py,vy,vx;
        Imagen i;
    };
 
    struct enemigoRep{
        int h,w,px,py,vx,vy,dx,dy;
        Imagen i;
    };
 
    struct PersonajeRep personaje1;
    personaje1.h=200;
    personaje1.w=150;
    personaje1.px=600;
    personaje1.py=450;
    personaje1.vx=40;
    personaje1.vy=40;
    personaje1.i=personaje;
 
    struct enemigoRep enemigo1;
    enemigo1.h=150;
    enemigo1.w=150;
    enemigo1.px=10;
    enemigo1.py=10;
    enemigo1.dx =10;
    enemigo1.dy =10;
    enemigo1.i=enemigo;
 
 
    while (Pantalla_Activa() && !terminado) //Primera pantalla
    {
        if (Pantalla_TeclaPulsada(SDL_SCANCODE_RETURN)) terminado = 1;
        Pantalla_DibujaImagen(fondo,0,0,Pantalla_Anchura(),Pantalla_Altura());
        Pantalla_DibujaTexto("Buenos dias.",100,100);
        Pantalla_DibujaTexto("Presiona 'Return' para empezar",110,130);
        Pantalla_ColorTrazo(0,0,255,255);
        Pantalla_Actualiza();
        Pantalla_Espera(40);
    }
 
    int t1=time(NULL);
    int colision=0;
    while ((Pantalla_Activa()) && (!(Pantalla_TeclaPulsada(SDL_SCANCODE_SPACE))) && (colision=0)) //Segunda pantalla
    {
        //Movimientos del personaje
        if (Pantalla_TeclaPulsada(SDL_SCANCODE_LEFT) && (personaje1.px>0)) personaje1.px=personaje1.px-personaje1.vx;
        if (Pantalla_TeclaPulsada(SDL_SCANCODE_RIGHT) && (personaje1.px<650)) personaje1.px=personaje1.px+personaje1.vx;
        if (Pantalla_TeclaPulsada(SDL_SCANCODE_UP) && (personaje1.py>0)) personaje1.py=personaje1.py-personaje1.vy;
        if (Pantalla_TeclaPulsada(SDL_SCANCODE_DOWN) && (personaje1.py<501)) personaje1.py=personaje1.py+personaje1.vy;
 
        //Movimiento autonomo del enemigo
        enemigo1.px=enemigo1.px+enemigo1.dx;
        enemigo1.py=enemigo1.py+enemigo1.dy;
        if (enemigo1.px >Pantalla_Anchura()-enemigo1.w || enemigo1.px<1 ) enemigo1.dx= -enemigo1.dx;
        if (enemigo1.py >Pantalla_Altura()-enemigo1.w || enemigo1.py<1) enemigo1.dy= -enemigo1.dy;
 
        //intento de colisiones
        x1=personaje1.px; x2=enemigo1.px; y1=personaje1.py; y2=enemigo1.py;
        r1=100.0;
        r2=75.0;
        sr=r1+r2;
        dc=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
        if (sr>dc) colision=1;
 
        Pantalla_DibujaImagen(fondo,0,0,Pantalla_Anchura(),Pantalla_Altura());
        Pantalla_DibujaImagen(personaje1.i,personaje1.px,personaje1.py,personaje1.h,personaje1.w);
        Pantalla_DibujaImagen(enemigo1.i,enemigo1.px,enemigo1.py,enemigo1.h,enemigo1.w);
 
        int t2=time(NULL);
        int t=t2-t1;
        sprintf(texto,"%d s.",t);
        Pantalla_DibujaTexto(texto,100,100);
        Pantalla_Actualiza();
        Pantalla_Espera(40);
    }
 
    Pantalla_ImagenLibera(fondo);
    Pantalla_ImagenLibera(personaje);
    Pantalla_ImagenLibera(enemigo);
    Pantalla_Libera();
    int t2=time(NULL);
    int t=t2-t1;
    fscanf(fichero,"%d",&RA);
    if (RA<t)
        {
            fseek ( fichero, 0 , SEEK_SET );
            fprintf(fichero,"%d",t);
            printf("¡¡¡NUEVO RECORD!!!\t");
        } else
            {
            printf("Lo sentimos, no has establecido ningun record\n");
            }
 
    printf("La puntuacion es: %d\n",t);
    printf("sr es: %d y dc es: %d \n",sr,dc);
 
    fclose(fichero);
    return 0;
}








Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por agustin (272 intervenciones) el 27/02/2017 21:51:27
Aparentemente todo esta bien pero sin tener todo el código para poder compilar y tracear es muy difícil.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Josema (17 intervenciones) el 27/02/2017 22:21:40
Eso es lo que yo no entiendo, que es muy raro que falle. Para poder compilarlo te faltaran las imagenes, pantalla.h , pantalla.c y poco más.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por agustin (272 intervenciones) el 28/02/2017 11:33:14
Claro, lo único que se me ocurre es que de alguna manera pises la memoria de alguna de esas variable pero no se ve a simple vista. Haces muchos usos de funciones propias que al no tenerlas no puedo compilar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

re: Resultado ilógico

Publicado por Tom (619 intervenciones) el 28/02/2017 12:45:30
Probablemente lo que esté mal sea tu algoritmo, y (casi seguro) el printf que usas para las trazas.

Para pow() y sqrt() haz cast explícito a double si algún argumento no lo es.

Yo en tu lugar evitaría pow(), que puede producir desbordamientos, y usaría cálculos simples basados en la diferencia de x y de y (no necesitas los radios, porque ya tienes w y h).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

re: Resultado ilógico

Publicado por Chema (234 intervenciones) el 28/02/2017 16:26:43
Creo que x2 es menor que x1. al aplicarlo a una resta el resultado es el que comentas. En la resta el numero mayor debe ser el primero ,mayor - menor

dc=sqrt(pow(x2-x1,2)+pow(y2-y1,2));
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Josema (17 intervenciones) el 28/02/2017 16:49:35
No creo que sea por eso Chema, al elevarlo al cuadrado siempre sera positivo, no se
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Josema (17 intervenciones) el 28/02/2017 16:48:55
Haciendo el cast y evitando el pow sigue igual.. :/ si de aqui al jueves no doy con la tela iré el jueves a pedir una tutoría
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por agustin (272 intervenciones) el 28/02/2017 17:09:47
Pow y sqrt no son el problema porque cualquier número elevado al cuadrado da un resultado positivo además luego es una suma con lo que sqrt tampoco recibirá jamás un número negativo al no ser que se desborde antes.
Algo raro estas haciendo y sin poder tener todo el proyecto para tracear es imposible. Además estaría bien ver como colocas el printf y donde.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 29
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

re: Resultado ilógico

Publicado por Josema (17 intervenciones) el 02/03/2017 23:47:46
Para quien lo quiera saber, o simplemente por curiosidad, el fallo estaba en:

while ((Pantalla_Activa()) && (!(Pantalla_TeclaPulsada(SDL_SCANCODE_SPACE))) && (colision=0))

colision=0 se le esta asignando el 0 a colision, lo que se pretendia era darle la condicion de 0, es decir, colision==0


Gracias a todos por vuestro tiempo. :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar