Junio 22, 2018, 08:53:03 am

Autor Tema: Otra prueba con Winbgim (movimiento parabolico con rebote)  (Leído 1428 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado carlmycol

  • Yo vivo en CPH
  • ***
  • Mensajes: 1357
  • Sexo: Masculino
    • Ver Perfil
Otra prueba con Winbgim (movimiento parabolico con rebote)
« en: Agosto 15, 2014, 12:12:59 pm »
Acá les comparto un código que hice hace un bueeeen tiempo cuando probaba un poco con la librería Winbgim (en realidad con una emulación de esa librería para mingw)

Lo que hace es muy sencillo, dibuja un circulo y una linea desde su centro hasta el mouse, cuando haces click toma la dirección del mouse como direccion de velocidad inicial, y la distancia al centro del mouse como módulo de velocidad inicial. Cada vez que choca pierde cierta cantidad de energía cinética, y la componente perpendicular a la pared, toma dirección opuesta.

Luego de esto, puedes usar las flechas del teclado para darle velocidad a la pelota. Arriba le da velocidad hacia arriba, arriba le da velocidad hacia arriba.

La unica aceleración es la de la "gravedad", es decir la pelota puede quedarse con velocidad constante horizontal en el suelo, hasta que los choques en los extremos le hagan detenerse.

La gravedad en el programa es 5 (la constante gravity)
El porcentaje de energía cinética que le queda después de los choques es 0.8 (la constante loss)

Sí se que realmente está "poquito optimizado" y todo eso. Solo fue para probar un poco más con esa librería.

Luego posteo otras cosas que había hecho, y pronto unos buenos aportes más interesantes. Pido disculpas en la ausencia, no me conecto seguido pero en general los ando leyendo ;)

Puro vectores :) quien necesite compilar y no tenga Winbgim, por internet esta la emulación y hay muchos tutos, el paquete de DevC++ tambien sirve para el Codeblocks. Pero por cualquier duda simplemente comente ;)

Acá un screenshot


Código: (c) You are not allowed to view links. Register or Login
#include <stdio.h>
#include <stdlib.h>
#include <winbgim.h>
#include <math.h>
#include <windows.h>

#define blanco COLOR(255, 255, 255)
#define rojo COLOR(255, 0, 0)
#define azul COLOR(0,0,150)
#define ESC 27
#define radio 40
#define pi 3.1415
#define width 600
#define height 800
#define gravity 5
#define loss 1


struct _vector {
   float x=0;
   float y=0;
   float ang;
   float modulo;

};

struct circulo {
    _vector pos;
    _vector v; // Velocidad
    _vector vo;
    int rad=0; //Radio del círculo

};


void dibujar_circulo(circulo objeto, HDC a);

COORD CursorPosition;

int main()
{

    circulo objeto;
    HDC a;
    float vx, vy;
    POINT mouse;
    bool help=true;
    float i;
    _vector pos_int;
    char tecla;


    //setcolor(azul);
    initwindow (height,width);
    setbkcolor (azul);
    //bar(0, 0, width, height);



    objeto.pos.x = radio;
    objeto.pos.y = getmaxy()-radio;
    objeto.rad = radio;
    pos_int.x = radio;
    pos_int.y = getmaxy() - radio;


    while (help)
    {
        cleardevice();
        dibujar_circulo(objeto, a);
        GetCursorPos(&mouse);
        setcolor(blanco);
        line(objeto.pos.x, objeto.pos.y, mouse.x, mouse.y);

        if (ismouseclick(WM_LBUTTONDOWN))
        {
            objeto.vo.ang = - atan2(abs( mouse.y - objeto.pos.y), abs( mouse.x - objeto.pos.x));

            objeto.vo.modulo = sqrt(pow(  (abs( objeto.pos.y - mouse.y))   ,2)+pow(   (abs( mouse.x - objeto.pos.x))   ,2))/3;
            objeto.vo.x = abs(objeto.vo.modulo * cos(objeto.vo.ang));
            objeto.vo.y=  -abs(objeto.vo.modulo * sin(objeto.vo.ang));


            help=false;
        }

        delay(50);

    }

    i=0.1;
    objeto.v.x = objeto.vo.x;
    help=true;
    while(help)
    {

        cleardevice();

        objeto.v.y = gravity*i + objeto.vo.y;


        objeto.pos.x=objeto.v.x*i + pos_int.x;
        objeto.pos.y = objeto.v.y*i + pos_int.y;
        dibujar_circulo(objeto, a);

        if  ( (objeto.pos.x +radio > getmaxx() )  ) {
                objeto.v.x = -objeto.v.x*loss;
                objeto.vo.y = objeto.vo.y*loss;
                pos_int.y=objeto.pos.y;
                pos_int.x=getmaxx()-radio;
                i=0;
        }

        if ( ( (objeto.pos.x < radio) ) ) {
                objeto.v.x = -objeto.v.x*loss;
                objeto.vo.y = objeto.vo.y*loss;
                pos_int.y=objeto.pos.y;
                pos_int.x=radio;
                i=0;
        }

        if ( ((objeto.pos.y +radio > getmaxy() ))) {
                objeto.vo.y = -objeto.vo.y*loss;
                objeto.vo.x = objeto.vo.x*loss;
                pos_int.y=getmaxy() - radio;
                pos_int.x=objeto.pos.x;
                i=0;
        }
        if ( ( (objeto.pos.y < radio))) {
                objeto.vo.y = -objeto.vo.y*loss;
                objeto.vo.x = objeto.vo.x*loss;
                pos_int.y=radio;
                pos_int.x=objeto.pos.x;
                i=0;
        }


        i+=0.2;
        if (kbhit())
        {
            tecla = getch();
                switch(tecla)
                {
                    case KEY_UP:
                        objeto.vo.y-=15;
                        break;
                    case KEY_DOWN:
                        objeto.vo.y+=15;
                        break;
                    case KEY_LEFT:
                        objeto.v.x-=5;
                        break;
                    case KEY_RIGHT:
                        objeto.v.x+=5;
                        break;
                    case ESC:
                        help=false;
                    break;
                }

                pos_int.x=objeto.pos.x;
                pos_int.y=objeto.pos.y;
                i=0;


            }

        delay(20);

    }

    closegraph();
    return 0;
}



