轻松学习E-Prime(三十四):制作按钮?读取MouseResponseData中被试点击的位置

这一节我们准备制作按钮,也就是让用户能用鼠标来点击的按钮。比如说做选择题,我们让被试操纵鼠标来点击。
首先,我们要设置鼠标为显示的,我们可以在Device中设置:


设置鼠标为实验中可见

当然啦,我们也可以在实验过程中通过代码进行设置。如果您希望在实验过程中展示或隐藏鼠标,就必须用代码,方法如下:

Mouse.ShowCursor True

加入这一句到你想要显示鼠标的地方就可以了。相应的,隐藏自然就是把True改为False。
这一步很容易,接下来,问题的关键在于我们要接收被试点击鼠标的地方,判断是否点击到了物体。这一点,在E-Prime中提供了方法。
我们首先加入一个Slide1控件,在里面加入我们想要问的问题,以及相应的选项。比如说下面是我的“示例程序”里的无聊问题:


示例程序

正确答案是C。(顺便说一下,卡希尔将军是我大学时的外号)
那么我们要达到的效果就是,当被试用鼠标点击的时候,点到ABC三个选项框就提示错误,点到C提示正确,点到其他地方不做任何反应。
首先,我们要在Slide1中设置接收鼠标按键。

在Slide1中设置其接收鼠标按键

如果你想只允许被试按左键,就设定Allowable为1。
接下来先安排一下要用到的控件:
示例程序中的树状图

然后按步骤完成:
1.把FeedbackDisplay1的Input Object Name改为Slide1。
2为了方便代码的书写,我修改了Slide1中各控件的Name属性:
Slide1中各控件的Name属性

Name属性为“Text1”的SlideText对应的是显示问题的那个SlideText。自然,“OptionA”对应A选项,“OptionB”对应B选项,依次类推。
3.在Inline1中输入下列代码:

Mouse.ShowCursor True
Dim theState as SlideState
Set theState = Slide1.States ("Default")
Dim ptMouse As Point
Dim strHit As String
Mouse.GetCursorPos ptMouse.x, ptMouse.y
strHit = theState.HitTest(ptMouse.x, ptMouse.y)
if strHit = "Default" or strHit = "Text1" then
goto Label1
end if
If strHit = "OptionC" Then
Slide1.ACC=1
else
Slide1.ACC=0
End If


对应结果

Mouse.ShowCurser前面说过,用来设定鼠标是否显示。
接下来我们定义了一个名为theState的SlideState,SlideState就是我常说的Slide的页面,并设定它为Slide1中的Default页面。我们这次主要要用到的是其HitTest方法。该方法能检测某个点是否包含某个控件,并返回包含的控件的Name属性(如果没学过编程,“返回”一词你可以姑且可以这么理解。就是会会变成一个变量,然后你可以赋值给另一个变量)。当然它还有其他属性和方法,见下方。

SlideState类中包含的属性和方法

我们又定义了一个Point类的实例,名为ptMouse;还定义了一个string名为strHit。
Point类用来表示一个点,它有x属性和y属性。
接下来这句:

Mouse.GetCursorPos ptMouse.x, ptMouse.y

我们使用了鼠标的GetCursorPos方法,该方法的作用是,把鼠标当前的点分别赋给后面两个参数。在这个句子里,我们赋给了ptMouse的x属性和y属性。除非你有多个鼠标,否则鼠标默认名称Mouse。
当然,你也可以另外定义两个整数,比如:

Dim px as integer, py as integer
Mouse.GetCursorPos px, py

然后你调用GetCursorPos方法的时候,px和py的值就变成你鼠标当前坐标的x值和y值。比如你的鼠标这是在坐标为198,201的地方。那么px就变成198,py就变成201。同理,我们这次写的代码,会让ptMouse的x属性和y属性为鼠标点击时候的坐标的x值和y值。因为我们是在被试按下鼠标按键的瞬间,调用了GetCursorPos方法。
下一句:

strHit = theState.HitTest(ptMouse.x, ptMouse.y)

非常简单,我们调用了theState这个SlideState的HitTest方法,检查了ptMouse.x, ptMouse.y这一屏幕上的坐标是否有控件。如果有,就把控件的名字赋给strHit。
比如说被试点了Text1,strHit就是“Text1”;被试点了选项A,strHit就是“OptionA”(因为我设置其Name属性为OptionA);用户点了空白处,strHit就是“Default”。
因此接下来的这段语句:

if strHit = "Default" or strHit = "Text1" then
goto Label1
end if

我们判断了被试是不是点击了空白处或者点击了我们显示问题用的SlideText。如果是,就goto Label1,重来;如果不是,就说明用户点击了选项,程序继续。
然后接下来我们判断用户是否点击了正确的选项:

If strHit = "OptionC" Then
Slide1.ACC=1
else
Slide1.ACC=0
End If

ACC属性表示是否是正确的,1表示正确,0表示错误。通过设置ACC属性,来让FeedbackDisplay1显示我们要的内容。各个能记录反应的控件都有这个属性。
所以,如果strHit是“OptionC”的话,说明被试点击了选项C,那么我们设置Slide1的ACC属性为1,表示正确,FeedbackDisplay1就会显示“Correct”;否则说明点击了其它选项,ACC设为0,FeedbackDisplay1显示“Incorrect”。
看到这里你明白了吗?原来FeedbackDisplay是通过检查Input Object Name所表示的Object的ACC属性来判断自己要显示什么内容的。只不过过去我们没有使用代码来亲自设置,而是E-Prime通过我们设置的接收反应按键的控件的Correct属性来自动进行了判断。(本节可参考“示例实验3-14”

阶段练习

①设计一个实验。实验一共会在屏幕上显示10次刺激,每次刺激,屏幕上都显示一个问题和四个选项。四个选项里只有一个是正确的,被试必须移动鼠标,点击正确的选项。点击之后给予选择的结果被试是否正确的反馈。
②将上一题做如下修改:四个选项可能有多个是正确的,也可能没有正确选项。被试必须选择出他/她认为正确的那些选项,并点击“确定”按钮,之后给予正负反馈。被选中的Object通过把背景色变成红色来提示被选中。


此为开源免费教程。教程所用资源等请访问目录或专题,或者Github页面:
https://www.jianshu.com/p/5bbf1c274370
https://github.com/zkx654321/Learn-E-Prime-Easily

你可能感兴趣的:(轻松学习E-Prime(三十四):制作按钮?读取MouseResponseData中被试点击的位置)