我正在玩JavaScript,特别是使用类和诸如此类的模拟面向对象编程.
我知道这种实现继承的方式
MyClass.prototype = new AnotherClass();
Run Code Online (Sandbox Code Playgroud)
但我不满意,我不喜欢我需要如何调用构造函数AnotherClass
.所以我一直在玩,我想出了一些似乎有用的东西,基本上想要第二个意见.
function clone (obj)
{
function CloneFactory () {}
CloneFactory.prototype = obj;
return new CloneFactory();
}
MyClass.prototype = clone(AnotherClass.prototype);
Run Code Online (Sandbox Code Playgroud)
通过克隆原型,我们得到它的新副本并将其分配给MyClass
原型,以便更改继承的属性不会影响父类的原型属性.像这样会MyClass.prototype = AnotherClass.prototype
.
我运行压力测试,这在某些情况下更有效,即在父的构造函数中有很多代码时,否则它们大致相同.另一个好处(或者至少我认为它是有益的)是它允许在某种程度上隐藏子类的信息.任何特权方法和成员都不会被继承.
我忽视了一些重大陷阱吗?
我不是JavaScript专家,实际上我对JavaScript很新,所以我想对此有第二意见,因为我似乎无法通过Google找到任何东西.我不想实现糟糕的代码:)!
这只是我的好奇心,但更有效,递归还是循环呢?
给定两个函数(使用常见的lisp):
(defun factorial_recursion (x)
(if (> x 0)
(* x (factorial_recursion (decf x)))
1))
Run Code Online (Sandbox Code Playgroud)
和
(defun factorial_loop (x)
(loop for i from 1 to x for result = 1 then
(* result i) finally
(return result)))
Run Code Online (Sandbox Code Playgroud)
哪个更有效率?
所以我正在开发一款游戏,我需要绘制很多相同的对象.相同的形状,相同的尺寸,相同的颜色,只是不同的位置.
现在我的设置是这样的.
我有一些类Renderer
,想要在屏幕上绘制的对象可以调用static void addVertex(float x, float y, float z);
哪个将顶点存储到一个std::vector
.当每个人都完成绘图时static void draw();
,Renderer
调用所有东西都塞进VBO并绘制到屏幕上.
绘制看起来像这样:
void Renderer::draw() {
glBindBufferARB(GL_ARRAY_BUFFER_ARB, _quadID);
glBufferSubDataARB(GL_QUADS, 0, _vertexBuffer.dataSize(), _vertexBuffer.toArray());
glColorPointer(4, GL_FLOAT, 0, _colorBuffer.toArray());
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, _vertexBuffer.toArray());
glDrawArrays(GL_QUADS, 0, (_vertexBuffer.size() / 3));
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
_vertexBuffer.clear();
_colorBuffer.clear();
}
Run Code Online (Sandbox Code Playgroud)
为了我的目的或多或少地管理的课程的地点_vertexBuffer
和地点._colorBuffer
template <class T> Buffer
std::vector<T>
通过这种设置,我可以在开始放慢速度之前在屏幕上获得大约300个内容.现在一切都是GL_QUAD.请记住,我对OpenGL有点新鲜,如果以上是令人尴尬的,我很抱歉.
我怎样才能改善这一点来解释相似的多边形?
我想知道人们对使用Lisp缩进样式对C++,Java,JavaScript等语言的看法.我一直都是Python的粉丝以及如何在没有括号的情况下进行格式化.它对我来说非常紧凑和干净.我想知道用大括号语言做类似的事情是不是一个好主意.我最近一直在用JavaScript工作,所以我将以JavaScript为例.
通常,我使用这样的东西,例如
function doStuff (stuff1, stuff2) {
if (stuff1 === stuff2) {
doMoreStuff();
doEvenMoreStuff();
}
else {
takeABreak();
}
}
Run Code Online (Sandbox Code Playgroud)
这将成为
function doStuff (stuff1, stuff2) {
if (stuff1 === stuff2) {
doMoreStuff();
doEvenMoreStuff(); }
else {
takeABreak(); } }
Run Code Online (Sandbox Code Playgroud)
这是紧凑的,并且更多地集中在缩进而不是像Python这样的大括号.Lisp并不是一个特别漂亮的语言,但我有点喜欢这个,并且不认为它看起来太糟糕了,虽然当你有很多嵌套块同时结束时,事情会变得有点毛茸茸.我想要第二个意见.也许我不应该尝试在JavaScript中编写Python代码?
我正在尝试编写我自己的分离轴定理的实现,但是我很难让它按照我的要求准确地工作.我不能肯定地说,但是当形状周围的假想盒子像第一个形状碰撞时,它看起来就像是在发生碰撞.但第二种形状完美无缺.
这是方形的顶点数据(精确坐标):
vertsx = [ 200, 220, 220, 200 ]
vertsy = [ 220, 220, 200, 200 ]
Run Code Online (Sandbox Code Playgroud)
这是测试形状1(相对于鼠标)的顶点数据:
vertsx = [ -10, 0, 10, 10, -10 ]
vertsy = [ -10, -50, -10, 10, 10 ]
Run Code Online (Sandbox Code Playgroud)
最后这里是测试形状2(相对于鼠标)的顶点数据:
vertsx = [ -10, 0, 10, 10, -10 ]
vertsy = [ -10, -20, -10, 10, 10 ]
Run Code Online (Sandbox Code Playgroud)
仅为了澄清,已翻译的坐标是经过测试的坐标,这些坐标的形状已按照所示的坐标进行测试.
这是实际的功能.
function collisionConvexPolygon ( vertsax, vertsay, vertsbx, vertsby ) {
var alen = vertsax.length;
var blen = vertsbx.length;
// Loop for axes in …
Run Code Online (Sandbox Code Playgroud) 我正在开发一款东方风格的子弹地狱射击游戏.屏幕将完全充满子弹(所以实例化是我想要的),但我希望这可以在较旧的硬件上工作,所以我现在正在做一些事情,没有颜色,纹理,直到我弄清楚这一点.
glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES);
for (int i = 0; i < info.centers.size(); i += 3) {
glPushMatrix();
glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2));
glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2));
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES);
glPopMatrix();
}
Run Code Online (Sandbox Code Playgroud)
因为我希望这可以在旧硬件上工作,我试图避免着色器和诸如此类的东西.那里的设置让我失去了大约80个多边形.我希望从中得到至少几百个.info
是一个结构,它具有渲染的所有好处,除了一些向量之外没什么.
我对OpenGL很陌生,但我至少听过并尝试过所有可以完成的事情,但并不是说我对它很好.这个游戏是一个2D游戏,我从SDL切换到Opengl,因为它可以让一些更好的效果更容易.显然,SDL的工作方式不同,但我从未遇到过这个问题.
归结为此,我显然在这里做错了,那么如何才能正确实现旧硬件(OpenGL 1.x)的实例化呢?另外,给我任何提高性能的提示.
我一直想知道有没有办法让一个类成员不使用只能被它的类修改的getter?
我在想的是这样的.
class A
{
public:
crazyconst int x;
void doStuff()
{
// Gettin' stuff done
x = someValue; // OK
}
};
int main(int argc, char** argv)
{
A a;
a.x = 4; // ERROR
}
Run Code Online (Sandbox Code Playgroud)
所以它是可见的,但对于班级旁边的每个人来说都是只读的.
在过去的几天里,我一直在尝试为用户界面制作虚拟轨迹球,以实现类似3D图形的程序.但我遇到了麻烦.
看看数字和许多测试,问题似乎是我的四元数的实际连接,但我不知道或不这么认为.我以前从未使用四元数或虚拟轨迹球,这对我来说都是新手.我正在使用Quaternion
JOGL提供的类.我尝试制作自己的并且它起作用(或者至少就我所知道的那样)但是它完全混乱所以我只是选择了JOGL.
当我不连接四元数时,我看到的轻微旋转似乎就是我想要的,但当然只有它向任何方向移动一点时才很难.此代码基于OpenGL wiki上的Trackball Tutorial.
当我使用Quaternion
类的mult (Quaternion q)
方法时,图形几乎不会移动(甚至不会尝试连接四元数).
当我尝试使用Quaternion class's
add(Quaternion q)`方法来获得它的乐趣时,我得到的东西至少会旋转图形但不能以任何连贯的方式.当我移动鼠标时,它会随机出现并随机旋转.偶尔我会得到完全充满NaN的四元数.
在我的代码中,我不会显示其中任何一个,我迷失了如何处理我的四元数.我知道我想要增加它们,因为据我所知,它们是如何连接起来的.但就像我说我没有成功,我假设搞砸了我的代码中的其他地方.
反正,我的设置有Trackball
一类public Point3f projectMouse (int x, int y)
方法和public void rotateFor (Point3f p1, Point3f p2)
,哪里Point3f
是我做了一个类.另一个被调用的类Camera
有一个public void transform (GLAutoDrawable g)
方法,它将调用OpenGL方法根据轨迹球的四元数进行旋转.
这是代码:
public Point3f projectMouse (int x, int y)
{
int off = Screen.WIDTH / 2; // Half the width of the GLCanvas
x = x - objx_ - off; // …
Run Code Online (Sandbox Code Playgroud) 我一直在学习Scala,并决定使用json4s进行JSON解析.我决定使用XPath语法进行反序列化,并遇到了我从未见过的这种奇怪的语法.
val json = JsonMethods.parse("""{"meaningOfLife": 42}""")
val JInt(x) = json\"meaningOfLife"
Run Code Online (Sandbox Code Playgroud)
令我困惑的是这一点
val JInt(x) = ...
Run Code Online (Sandbox Code Playgroud)
我无法理解那里发生的事情,我甚至不知道如何搜索这种语法或者它的名称.谁能帮我吗?Scala是一种令人惊叹的语言,具有许多简洁的功能,我在其他语言(如C++和Java)中不习惯这些功能.
编辑
为了澄清,我很困惑,因为x
没有定义,但它以某种方式传递给函数或构造函数,然后被赋值给结果json\"meaningOfLife"
返回一个JValue
.
编辑2
经过一些研究和游戏后,我发现这与案例类有关.我能够运行以下代码.
case class MyCaseClass (x: Int)
val MyCaseClass(x) = new MyCaseClass(5)
println(x, x.getClass) // prints (5,int)
Run Code Online (Sandbox Code Playgroud)
在查看了一些代码之后,我对正在发生的事情有了很好的理解.
val MyCaseClass(x) = MyCaseClass(5)
Run Code Online (Sandbox Code Playgroud)
提取(缺少一个更好的术语)来自实例化和存储的Int
值,意思是类型.5
MyCaseClass
x
x
Int
在用于json4s一个代码JInt
是一个JValue
其中\
操作者的回报.所以JInt(x)
它正在取出BigInt
(存储在类中JInt
)并将其放入x
我收集的值中.
但我还有一个问题.这个过程叫什么?有没有任何文件?
c++ ×3
opengl ×3
javascript ×2
algorithm ×1
coding-style ×1
common-lisp ×1
indentation ×1
inheritance ×1
java ×1
math ×1
oop ×1
performance ×1
polygons ×1
quaternions ×1
recursion ×1
scala ×1
xpath ×1