我正在使用scala swing编写scala应用程序.MouseClicked只要点击鼠标,我就可以收听通知,但我怎么知道按下了哪个按钮.文档非常糟糕,所以我查看了Java文档MouseEvent,其中说可以从修饰符字段检索密钥,所以我尝试输出scala MouseClicked事件的修饰符字段,结果证明是整数, 0表示左键单击,鼠标键3和鼠标键4表示256,右键单击256.
如果我只需要知道左右点击之间的区别,它看起来会起作用,但是我可以确定修改器的所有方式都是这样的吗?什么都没有说明,而且据我所知,修饰符可能会被其他东西影响,而不仅仅是按下了哪个鼠标键.我也想知道左键单击鼠标按钮3和鼠标键4之间的区别.我不认为用户希望它们与左键单击做同样的事情.
在scala文档中有一个MouseButtonEvent,这可以用于任何事情吗?文档没有说明它的作用.
我正在尝试学习OpenGL并遵循以下内容:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
直到他们开始将矩阵传递到顶点着色器以将三角形转换为我正在跟随的绘图的位置.
这是着色器程序,它开始出错:
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main(){
vec4 v = vec4(vertexPosition_modelspace,1); // Transform an homogeneous 4D vector
gl_Position = MVP * v;
//mat4 M = mat4(
// vec4(1.0, 0.0, 0.0, 0.0),
// vec4(0.0, 1.0, 0.0, 0.0),
// vec4(0.0, 0.0, 1.0, 0.0),
// vec4(0.0, 0.0, 0.0, 1.0)
//);
//gl_Position = M * v;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用注释掉的代码而不是行gl_Position = MVP * v;,那么一切正常.屏幕上绘有一个三角形.我也可以改为M矩阵来移动三角形并缩放它.
为了使事情尽可能简单,我只是将顶点着色器传递给MVP字段中的单位矩阵.代码如下所示:
mat4x4 MVP;
mat4x4_identity(MVP);
int …Run Code Online (Sandbox Code Playgroud) 我试图理解这个功能反应式编程是如何工作的,我遇到了一个问题.我正在尝试创建一个boid模拟,但是我开始慢慢地,我现在已经定义了一个boid作为一个起始位置并从一个位置到一个位置创建信号函数的函数,其中输入是点它正在走向,输出是当前位置:
type Position2 = Vector2 Float
boid :: Position2 -> SF Position2 Position2
boid s = loop (arr (uncurry seek) >>> integral >>> arr (^+^ s) >>> arr dup)
Run Code Online (Sandbox Code Playgroud)
seek函数需要两个输入(因为循环).当前位置和目标位置.然后它只是创建一个从当前位置指向目标位置的矢量,其幅度为50即速度.然后积分速度并添加起始位置.最后,信号被分成两部分,因此一个可以成为输出,另一个可以循环回到搜索功能.
现在我可以像这样定义boids:
aBoid = constant (vector2 500 500) >>> (boid (vector2 600 60))
bBoid = aBoid >>> (boid (vector2 3 4))
Run Code Online (Sandbox Code Playgroud)
这里aBoid寻求点(500,500)和bBoid寻求aBoid.
我的问题是,当我想要两个boid相互寻求时.当我这样做:
aBoid = bBoid >>> (boid (vector2 600 60))
bBoid = aBoid >>> (boid (vector2 3 4))
Run Code Online (Sandbox Code Playgroud)
该程序只是打印:ProgramName: <<loop>>我假设它意味着它进入无限循环.
我也试过使用这样的par函数:
sim :: SF …Run Code Online (Sandbox Code Playgroud) 假设我使用monad在Haskell中创建了一种嵌入式领域特定语言。例如,使用状态monad实现的一种简单的语言就可以将值压入和弹出堆栈:
type DSL a = State [Int] a
push :: Int -> DSL ()
pop :: DSL Int
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用do表示法编写小型堆栈处理程序:
program = do
push 10
push 20
a <- pop
push (5*a)
return a
Run Code Online (Sandbox Code Playgroud)
但是,我真的很想从REPL(特别是GHCi,如果愿意的话,愿意使用其他)交互地使用我的DSL。
不幸的是,像这样的会议:
>push 10
>pop
10
>push 100
Run Code Online (Sandbox Code Playgroud)
无法立即工作,这可能是合理的。但是我真的认为能够做些类似的事情会很酷。国家单子党的工作方式并不容易做到这一点。您需要建立DSL a类型,然后进行评估。
有没有办法做这样的事情。在REPL中逐渐使用monad吗?
我一直在寻找的东西一样操作,MonadPrompt和MonadCont我排序得到的感觉可能的可以用来做这样的事情。不幸的是,我所看到的例子都没有解决这个特定问题。
正如标题所说,当用表格在scala中创建一个多维序列时,最内层或最外层的序列是1.维度吗?
例如,在二维向量v中,v(2)将给出1或2维的第二个元素吗?
我正在尝试解析sgf文件(描述go游戏的文件).在这些文件中有表单的键值对(在sgf规范中,它们被称为属性id和属性值,但我使用键和值,希望人们在阅读标题时知道我在说什么):
key[value]
Run Code Online (Sandbox Code Playgroud)
要么
key[value1][value2]...[valuen]
Run Code Online (Sandbox Code Playgroud)
也就是说,可能有一个或多个值.问题是值的类型取决于键.因此,例如,如果关键是B(在游戏中玩黑石).该值应该是由两个字母描述的坐标,例如:B[ab].它也可能是关键是AB(用于添加一些黑色宝石,用于设置棋盘),然后该值是一个坐标列表,如下所示:AB[ab][cd][fg].也可能是关键是C(评论).然后该值只是一个字符串C[this is a comment].
当然,这可以通过类型来描述
type Property = (String, [String])
Run Code Online (Sandbox Code Playgroud)
但我认为拥有类似的东西会更好
data Property = B Coordinate | AB [Coordinate] | C String ...
Run Code Online (Sandbox Code Playgroud)
或者也许其他类型更好地利用类型系统,并且不需要我一直转换为字符串和从字符串转换.
问题是,然后我需要一个解析器,根据键类型返回一个不同的值类型,但我认为这会导致类型问题,因为解析器只能返回一种类型的值.
你会如何解析这样的东西?