推荐阅读

3DMAX实例教程:VRay打造精致乡村风格餐厅
如何体现一个充满加州柔和阳光的空间呢?这次以餐厅这个空间作为主题内容。从最初的平面设定到空间的布光和材质的赋给,成图的后期处理,我们在这里将一一进行体现。最终效果图图00空间概要及说明:这是一套300多平米的别墅,在整体的设计风格上,我采用了美式乡村风格,混搭了一些地中海的元素进去,这套方案没有传统美式的原始粗矿和古朴质感,却传承了一点地中海式的精致。在主题上摒弃了繁琐和奢华,以舒适为导向,以享受为原则,强调“回归自然”,给人一种心灵上的释然以及回归大自然的淳朴的思路,打造一个安宁平静、舒适自然的美妙净土。(图01)图01平面设定和分析:分析平面图,首先我考虑的是这部分空间分为两块,即餐厅和厨房。当然以餐厅为重点。在这里我把厨房做成敞开式厨房,为了让这两个空间的衔接更紧密,功能更齐全,于是又考虑增加了一个吧台,有情调且实用。我们都知道餐厅以用餐为主,那么所有的功能都要以满足这个需求来产生。在家具灯具以及材料的选择上,也是要以美式的感觉进行搭配。比如铜艺的灯具,厚重的家具,本色的棉麻以及有着浓郁自然清新味道的植物。(图02)

身影画中游
视频叠加相信很多喜欢多媒体的朋友都尝试过,今天我们换个玩法,让的照片在视频影片里产生奇妙的“画中游”景观。使用的工具是友立公司的PhotoImpact 7和VideoStudio 6,操作方法也很简单。 制作无背景照片 启动PhotoImpact 7,导入准备好的人像照片。 按下主窗口左侧工具栏上的选取工具,根据照片背景的复杂程度,选择使用“魔术棒”或“贝氏曲线工具”来去除照片背景(如图1)。制作“画中游”影片 启动 VideoStudio 6,新建项目后按下主窗口右侧的文件夹图标,将准备好的视频剪辑导入到素材库中。 打开主菜单“故事板”选项,在素材库里选中导入的影片,将其拖至视频编辑窗口的“视频轨”中(如图3)作为背景影片。可以导入几段视频剪辑与后面的人像图片配合。影片长度可在编辑窗口里激活后任意拖拉调整,以符合整个影片剪辑的需要。 打开主菜单“覆盖”选项,激活视频编辑窗口的“覆盖轨”,打开主窗口右上角的“素材类型”卷展栏,选择“图片”素材库,按下主窗口右侧的文件夹图标,将准备好的无背景人像图片导入到图片素材库中,把它拉至“覆盖轨”里,激活后依前法拖拉调整播放长度,使其与背景影片长度吻合。我们这个实例里使用了两段视频和两个无背景人像,其长度分别是对应的。 导入的人像照片需要进一步调整,才能达到我们预期的效果。激活“覆盖轨”里的人像照片后,按下主窗口左上角的“动画”设置钮,进行各项参数的设置(如图4)。 提示:“运动类型”与刚才设置的人像位置是有密切关系的,如果人像从右侧滑入,我们需将人像位置设置在屏幕左侧,反之亦然,设置时最好将人像的位置移出画面二分之一左右,产生滑出画面的效果。 设置完毕按下主窗口里的预览钮看一看,效果不错,为了锦上添花,再为这段影片加上活动的文字标题,使它更加生动。选中主菜单上的“标题”选项激活文字标题编辑线,在预览窗选取你满意的文字渲染方式后,将其拖至编辑窗里的“标题轨”,在左上角参数栏设置好文字字体、颜色、阴影和动画方式。最后拖拉“标题轨”中文字标题调整播放长度,使其与相配合的背景影片长度一致。 VideoStudio有添加音效的功能,朋友们可根据喜好自行设置添加,在此不再赘述。 影片的保存或导出 我们的作品一切OK了!在预览窗中看到随着背景影片的播放,人像慢慢地滑入画面,又慢慢地滑出,下一个人像紧接着滑入进来,画面上还相应出现了绚丽的动画标题文字,融合成为一段天衣无缝的新视频!下面就把我们的作品保存起来。 选中主窗口“完成”选项,在这里可将它存储为自定义的视频文件,或直接创建刻录成VCD、DVD、SVCD等格式的光盘。 保存完影片后,还可以按下[导出]按钮,将这段影片制作成一张颇有新意的电子贺卡,搭配好贺卡页面,调整好影片大小和位置,生成一个自执行的EXE文件,就可以把它发给朋友一起分享你的快乐了

