Tip:
Highlight text to annotate it
X
>> DAVID马兰:让我们写一个程序 涉及一个窗口和一个圆
圆来回弹跳 关闭左和右
该窗口的边缘。
要做到这一点,让我们用斯坦福大学 可移植库,让我们先
包括gevents.h这样我们就可以 侦听鼠标移动。
然后,让我们的include gobjects.h使 我们可以声明类的东西椭圆形或
圈子,真的。
然后,让我们有gwindow.h使 我们有一个图形窗口
一切。
>> 让我们宣布主按照通常的方式。
而且我们现在声明并实例 或者创建窗口,GWindow -
我们会打电话给变量窗口 -
得到newGWindow。
我们会随便让 320像素×240像素。
>> 让我们接下来实例化一个圆圈。
但要实例化这个圈子里, 我们需要做更多的工作。
尤其是,让我们填写这个圈子 这样,整个的是
黑色,而不仅仅是 其轮廓。
GOval -
我们会打电话给它圈 -
得到newGOval。
我们会把这个椭圆形的0,110,我们将 通过使椭圆20个像素宽
20个像素高 - 换句话说,一个 直径为20或10的半径。
>> 现在,让我们设置圆的颜色 要报价,引文结束,“黑”。让我们
现在设置它填补 通过指定正确的。
现在最后,让我们的圈子加入 窗口如下,据此,
后者加入到前者。
>> 现在让我们来声明一个双。
我们会打电话给它的速度。
而有些武断,让我们说, 这个圈子的速度将
2.0,换言之,2个像素 对于每一个时间单位。
现在让我们来故意 导致一个无限循环。
>> 那么如何让这个圈子 来回反弹?
那么让我们假设这个循环内 对于每一个时间单位,我们是
要移动的圆圈只是一点点 根据2个像素的速度位
每单位时间。
但不断,我们将不得不 检查圆接触
在屏幕或左的右边缘 屏幕边缘的,因为如果是这样,我们
需要反弹,可以这么说。
>> 如何实现 弹跳的概念?
那么,如果我们要在2个像素 每单位时间的权利,弹离
右边缘,我们可以简单地逆转 这是每单位负2个像素
的时间,从而否定 速度。
所以,事实上,弹跳比较 简单。
>> 让我们首先移动的圆圈这么多 沿x轴的像素,通过该
许多像素沿y轴。
换句话说,我们不希望它 沿y轴方向移动的。
我们只希望它反弹 前后左右。
>> 而且我们现在这个循环中检查是否 x坐标的圆的加
圆的宽度大 大于或等于
窗口宽度 -
换句话说,如果圆的位置 加圆圈的宽度
本身现在是过去的边缘 窗外,我们最好
更好地扭转我们的速度 -
速度得到负的速度,从而 翻转了积极的
负或负到正。
但是,如果圆移动 从右到左的,因此它打
左边缘?
换句话说,如果x坐标的 圈子现在是小于或等于
为0,让我们继续前进,再次 颠倒我们的速度。
>> 那么为什么我在没有添加 宽圆的这
时间,因为我以前那样?
那么,请记住,坐标 一个对象的定义
通过其顶部的左上角, 未通过其中央。
因此,当该圆从移动 从左到右,我们需要检查
是否的右边缘 圈已通过
窗口的右边缘。
因此,要搞清楚那是什么,我们有 得到的圆的x坐标
加圆圈的宽度移动 我们从顶部左侧
角落,有效,对 右上方角落。
当圆从右边移动到 左侧,同时,我们不需要
懒得这样此外,由于 圆的左上角是
已经是价值,我们将 从可得x搞定。
>> 现在让我们转移球。
现在,让我们保存,编译并运行此 程序,使反弹,。/反弹。
我们在那里有一个程序。
>> 但圆正这么混账快, 这几乎是不可能的,看看有什么
其实已在进行之中。
因此,让我们颇为方案强行通过 点击X在右上角
角落在这里。
现在让我们返回到源代码 慢下来的东西一点点。
>> 换句话说,在这个无限 循环,而不是仅仅与移动和
移动和再次,广告nauseum,让我们流连忘返 只需几毫秒
出发前再次移动。
尤其是,让我们去底部 这里简直是无限循环的
停下来,例如10毫秒 在每次迭代。
现在,让我们重新编译并重新运行反弹。
现在我们看到一个更合理 实现,在这里我们可以看到
圈真正反弹的 左和右边缘。