void dibujar_circulo(circulo objeto, HDC a)
{
    setcolor(blanco);
    //setfillstyle(SOLID_FILL, blanco);


    circle(objeto.pos.x, objeto.pos.y, objeto.rad);
    //fillellipse (objeto.pos.x, objeto.pos.y, radio, radio); <-- Quita circle y pon en fillelipse para tener un circulo relleno


    //a = GetWindowDC ( GetForegroundWindow () ); <- No tocar esto eh! Dejadlo en comentarios
    //FloodFill(a, objeto.pos.x, objeto.pos.y, blanco);
}

Saudos.
Pregúntate: ¿Qué estás dispuesto a sacrificar por alcanzar tus objetivos?


question
Grafico de movimiento parabolico

Iniciado por oyarzun

2 Respuestas
1945 Vistas
Último mensaje Noviembre 24, 2013, 12:53:50 pm
por jep
xx
El juego de la vida (librería winbgim)

Iniciado por carlmycol

0 Respuestas
1287 Vistas
Último mensaje Mayo 01, 2013, 07:25:57 pm
por carlmycol
xx
Echando un vistazo a la libreria winbgim (pseudojuego: shooter)

Iniciado por carlmycol

0 Respuestas
1433 Vistas
Último mensaje Febrero 09, 2013, 11:43:45 am
por carlmycol
question
Hack Mediante un troyano me piden el IP de la otra PC y que otra informacion?

Iniciado por doggfather

6 Respuestas
1885 Vistas
Último mensaje Mayo 26, 2007, 01:41:08 pm
por RaKi0N
question
movimiento

Iniciado por ninjahugo

0 Respuestas
1356 Vistas
Último mensaje Noviembre 22, 2010, 11:26:38 pm
por ninjahugo
exclamation
Stick en Movimiento v2.0

Iniciado por Grib_Jr.

9 Respuestas
4514 Vistas
Último mensaje Agosto 26, 2009, 04:42:38 pm
por SEKTOR
lamp
sensor de movimiento

Iniciado por bloodthirsty

9 Respuestas
1899 Vistas
Último mensaje Julio 25, 2007, 01:18:04 pm
por napoleon15
question
Duda con Movimiento del Raton EN c

Iniciado por Dr F

12 Respuestas
3114 Vistas
Último mensaje Noviembre 05, 2009, 06:45:32 pm
por .xAk.
question
Movimiento sobre button

Iniciado por Alexey-Volkov

4 Respuestas
1202 Vistas
Último mensaje Octubre 29, 2009, 08:45:44 am
por EddyW
xx
como agrego un gif con movimiento

Iniciado por Cagalas

3 Respuestas
2383 Vistas
Último mensaje Enero 19, 2006, 03:50:54 am
por Cagalas