PROGRAMACIÓ D'APLICACIONS EDUCATIVES AMB VISUAL BASICMÒDUL 7ENRERA
PRÀCTICA 1 2 3 4 5
 
Executar el programa m7p2.exe per conèixer el seu comportament.

Veure el llistat del codi del programa, m7p2.

Executar Visual Basic per editar el projecte (acabat): m7p2.vbp.


Com respondre al ratolí? Fem que la simulació sigui interactiva

El que pretenem aquí és convertir la imatge estàtica en un veritable simulador interactiu. Es tracta de poder moure la posició del focus, de l'objecte o de la lent i veure com influeix en la imatge.

Per moure aquests objectes farem servir la rata. Cal que bellugueu la rata damunt d'algun dels objectes, la lent, el focus, l'objecte o el terra.

Observeu que quan la rata està damunt d'un objecte que pot ser mogut, aquesta canvia del seu aspecte normal, un fletxa, a una doble fletxa esquerra-dreta o amunt-avall, segons cap on es pugui moure l'objecte. També surt la llegenda, Prem botó esquerra i arrossega.





Fase de disseny de la interfície d’usuari

Aquest projecte el desareu a C:\VBCurs\VBActivi\m7\p2 amb el nom m7p2.

Podem partir del programa de la pràctica anterior i ja tindrem el formulari creat i una part dels events i hi afegirem les modificacions.
  • Creeu el directori.
  • Copieu-hi els fitxers de la pràctica anterior m7p1.vbp i m7p1.frm
  • Crideu Visual Basic fent doble clic a m7p1.vbp.
  • Guardeu el fitxer, save as..., amb el nom m7p2.frm i guardeu el projecte amb l'altre nom m7p2.vbp.
  • Un cop fet això podeu borrar els fitxers m7p1.vbp, i m7p1.frm.


Fase de programació de respostes a events


Variables d'àmbit a tot el formulari
    Dim yT, xL, xO, yO, F, xI, yI As Integer
    Dim CalMoureObjecte, CalCanviarTamanyObjecte  As Integer
    Dim CalMoureLent, CalMoureFocus, CalMoureTerra As Integer

La primera línia ja hi era en el programa anterior.

Hi hem afegit les següents variables: CalMoureObjecte, CalCanviarTamanyObjecte, CalMoureLent, CalMoureFocus, CalMoureTerra que seran les que indicaran quin objecte cal moure quan arrosseguem amb la rata.


Procediments d'àmbit a tot el formulari

Per iniciar les dades fem servir el mateix procediment iniciar en el qual inicialitzarem les noves variables.
    Sub iniciar ()
      yT = 165
      xL = 300
      xO = 100
      yO = 50
      F = 100
    
      CalMoureObjecte = 0
      CalMoureLent = 0
      CalMoureFocus = 0
      CalCanviarTamanyObjecte = 0
      CalMoureTerra = 0
    End Sub
El procediment (mètode) Pintar, que és el que fa el dibuix, és el mateix que abans. L'única diferència és que el text Imatge canvia per Imatge virtual quan l'objecte està més a prop de la lent que el focus. Per veure aquest comportament cliqueu m7p2.exe i poseu la rata damunt l'objecte i arrossegueu-lo cap a la lent.
    Sub Pintar ()
      Dim r As Integer
    
      Cls
      
      'Terra
      ForeColor = QBColor(0)
      Line (0, yT)-(1300, yT)
      
      'Focus
      Line (xL + F, yT - 5)-(xL + F, yT + 5)
      Line (xL - F, yT - 5)-(xL - F, yT + 5)
      CurrentX = xL + F
      CurrentY = 20
      Print "Focus"
      
     'Lent
      ForeColor = QBColor(6)
      Line (xL, yT - 130)-(xL, yT + 130)
      Line (xL - 10, yT - 130 + 10)-(xL, yT - 130)
      Line (xL + 10, yT - 130 + 10)-(xL, yT - 130)
      Line (xL - 10, yT + 130 - 10)-(xL, yT + 130)
      Line (xL + 10, yT + 130 - 10)-(xL, yT + 130)
      CurrentX = xL
      CurrentY = 20
      Print "Lent"
      
      'Objecte
      ForeColor = QBColor(1)
      r = 1
      If yO < 0 Then
        r = -1
      End If
      Line (xO, yT)-(xO, yT - yO)
      Line (xO, yT - yO)-(xO - 10 * r, yT - yO + 10 * r)
      Line (xO, yT - yO)-(xO + 10 * r, yT - yO + 10 * r)
      CurrentX = xO
      CurrentY = 20
      Print "Objecte"
    
      'Feix de llum paral.lel al terra
      If Abs(F) > 1 Then
        Line (xO, yT - yO)-(xL, yT - yO), QBColor(2)
        Line (xL, yT - yO)-(1300, yT - yO + (1300 - xL) / F * yO), QBColor(2)
      End If
      
      'Feix de llum que passa pel focus
      If xL <> xO Then
        Line (xO, yT - yO)-(1300, yT - yO + (1300 - xO) / (xL - xO) * yO), QBColor(2)
      End If
      
      'Imatge
      If (xL - xO) <> F And xL <> xO Then
        ForeColor = QBColor(4)
        xI = (xO - xL * (xL - xO) / F) / (1 - (xL - xO) / F)
        yI = yT - yO + (xI - xO) / (xL - xO) * yO
        Line (xI, yT)-(xI, yI)
        Line (xI - 10 * r, yI - 10 * r)-(xI, yI)
        Line (xI + 10 * r, yI - 10 * r)-(xI, yI)
        If xI < 1300 And xI > 0 Then
          CurrentX = xI
          CurrentY = 20
          If xI < xL Then
            Print "Imatge virtual"
          Else
            Print "Imatge"
          End If
        End If
      End If
    End Sub

