|
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 interactivaEl 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’usuariAquest 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.
Fase de programació de respostes a eventsVariables 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 SubEl 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 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 |