用Flash 8 AS代码写摄像头拍照功能
因为很久不做 Flash coding 了,所以也就很少关心 Flash 8 的新的 Class,但听大家说过有这个功能。本想从网上找段教程或 code 来做。可是发现国内还没有类似的。就只能自己动手丰衣足食了。 开始做法: 第一步:在库中建立一个视频元件,类型选择:视频(受 ActionScript 控制)。 第二步:将视频元件拖到场景中,并调整尺寸到想要的大小。并起名为“my_video” 第三步:在时间轴中粘入下边的 code。 Testing 发现有问题,拍出来照片只有 160x120 的区域有图像。并且图像变形了。 :eek: 什么地方出了问题呢?@#$%^&* (此处省略2小时 debug 时间……) 最后发现 my_video 复制到场景中调整大小时并不是改变 my_video.width 及 my_video.height 属性,而是改变 my_video._width 及 my_video._height 属性。原有视频元件的尺寸只有 160x120 。这就相当于将 my_video 作了形变。而 BitmapData.draw() 是不会考虑源元件的形变的。用官方的说法是: QUOTE: 源 MovieClip 对象不对此调用使用其任何舞台中转换。该源 MovieClip 对象会被视为存在于库或文件中,没有矩阵转换、没有颜色转换,也没有混合模式。如果您希望通过使用影片剪辑自身的 transform 属性来绘制影片剪辑,则可以使用它的 Transform 对象来传递各种 transformation 属性。

摄影教程:走近你的被摄者
和模特出外约拍,作品却都僵硬死板如木头?拍出来没有情绪,没有感觉? 也许只是你与你的模特还不够接近…… 本文将展示一位摄影师的拍摄心得,与你分享走近被摄者内心的要领~。 再走近一点就好 Robert Capa 说过“如果你的照片没有拍得很棒,那代表你还可以走得更近去拍摄”(If your photographs aren’t good enough, you’re not close enough)。 如果套用在人像摄影上,所谓的“没有走得更近”当然不是在说你跟 Model 的拍摄距离,也并不是叫你每张照片都跑到 Model 面前去拍大头特写,或是用百微去拍摄眼睫毛才叫做有 feel。其实我个人认为照片没有拍好,那是因为很多时候拍摄者并没有“走近”被摄者的“真实性格”和“内心世界”。在作品上,如果只流于“浅”景深、可爱十式或纯粹摄影技巧表现的话,作品难免缺少了深层次的演译,主题亦会变得空洞。 这照片有爱 这个副标题,是有一次跟我的*好友藤原克也先生讨论一辑人像作品时,他评论了某摄影人的作品,说了一句话:那照片有爱。 藤原克也大哥是*拍摄人像的大师级人物,也是《摄影之道-氛围×构图×主题的光影演绎》一书的作者。当时我在向他请教如何去拍摄感性一点的主题,他就回了我一句:“拍这个主题,要有爱”。 原来*摄影人在发表人像作品时,如果拍得很好的话,其它摄影人都会开玩笑式的留言:“有爱”,意思即为揶揄拍摄这个作品的摄影人,一定在拍摄的过程中爱上了这个模特儿,不然不可能拍出如此扣人心弦的作品。虽然听上去有些无聊,但想深一层,如果没有和 Model 做好沟通和引导,没有全神贯注地去发掘被摄者的表情,的确是很难构成一辑佳作。
最新发布

