14 de febrero de 2016

Un Ping-Pong en VFP

A raiz de la consulta de que si se puede hacer rebotar un objeto dentro de un formulario, envío este código para los que estén interesados.

Funciona con un par de variables, por supuesto que solo es la base del movimiento de un objeto.

Obs: La idea principal para el movimiento del objeto es de "Edwin Macz" un compañero de trabajo.

Este es el código:
PUBLIC oForm1
oForm1 = NEWOBJECT("Form1")
oForm1.SHOW(1)
RETURN

DEFINE CLASS Form1 AS FORM
  HEIGHT = 307
  WIDTH = 447
  DOCREATE = .T.
  AUTOCENTER = .T.
  CAPTION = "Ping-Pong"
  BACKCOLOR = RGB(0,128,255)
  NAME = "Form1"
  ADD OBJECT bola AS SHAPE WITH ;
    TOP = 0, ;
    LEFT = 0, ;
    HEIGHT = 23, ;
    WIDTH = 26, ;
    CURVATURE = 75, ;
    BACKCOLOR = RGB(255,255,0), ;
    NAME = "bola"
  ADD OBJECT timer1 AS TIMER WITH ;
    TOP = 0, ;
    LEFT = 420, ;
    HEIGHT = 23, ;
    WIDTH = 23, ;
    NAME = "Timer1"
  ADD OBJECT barra AS COMMANDBUTTON WITH ;
    TOP = 200, ;
    LEFT = 171, ;
    HEIGHT = 13, ;
    WIDTH = 108, ;
    CAPTION = "", ;
    BACKCOLOR = RGB(0,0,160), ;
    NAME = "barra"
  ADD OBJECT lblb2 AS COMMANDBUTTON WITH ;
    TOP = 200, ;
    LEFT = 171, ;
    HEIGHT = 13, ;
    WIDTH = 4, ;
    CAPTION = "", ;
    BACKCOLOR = RGB(128,0,0), ;
    NAME = "LblB2"

  PROCEDURE INIT
    THISFORM.timer1.INTERVAL = 5
    PUBLIC x AS INTEGER, Y AS INTEGER, vCont AS INTEGER
    STORE 1 TO x, Y
    vCont = 0
  ENDPROC

  PROCEDURE MOUSEMOVE
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    THISFORM.barra.LEFT = nXCoord
    THISFORM.lblb2.LEFT = nXCoord
  ENDPROC

  PROCEDURE timer1.TIMER
    THISFORM.bola.LEFT = THISFORM.bola.LEFT + x
    THISFORM.bola.TOP = THISFORM.bola.TOP + Y
    vcol1 = INT(RAND()*256)
    vcol2 = INT(RAND()*256)
    vcol3 = INT(RAND()*256)
    IF THISFORM.bola.LEFT + THISFORM.bola.WIDTH => THISFORM.WIDTH
      x = -1
    ELSE
      IF THISFORM.bola.LEFT = 0
        x = 1
      ENDIF
    ENDIF
    IF THISFORM.bola.TOP + THISFORM.bola.HEIGHT => THISFORM.HEIGHT
      Y = -1
    ELSE
      IF THISFORM.bola.TOP = 0
        Y = 1
      ENDIF
    ENDIF
    IF THISFORM.bola.TOP + THISFORM.bola.HEIGHT = THISFORM.barra.TOP ;
        AND THISFORM.bola.LEFT + THISFORM.bola.WIDTH >= THISFORM.barra.LEFT ;
        AND THISFORM.bola.LEFT <= THISFORM.barra.LEFT + THISFORM.barra.WIDTH
      THISFORM.bola.BACKCOLOR = RGB(vcol1,vcol2,vcol3)
      Y = -1
      IF THISFORM.lblB2.WIDTH < THISFORM.barra.WIDTH
        THISFORM.lblB2.WIDTH = THISFORM.lblB2.WIDTH + 10
      ELSE
        MESSAGEBOX("Finalizado")
        THISFORM.RELEASE
      ENDIF
    ENDIF
    IF THISFORM.bola.TOP = THISFORM.barra.TOP + THISFORM.barra.HEIGHT ;
        AND THISFORM.bola.LEFT + THISFORM.bola.WIDTH >= THISFORM.barra.LEFT ;
        AND THISFORM.bola.LEFT <= THISFORM.barra.LEFT + THISFORM.barra.WIDTH
      THISFORM.bola.BACKCOLOR=RGB(vcol1,vcol2,vcol3)
      Y = 1
      IF THISFORM.lblB2.WIDTH >10
        THISFORM.lblB2.WIDTH = THISFORM.lblB2.WIDTH - 10
      ENDIF
    ENDIF
  ENDPROC
ENDDEFINE



Otto Pérez

1 comentario :

  1. Disculpa ..soy principiante y pues tengo mis dudas basicamente en el segnificado de ciertas comandos y/o variables ..como por ejemplo en la codificacion de la bola que es= "Vcol1"? no se si serias tan amable de explicarme cual es la funcion de eso.. y que es "x" y "Y" porque no la declaraste o al menos no lo vi.
    Muchas gracias (si me funciono solo quisiera saber un poco sobre cada cosa que utilizaste especialmente en la codificacion de la bola)

    ResponderEliminar