Mètodes associats a l'event Load

L'event Load és igual que abans, crida al procediment iniciar per iniciar les variables.
    Sub Form_Load ()
      iniciar
    End Sub

Mètodes associats a l'event Paint

És el mateix que abans, crida al procediment Pintar.
    Sub Form_Paint ()
      Pintar
    End Sub

Mètodes associats als events que controlen les accions de la rata. MouseDown, MouseMove, MouseUp.

Tema: MouseDown, MouseMove, MouseUp

El funcionament és el següent:

    - Si es mou la rata damunt dels objectes movibles i no està la rata clicada surt la llegenda: Prem botó esquerra i arrossega i es canvia el cursor. Aquest comportament el controla l'event MouseMove. Les variables: CalMoureObjecte, CalCanviarTamanyObjecte, CalMoureLent, CalMoureFocus, CalMoureTerra valen totes 0.

    - Si es clica a la vora d'un objecte movible, event MouseDown alguna de les variables: CalMoureObjecte, CalCanviarTamanyObjecte, CalMoureLent, CalMoureFocus, CalMoureTerra canvia a 1. Canvia la que correspon a l'objecte on s'ha clicat.

    - A partir d'aquí si es mou la rata, sense deixar de clicar, l'event MouseMove canvia de comportament i fa que la variable que defineix la posició de l'objecte canviï segons la posició de la rata, sempre i quan no es traspassin certs límits com el fet de no poder l'objecte atravessar la lent. Cada vegada que es mou la rata fa que es repinti tot l'escenari cridant al procediment Pintar i resulta aquesta sensació de moviment, és a dir la interacció buscada. El mètode Pintar recalcula la posició de les línies perquè totes estiguin on cal.

    - Finalment quan s'allibera el botó de la rata MouseUp l'únic que fa és posar a 0 totes les variables i així l'event MouseMove tingui el comportament inicial, el que té quan no es clica.

Tema: MousePointer

    Sub Form_MouseDown (Button As Integer, Shift As Integer, x As Single, Y As Single)
      If x > xO - 5 And x < xO + 5 Then
        If Y > yT - yO - 5 And Y < yT - yO + 5 Then
          CalCanviarTamanyObjecte = 1
          MousePointer = 7
        Else
          CalMoureObjecte = 1
          MousePointer = 9
        End If
      ElseIf x > xL - 5 And x < xL + 5 Then
        CalMoureLent = 1
        MousePointer = 9
      ElseIf x > xL + F - 5 And x < xL + F + 5 Then
        CalMoureFocus = 1
        MousePointer = 9
      ElseIf Y > yT - 5 And Y < yT + 5 Then
        CalMoureTerra = 1
        MousePointer = 7
      End If
    End Sub
    
    Sub Form_MouseMove (Button As Integer, Shift As Integer, x As Single, Y As Single)
      If CalCanviarTamanyObjecte = 1 Then
        yO = yT - Y
        Pintar
      ElseIf CalMoureObjecte = 1 Then
        If x < xL - 1 Then
          xO = x
          Pintar
        End If
      ElseIf CalMoureLent = 1 Then
        If x > xO + 1 Then
          xL = x
          Pintar
        End If
      ElseIf CalMoureFocus = 1 Then
        If x > xL Then
          F = x - xL
          Pintar
        End If
      ElseIf CalMoureTerra = 1 Then
        yT = Y
        Pintar
      Else
        MousePointer = 0
        If x > xO - 5 And x < xO + 5 Then
          If Y > yT - yO - 5 And Y < yT - yO + 5 Then
            MousePointer = 7
          Else
            MousePointer = 9
          End If
        ElseIf x > xL - 5 And x < xL + 5 Then
          MousePointer = 9
        ElseIf x > xL + F - 5 And x < xL + F + 5 Then
          MousePointer = 9
        ElseIf Y > yT - 5 And Y < yT + 5 Then
          MousePointer = 7
        End If
        If MousePointer <> 0 Then
          ForeColor = QBColor(4)
          CurrentX = 0
          CurrentY = 0
          Print "Prem butó esquerra i arrossega"
        Else
          ForeColor = QBColor(15)
          CurrentX = 0
          CurrentY = 0
          Print "Prem butó esquerra i arrossega"
        End If
      End If
    End Sub
    
    Sub Form_MouseUp (Button As Integer, Shift As Integer, x As Single, Y As Single)
      CalCanviarTamanyObjecte = 0
      CalMoureObjecte = 0
      CalMoureLent = 0
      CalMoureFocus = 0
      CalMoureTerra = 0
      MousePointer = 0
    End Sub