【Director教程】制作屏保
问题我想做一个遮住整个屏幕的屏保程序,大约有五十张小图不断重复直到鼠标或是键盘有所动作。我听说这些能用lingo实现,通过list和miaw。我有一定的lingo基础,但我对这些却毫无头绪。 回答你的需要包含两个步骤。首先,你需要一个能自动适合屏幕大小并且当鼠标或键盘有所动作时退出的执行文件。第二步,你需要将这个执行文件转换为自运行的屏保。 第二步很容易实现。到http://www.macsourcery.com/去购买cinemac。(好狠)这是一个非常好的将director执行文件转为屏保的程序。不要管它的名字,它在两个平台都运行的很好。 现在,让我们来创建这个执行文件。你所描述的屏保是在屏幕不同位置上随机出现精灵的屏保(象大多数屏保一样)。将你的舞台尺寸设置的和你期望的一样大。在这个演示中,我将舞台尺寸设置为1152*870。即便舞台设置的这么大,在大多数情况下只是它的一部分可视。这部分是我们放置精灵的地方。这便意味着我们希望知道播放的屏幕的大小。 你可以通过desktoPRectlist命令来找到播放屏幕的大小。举例来说,打开消息窗口作如下操作:put the desktoprectlist----[rect(0,0,1152,870)] 正如你所看到的,结果是rect…..注意它是包含(encapsulated)在列表里的,尽管只有一个条目。如果你有两个显示器,那么你会看到对应于第二个显示器的第二个条目。在这个例子里,我假设只有一个显示器。在我的这个startmovie的命令里,我首先将得出desktoprectlist并且从这个rect列表中获取第3和第4个值。这些值是屏幕右边和底部的值,我会将他们做为全局变量(grightlimit和gbottomlimit) on tartmovie me global grightlimit,gbottomlimit,gmouselocset screensize=getat(the desktoprectlist,1)set grightlimit=the right of screensizeset gbottomlimit=the bottom of screensizeset gmouseloc=point(the mouseh,the mousev)set the keydownscript to “halt” end先略命令的最后两行,我一会再解释。 现在我们知道了屏幕的大小,我们需要做的是在屏幕许可的范围里随机交替放置精灵。最简单的,我们将50个演员放置到演员表的头50个位置里。这样,我们只要涉及到演员1到50。

了解父脚本和面向对象----1
翻译自 http://www.macromedia.com/devnet/mx/director/articles/oop_dir_Flash.html感谢英语角和eiffelqiu的大力帮助 1&1.计划和实现对象 开发者经常凭借图表来分析游戏各部件的交互关系 , 检查他们的状态 ,并且绘制映射出他们行为间的交互关系。 大多数开发者最先开始编程都是采用过程化编程。为了做这些,他们创建了一个方法(句柄或函数)来完成一些基本的运转并且有时返回一个值。每个方法都是一个过程。 注意: 过程程序设计是一种程序设计方法。它意谓程序撰写在一种逻辑上的连续的方式。 程序工作通过一个简单的顺序的 原因/结果 事件,而且顺序是比较容易预料的。 过程经常非常特定的到一个单一程序;你在另外的一个程序中不大可能再容易的使用它们。 Director 和 Flash都可以让你选择使用对象,将一些过程赋予脚本实例,让你可以为你的游戏创建一个更模块化的设计和执行。 这种轻微但有重要意义的改变在程序设计上通常被叫做面向对象设计, 或 OOP 。 注意: 面向对象设计也是一种程序设计方法。 在面向对象设计中,你仍然使用过程,但是你使用一个最初的脚本 (被称为一个类)作为模板去创建没有数目限制的实例对象, 每个知道如何运行过程和包含封装的全局变量即是属性。这些变量是专用的,因为他们属于这个对象的这一个实例, 但是它们是持久化的(当程序运行后他们持续存在变量中)。 考虑两者都程序地设计一艘船像一个对象。 一艘船需要加速,转向,倒退, 和其他的一些事件。它有许多属性像油漆彩色,大小和浮力。 现在如果你想制造一艘以上的船只,你需要给一艘船的每个实例一个单独的脚本。 使用过程程序设计方法,你会为第二艘船的油漆彩色,大小和浮力设置新的变量名。 boat1.bouyancy=20boat2.bouyancy=23在一个面向对象的模式中,一个脚本的对象或实例包含类脚本所定义的元素。这意味着boat1有它自己的油漆属性,而且其它的船也是。 无论你呼叫它什么: 一个mc,一个父脚本,一个行为,一个精灵或一个实例, 在每个 Macromedia flash 和shockwave游戏中的基础单元是一个对象。 因为 ActionScript 和lingo都支持面向对象程序设计方法,而且因为游戏中经常要求相似对象的许多实例, 创造模仿这些结构时常是最直觉的和明智的方式。

ActionScript 和 Lingo 的面向对象设计
对象的概念和面向对象的编程方式在许多计算机语言中都有,然而在对象模型的实现上,不同的语言却有着或大或小的差别。 ActionScript 和 Lingo 都可以按照面向对象的方式编程,事实上,Macromedia Flash 和 Director 都在自己的实现中遵循着基本的面向对象模式 Macromedia Flash 和 Director 在面向对象实现上最大的差别在于 Macromedia Flash 使用完全的对象驱动方式,因此它使用原型而不是类作为对象实例生成的基础 在 Macromedia Flash 中,一切事物都是对象,因此,几乎都是采用模板脚本来自动实例化对象本身的。 这些自动实例化的类脚本被称作原型 Director 使用了更典型的方式。 原始的类脚本在 Director 中被称为父脚本,它们仅仅作为创建对象的模板而存在。 考虑到这点,面向对象的结构对我们来说一点也不陌生,因为它们是在模仿我们对事物基本组织结构的理解以及现实世界中的想法

