2011-10-11 98 views
1

我不知道有人可以解决这个代码更简单的方法给我启发。我是闪光和动作的新手。Actionscript 3 Flash键盘事件

我想要一个文本框,用户输入他们的名字。每次按下字符时,该字母的图像显示在文本框下方。举个例子。用户权限约翰。约翰在下面的漂亮图片中显示。

我有这个工作,但我必须为每个字符创建一个输入框,所以我留下了例如。每个名称的字母有6个框,每个字母只能接受一个字符。原因是,如果只使用一个文本框,我无法将图像放在一起,它们会覆盖输入的第一个字符的位置。

我知道我要走很长的路,必须有更容易的事情。

这是代码,如果我必须走这条路线,这将是非常繁琐的。有人能给我一个关于正确的方式去解决这个问题。

感谢 Fintan

////////////////111111//////////////////// 
firstname.addEventListener(KeyboardEvent.KEY_DOWN, key_pressed); 
function key_pressed(event:KeyboardEvent):void { 
if (event.charCode == 65) { 
    var fl_MyInstance_2:LibrarySymbol = new LibrarySymbol(); 
     fl_MyInstance_2.x = 50 
     fl_MyInstance_2.y = 200 
     addChild(fl_MyInstance_2); 

} else if (event.charCode == 66) { 
    var fl_MyInstance_3:letterb = new letterb(); 
     fl_MyInstance_3.x = 50 
     fl_MyInstance_3.y = 200 
    addChild(fl_MyInstance_3); 

} else if (event.charCode == 67) { 
    var fl_MyInstance_4:letterc = new letterc(); 
     fl_MyInstance_4.x = 50 
     fl_MyInstance_4.y = 200 
    addChild(fl_MyInstance_4); 

} else if (event.charCode == 68) { 
    var fl_MyInstance_5:letterd = new letterd(); 
     fl_MyInstance_5.x = 50 
     fl_MyInstance_5.y = 200 
    addChild(fl_MyInstance_5); 

} else if (event.charCode == 69) { 
    var fl_MyInstance_6:letterd = new letterd(); 
     fl_MyInstance_6.x = 50 
     fl_MyInstance_6.y = 200 
    addChild(fl_MyInstance_6); 
} 

回答

0

我给你一些代码和一些线索,试图向你指出正确的方向。

首先,每个字母表的字母不需要一个不同的班级 - 至少有26个班级,如果考虑大写/小写,则不需要另外一个班级,这是完全没有必要的,因为每个人和所有人仅用于一个目的 - 显示一个字母。

我想要做的是将一个带有26个不同帧的MovieClip(或52个如果大写/小写)标记为“a”到“z”(或“A”到“z”)。在每个框架中,放置一个字母和一个stop();。只将这个MovieClip链接到一个类 - 字母,或任何其他。

然后,当用户在您的名字TextField上写字时,您必须小心,因为他/她可以击中其他不是字母的键 - 例如,del键,后退箭头等可能会与您的视觉表现。我认为只有这样,才能确保你显示的一切权利是每次绘制文本框的全部内容,就像这样:

//KEY UP EVENT 
firstname.addEventListener(KeyboardEvent.KEY_UP, key_pressed); 

//container (empty) movieclip 
var container_mc:MovieClip = new MovieClip(); 
addChild(container_mc); 

function key_pressed(e:KeyboardEvent):void 
{ 

    var offset:Number=0; 

    //clear container to update visual representation 
    while(container_mc.numChildren>0) 
    container_mc.removeChildAt(0); 

    var letterInstance:Letter; //your linked class 

    for(var i:uint=0;i<firstname.text.length;i++) 
    { 
    letterInstance = new Letter(); 

    //go to frame corresponding to the letter at position "i" 
    //OR use your own system to choose the image for each letter! 
    letterInstance.gotoAndStop(first_name.text.charAt(i)); 

    //postion: x (plus offset to avoid overwritting), y 
    letterInstance.x = 50 + offset; 
    offset+= letterInstance.width; 
    letterInstance.y = 200; 

    //add letter to container 
    container_mc.addChild(letterInstance); 
    } 

} 

此代码仍然存在一些问题,如非字母字符,例如空格名,撇号等,但我认为你可以从这里开始工作;)

希望能有所帮助,祝你好运!

+0

谢谢Danii。这工作太棒了。 –

+0

很高兴帮助队友,如果这个答案解决了你的问题,绿色checkie(接受)将不胜感激! ;) – danii

1

你说:“因此,例如,用户权限约翰。约翰显示在下面的好图像。”所以,如果我正确地理解你,你想要显示用户输入的字符的预渲染位图图像?

如果是这种情况考虑以下几点:

private var _image:Sprite = new Sprite(); // a container to hold your bitmaps (jpgs/pngs) 
private var _spacing:uint = 30; // some arbitrary value to space them apart // 
myInputTextField.addEventListener(Event.CHANGE, onNameChange); 

function onNameChange(e:Event):void 
{ 
// first clear the image sprite to accommodate things like backspaces // 
    while(_image.numChildren) _image.removeChildAt(0); 
// get the current string in the input textfield // 
    var s:String = myInputTextField.text; 
// and then layout a series of pre-rendered bitmaps based on those characters // 
    for (var i:uint=0; i<s.length; i++){ 
     var c:String = s.substr(i, 1); // one character // 
     var b:Bitmap = getImageCharacter(c); 
      b.x = _spacing * i; 
     _image.addChild(b); 
    } 
} 

下面的辅助函数仅仅是一个地图,需要一个字符并将其映射到该说的可能是在资料库中的BitmapData对象。

function getImageCharacter(s:String):Bitmap 
{ 
    switch(s){ 
     case a: return new Bitmap(new ImageA()); break; 
     case b: return new Bitmap(new ImageB()); break; 
     case c: return new Bitmap(new ImageC()); break; 
    } 
} 

在这种情况下ImageA可能是在资料库中已设置导出为“ImageA” .png文件。

这只是一个简单的例子,可以更加优化,但这应该让你开始走下正确的道路。

+0

感谢您的帮助Braitsch。我无法弄清楚公共/私人变数,我不断得到错误1013/1114。所以我使用了下面的电影建议。 –