对象的性质
一个对象是一个不连续的实体。称它为一件东西,一个结点或一个构件是合理的。在面向对象编程中,对象是产物或被类产生的实例。对象可以有属性 , 展示行为,执行方法,和赋值。 screen.width-333)this.width=screen.width-333\" src="/Upload/2004_Pack/3012434350293.gif">图 1. 这一个类模板是八个实例的源。 可重复使用性和封装是二个最明显的面向对象编程的好处。你可以使用一个类脚本产生无限量的专用实例对象,这里的每一个对象都是一个受保护,封装的实例。换句话说,实例不影响或改变类;他们不影响或改变彼此。 screen.width-333)this.width=screen.width-333\" src="/Upload/2004_Pack/3012435159490.gif">图 2.每个实例包含相同的属性和句柄如类,但是每个实例的属性数值被封装。你可以改变他们而不影响其他实例或类脚本。 如果这是你第一次接触面向对象观念,最后一点可能很难理解。不要惊慌。我们就要去讲述一些不同类型的对象。首先是有点像一个实际的物体 , 举例来说,一台电冰箱 。称呼这个第一个种类为复合对象。 screen.width-333)this.width=screen.width-333\" src="/Upload/2004_Pack/3012435647888.gif">图 3. 复合对象是基于实际的事物的一个对象 , 像这台电冰箱。 电冰箱对象不是空的。它有一系列内部的架子,而且每一个包含其他的物体。举例来说,顶端架,在它里面有一盒牛奶。那么简要重述,电冰箱有一盒牛奶。这盒牛奶,再进一步,它里面牛奶有一个量。 screen.width-333)this.width=screen.width-333\" src="/Upload/2004_Pack/301244243741.gif">图 4. 复合对象的在各种不同的对象之间的 \"has-a\" 关系与每天事物的空间关系类似。 复合对象有时被叫做 \"has-a\" 对象因为在多重对象之间的关系是一个暗示空间包含的关系。 你使用的电脑显示一个由带有色彩值的像素组成的屏幕。在这些对象之间的关系和复合对象之间的关系是类似的。

【Director教程】制作控制精灵的blend行为
我试着想写一个行为。当鼠标移到一个精灵上时,我希望另一个精灵能够改变它的混合值(blend),是特定的下一个通道的精灵。我在指定具体通道号的时候能够实现这个效果,但我不知道如何做一个行为,这样我只需从库中调用。 一个非常好的问题!我始终倾向于避免写的代码过于局限。让我们来合计一下你所需要的。我们先假设你的行为默认状态下对下一个通道产生作用(the sPRite+1)。这会使代码容易编写。 我们将创建一个属性来保留受影响的精灵的参数。我把它叫做pblendsprite,并且我将它写在beginsprite句柄中。 property pblendspriteon beginSprite me set mySprite = the spriteNum of me set pBlendSprite = mySprite + 1endon mouseEnter set the blend of sprite pBlendSprite to whateverend 很容易,不是吗?让我们在这个基础上再进一步。让我们来制定它在默认状态下是针对下一个精灵,但是,它可被编辑改变。这是一个小窍门。在上边的行为中我们并不知道具体的精灵编号,直到电影运行,beginsprite事件激发。但是,如果我们希望默认的数字显示在getpropertiesdescriptionlist对话框中,我们需要立即得到这个数值----在我们将这个行为赋予精灵的时候。 这个诀窍在于使用\"the currentspritenum\"。查一下lingo字典的详细资料。这个属性返回的任何在最近的事件中的精灵通道号。很明显,将行为赋予精灵也是事件(??不知这里对不对)。这对我们是一件好事,因为我们要得到精灵的通道号(然后再加1) property pBlendSpriteon getPropertyDescriptionListset blendSpriteNum = the currentSpriteNum + 1set p_list = [#pBlendSprite: [ #comment: \"Which Sprite blends?:\",_ #format:#integer,#default: blendSpriteNum]]return p_listendon mouseEnter meset the blend of sprite pBlendSprite to whateverend

【Director教程】用距离控制声音
我需要将一张图片放到舞台的*,以便鼠标靠近的时候声音会马上淡入,同时图片做淡入淡出的发光效果。 还记得高中学过的几何学如何计算直角斜边的长度吗?我们来回顾一下。假设你知道了两条直角边x,y。计算第三条边的长度的公式是 X2 + Y2 = Z2 很容易得出z的长度始终大于x或y的长度。 现在我们把它应用到你问题中去。设想一下直角边的斜边z由你的精灵的坐标和鼠标的坐标来决定。x是你的精灵和鼠标的水平距离,y是你的精灵和鼠标的垂直距离。现在,以上的公式可改为 set x = the mouseH - the locH of sPRite whateverset y = the mouseV - the locV of sprite whatever x2 + y2 = the distance2 这就是我们要用的概念。因为距离永远不可能为负数,当我们编写lingo的时候,我们使用绝对值属性来设定x和y。同时,我亲向于使用描述性的变量来定义x,y。在这个例子中我将使用hinc和vinc来表示“水平增量和垂直增量”。 接下来的步骤就是是这个距离和以下的事件关联:1)声音通道的音量。2)精灵的混合值(发光的精灵)。音量的范围是从0到255,既然我们希望声音在鼠标接近的时候增加,我们可以简单的制定音量等于255减去距离。为了增强可操作性,我创建了“fade\"变量。我们使用“fade\"变量来乘以距离,这样我们可以使音量在较短的距离里增减。(fade的值越大,变化的越快)。 最后,你需要改变墨水的混合值,来实现发光的效果。在这个行为里,我们让这个混合值与音量关联。混合值由1到100,为了使它适应音量的0到255的变化范围,我们设定混合值为 数值/256。 以下便是这个行为。你需要制定一下发光的精灵。

【Director教程】locz的使用
我刚使用d8并且我正在做我的第一个项目。基本上是一个拖动的七巧板游戏。无论如何,当这些部分被打乱,你要拖动的时候,有些部分就被遮挡了。我希望当鼠标点击的时候,这部分能自动的移到前面来。 这儿有几种方法来解决你所说的问题。第一种方式是动态的改变演员所在的通道级数,也就是改变演员的z坐标。我写了一片关于它的文章,叫dynamic sPRite re-ordering----这确实有一点用词不当,因为精灵并没有从新排列,而是演员。(省略一部分) director渲染舞台的时候,从1通道开始直到最高的通道,你可以给它一些特殊的指令。这有一个特殊的通道属性叫做locz,它允许你设置渲染通道的层数。数值越大,它就越在上面。 那么,这儿便是可指定给你的七巧板元素的行为,它可使鼠标点击的元素到舞台的最上面。。。还有在鼠标抬起的时候返回到原有通道。 property pSpriteon beginSprite me pSprite = sprite(me.spriteNum) end beginSpriteon mouseDown me pSprite.locZ = 500 end mouseDownon mouseUp me pSprite.locZ = me.spriteNum end mouseUpon mouseUpOutside me mouseUp me end mouseUpOutside 所有的行为是在鼠标点击的时候改变精灵的locz。在这个例子里我使用了一个虚拟的通道500,其实你可以使用任何高于你现有通道数的数值。只是为了好玩,我想核实一下如果我是用0或是负数会发生什么。结果,精灵跑到了舞台后面。

【Director教程】图片缩放
提问: 我希望能将一张位图从640到800做一个平滑的变化。我试着让它在1到50帧变化,别的都还行,只是不够平滑。请告诉我秘诀。 回答: 如果你确实希望让图片平滑的移动,大部分情况下最好的解决方法是用lingo代替在通道中的关键帧动画。最大的理由便是lingo允许你调整动画而不用增加和删除关键帧。 创建你的让图片变大的行为,第一步是初始化几个会决定图片显示的变量。 on beginsPRite mepzoomsteps=200plargerect=(0,0,400,300)psmallrect=(0,0,200,150)end 当你的精灵开始的时候,它将初始化三个变量。第一个,pzoomsteps,将决定间隔的量。间隔越长,动画越平滑,同时动画时间也越长。你需要试验几次以找到适合你电影的值。另外的两个值是你图片的两个不同尺寸。 一旦你已经初始化了你的变量,接着你需要另一个程序来开始这个动画。这个程序可是被另一个按钮激发,或是帧语言,甚至是点击这个图片。 on startgrow mepzoomcounter=0tiemout(\"growimage\").new(40,#growimage,me)

【Director教程】匹配精灵游戏
问题 我正在做一个锻炼记忆力的游戏,用户在点击了一个精灵后,必须在两秒以内点击另一个与它匹配的精灵。我用全局变量来记录匹配的变量,但我不确定如何来做时间记录这部分工作。我已经尝试过使用”the shorttime”,但我找不到一个好的方法将所得的时间相减。 回答 用时钟来功能作为运算时间的基础,在dirctor里是非常复杂的部分-----尽管我不是很清楚为什么必须这样。(the time始终是作为字符串输出的,而字符串对我并没有太大的意义。)无论如何,我们并不需要担心,因为我们不使用the short time。我们确实不需要知道具体的时间是多少。我们更愿意了解一个事件和另一个事件的间隔的时间。这就是说,我们更需要一个秒表,而不是一个钟。幸运的是用timer的命令很容易做到这一点。 Timer是一种自由的计时工具。它以”ticks”------也就是60分之1秒计时。你唯一需要掌握的命令就是”starttimer”,这会使timer复位到0。只要开始计时,你可以在任何时候检查数值以便得知过去的时间。 让我们来写一个行为,以接受这个小小的挑战。首先,我们来对这个行为来定一下位。当你将这个行为附加到精灵上的时候,你会希望能够输入一个名称,这样对应的精灵也用同一个名称。你也会希望能够定义两次点击的延迟时间(用ticks----60ticks等于一秒)。这将是你可以将这行为重复使用到任意一组精灵上。第二步,在运行的时候,当精灵被点击,以下是需要做的事情。 1. 判断第一次和第二次点击的是不是一组。 2. 如果是第一次点击,那么便需要在全局变量中储存这一组的名字并且开始计时。 3. 如果是第二次点击,那么便需要核实是否与上次点击储存在全局变量中的名称一致。 4. 如果名称相符,那么便需要检测是否超时。 5. 在第二次点击后并且检测后,需要将全局变量复位到0。 以下是这个行为。 ----timermatch behavior----copyright © 1998,zzp online,llc(它已经5岁了)PRoperty pgrouppropert ptimelapseglobal gclickgropon getpropertydescriptionlistset d=[:]addprop d,#pgrop,[#default:#first,#format:#symbol,#comment:”匹配的组”]addprop d,#ptimelapse,[#default:120t,#format:#integerl,#comment:”间隔时间”]return dendon mousedown meif gclickgrop=#null thenset gclickgroup=pgroupstarttimerelseif gclickgroup=pgrop thenif the timer<120 thenalert “这是一组”elsealert “太慢”end ifelsealert “不是一组”end ifset gclickgroup=#nullend ifend

【Director教程】解析文本和列表
问题: 我有一个名为“fonts”的域和如下的文本。 [\"MezzMM_375 RG\", \"MezzMM\", \"Cottonwood\", \"Lithos Regular\", \"Minion_Condensed\", \"Minion Ornaments\", \"Poetica ChanceryI\", \"Utopia\", \"Viva_BoldExtraExtended\", \"Viva Regular\", ...\"SurethingSymbols\", \"Zephyr\"] (这是简化了的。原件有一百多名字) 我需要将其转换为按字母顺序排列的有序列表(不是程序列表),看上去应该是这样: ArialArialBlackArialNarrowBookAntiquaBookmanOldStyleBookshelfSymbol1...WingdingsWoodcutXcastZapfElliptBTZephyr 这样看来,我需要删除引号,逗号和括弧,将逗号替换为换行。 回答: 我之所以选择你的问题主要有两个原因。第一,再没有比理解如何处理文本这个概念更为有用的了。我几乎记不记来有多少次我使用这种技巧来处理类似这样的处理外部文本文件,核实用户输入等。 第二点,你的问题指出一个事实,好的开发者用lingo来帮助自己编辑。我们将要做的其实是一个编辑工具-------也许永远不会在程序运行中使用。这种类型的编辑器能节省你大量的时间。更重要的是它可以帮助你避免手动的输入数据题条目。 现在,我们来解释一下。我们需要做两件事。按字母顺序排列列表和处理不想要的字符。让我们从区别lingo 列表和字符串开始。在lingo中,字符串是包括在引号任何顺序的字节。同样的字符串能够出现在域中,然而域只能保留字符串,所以你并不需要用引号把字符串引起来。 你应该习惯看到扩在括弧里的列表。就象这样: