我正试着在Flash Builder中写一个美元识别器。我对actionscript和mxml是个新手,在下面的代码中,我在"myRec.addTemplate...“行遇到了这个错误:
import de.yuv.gestures.Recognizer;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
var myRec:Recognizer = new Recognizer();
myRec.addTemplate("triangle", new Array(new Point(137,139),new Point(135,141),new Point(133,144),new Point(132,146),new Point(130,149),new Point(128,151),new Point(126,155),new Point(123,160),new Point(120,166),new Point(116,171),new Point(112,177),new Point(107,183),new Point(102,188),new Point(100,191),new Point(95,195),new Point(90,199),new Point(86,203),new Point(82,206),new Point(80,209),new Point(75,213),new Point(73,213),new Point(70,216),new Point(67,219),new Point(64,221),new Point(61,223),new Point(60,225),new Point(62,226),new Point(65,225),new Point(67,226),new Point(74,226),new Point(77,227),new Point(85,229),new Point(91,230),new Point(99,231),new Point(108,232),new Point(116,233),new Point(125,233),new Point(134,234),new Point(145,233),new Point(153,232),new Point(160,233),new Point(170,234),new Point(177,235),new Point(179,236),new Point(186,237),new Point(193,238),new Point(198,239),new Point(200,237),new Point(202,239),new Point(204,238),new Point(206,234),new Point(205,230),new Point(202,222),new Point(197,216),new Point(192,207),new Point(186,198),new Point(179,189),new Point(174,183),new Point(170,178),new Point(164,171),new Point(161,168),new Point(154,160),new Point(148,155),new Point(143,150),new Point(138,148),new Point(136,148)));这真的让我很困惑,因为我在它上面定义了myRec。然而,同样的代码在Flash Professional中也可以工作,这让我相信我遗漏了一些import语句或其他微妙之处,这在我的这个错误消息中没有被清楚地表达出来。
任何帮助都将不胜感激。
谢谢,NinjaSteph
编辑(完整错误消息):说明资源路径位置类型1120:访问未定义的属性myRec。GestureRecognizer.mxml /GestureRecognizer/src第17行弹性问题
编辑(完整的mxml文件):
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600" currentState="Title">
<fx:Script><![CDATA[
import de.yuv.gestures.Recognizer;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
var myRec:Recognizer = new Recognizer();
myRec.addTemplate("triangle", new Array(new Point(137,139),new Point(135,141),new Point(133,144),new Point(132,146),new Point(130,149),new Point(128,151),new Point(126,155),new Point(123,160),new Point(120,166),new Point(116,171),new Point(112,177),new Point(107,183),new Point(102,188),new Point(100,191),new Point(95,195),new Point(90,199),new Point(86,203),new Point(82,206),new Point(80,209),new Point(75,213),new Point(73,213),new Point(70,216),new Point(67,219),new Point(64,221),new Point(61,223),new Point(60,225),new Point(62,226),new Point(65,225),new Point(67,226),new Point(74,226),new Point(77,227),new Point(85,229),new Point(91,230),new Point(99,231),new Point(108,232),new Point(116,233),new Point(125,233),new Point(134,234),new Point(145,233),new Point(153,232),new Point(160,233),new Point(170,234),new Point(177,235),new Point(179,236),new Point(186,237),new Point(193,238),new Point(198,239),new Point(200,237),new Point(202,239),new Point(204,238),new Point(206,234),new Point(205,230),new Point(202,222),new Point(197,216),new Point(192,207),new Point(186,198),new Point(179,189),new Point(174,183),new Point(170,178),new Point(164,171),new Point(161,168),new Point(154,160),new Point(148,155),new Point(143,150),new Point(138,148),new Point(136,148)));
var recordedPoints:Array;
public function hideAllHighlights():void
{
for (var i:uint = 0; i < myRec.Templates.length; i++){
var mc:MovieClip = this["mc_"+myRec.Templates[i].Name];
trace(mc);
if (mc)
{
mc.visible = false;
}
}
}
var record:Boolean = false;
//hideAllHighlights();
public function handleMouseDown (event:MouseEvent):void
{
trace('handleMouseDown:');
record = true;
hideAllHighlights();
recordedPoints = new Array();
//clear objects from stage that are not circles
for(var i:int = 0; recPanel.stage.numChildren>i; ){
if(recPanel.stage.getChildAt(i).name == "circle")
recPanel.stage.removeChildAt(i);
else
i++;
}
}
public function handleMouseUp(event:MouseEvent):void
{
trace('handleMouseUp:');
record = false;
var myResult = myRec.recognize(recordedPoints);
trace (myResult.Name);
trace (myResult.Score);
resLabel.text = myResult.Name;
/*var mc:MovieClip = this["mc_"+myResult.Name];
if (mc){
mc.visible = true;
}*/
}
public function drawCircle(x:Number, y:Number):void
{
var circle:Shape = new Shape;
circle.name = "circle";
var radius:Number = 1;
circle.graphics.beginFill(0x000000);
circle.graphics.drawCircle(x+recPanel.x, y+recPanel.y, radius);
recPanel.stage.addChild(circle);
}
public function handleMouseMove(event:MouseEvent):void
{
if (record){
trace('handleMouseMove'+event.localX+" "+event.localY);
recordedPoints.push(new Point(event.localX,event.localY));
drawCircle(event.localX,event.localY);
}
}
//recPanel.addEventListener ( MouseEvent.MOUSE_DOWN, handleMouseDown );
//recPanel.addEventListener ( MouseEvent.MOUSE_UP, handleMouseUp );
//recPanel.addEventListener ( MouseEvent.MOUSE_MOVE, handleMouseMove );
protected function startBkgd_clickHandler(event:MouseEvent):void
{
setCurrentState("RecognizerState");
}
]]></fx:Script>
<s:states>
<s:State name="Title"/>
<s:State name="RecognizerState"/>
</s:states>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Label includeIn="Title" fontSize="36" horizontalCenter="0" text="Dollar Gesture Recognizer"
textAlign="center" verticalAlign="middle" verticalCenter="-30"/>
<s:Label includeIn="Title" fontSize="18" horizontalCenter="0" text=""
verticalCenter="40"/>
<s:Panel id="recPanel" includeIn="RecognizerState" left="50" width="400" height="400"
color="#0B333C" fontSize="24" textAlign="center" title="Gesture Recognizer"
verticalCenter="0" mouseDown="handleMouseDown(event)" mouseMove="handleMouseMove(event)"
mouseUp="handleMouseUp(event)">
</s:Panel>
<s:Panel id="gesPanel" includeIn="RecognizerState" width="300" height="400" fontSize="24"
horizontalCenter="0" textAlign="center" title="Available Gestures" verticalCenter="0">
</s:Panel>
<s:Label id="startBkgd" includeIn="Title" x="10" y="10" width="1263" height="591"
click="startBkgd_clickHandler(event)" />
<s:Panel id="resMeme" includeIn="RecognizerState" right="50" width="400" height="400"
fontSize="24" title="Resulting Meme" verticalCenter="0">
<s:Label id="resLabel" x="103" y="165" width="180" text="result" textAlign="center"/>
</s:Panel>
识别器类:
package de.yuv.gestures
{
import de.yuv.gestures.Result;
import de.yuv.gestures.Template;
import flash.geom.Point;
import flash.geom.Rectangle;
public class Recognizer {
public static var NumPoints:int = 64;
public static var SquareSize:Number = 250.0;
public static var HalfDiagonal = 0.5 * Math.sqrt(250.0 * 250.0 + 250.0 * 250.0);
public static var AngleRange = 45.0;
public static var AnglePrecision = 2.0;
public static var Phi = 0.5 * (-1.0 + Math.sqrt(5.0)); // Golden Ratio
public var Templates:Array;
public function Recognizer(){
this.Templates = new Array();
}
public function recognize(points)
{
points = Resample(points, NumPoints);
points = RotateToZero(points);
points = ScaleToSquare(points, SquareSize);
points = TranslateToOrigin(points);
var b = +Infinity;
var t;
for (var i = 0; i < this.Templates.length; i++)
{
var d = DistanceAtBestAngle(points, this.Templates[i], -AngleRange, +AngleRange, AnglePrecision);
if (d < b)
{
b = d;
t = i;
}
}
var score = 1.0 - (b / HalfDiagonal);
return new Result(this.Templates[t].Name, score);
};
//
// add/delete new templates
//
public function addTemplate(name, points)
{
this.Templates[this.Templates.length] = new Template(name, points); // append new template
var num = 0;
for (var i = 0; i < this.Templates.length; i++)
{
if (this.Templates[i].Name == name)
num++;
}
return num;
}
// Helper functions
public static function Resample(points, n)
{
var I = PathLength(points) / (n - 1); // interval length
var D = 0.0;
var newpoints = new Array(points[0]);
for (var i = 1; i < points.length; i++)
{
var d = Distance(points[i - 1], points[i]);
if ((D + d) >= I)
{
var qx = points[i - 1].x + ((I - D) / d) * (points[i].x - points[i - 1].x);
var qy = points[i - 1].y + ((I - D) / d) * (points[i].y - points[i - 1].y);
var q = new Point(qx, qy);
newpoints[newpoints.length] = q; // append new point 'q'
points.splice(i, 0, q); // insert 'q' at position i in points s.t. 'q' will be the next i
D = 0.0;
}
else D += d;
}
// somtimes we fall a rounding-error short of adding the last point, so add it if so
if (newpoints.length == n - 1)
{
newpoints[newpoints.length] = points[points.length - 1];
}
return newpoints;
}
public static function RotateToZero(points)
{
var c = Centroid(points);
var theta = Math.atan2(c.y - points[0].y, c.x - points[0].x);
return RotateBy(points, -theta);
}
public static function ScaleToSquare(points, size)
{
var B = BoundingBox(points);
var newpoints = new Array();
for (var i = 0; i < points.length; i++)
{
var qx = points[i].x * (size / B.width);
var qy = points[i].y * (size / B.height);
newpoints[newpoints.length] = new Point(qx, qy);
}
return newpoints;
}
public static function TranslateToOrigin(points)
{
var c = Centroid(points);
var newpoints = new Array();
for (var i = 0; i < points.length; i++)
{
var qx = points[i].x - c.x;
var qy = points[i].y - c.y;
newpoints[newpoints.length] = new Point(qx, qy);
}
return newpoints;
}
public static function DistanceAtBestAngle(points, T, a, b, threshold)
{
var x1 = Phi * a + (1.0 - Phi) * b;
var f1 = DistanceAtAngle(points, T, x1);
var x2 = (1.0 - Phi) * a + Phi * b;
var f2 = DistanceAtAngle(points, T, x2);
while (Math.abs(b - a) > threshold)
{
if (f1 < f2)
{
b = x2;
x2 = x1;
f2 = f1;
x1 = Phi * a + (1.0 - Phi) * b;
f1 = DistanceAtAngle(points, T, x1);
}
else
{
a = x1;
x1 = x2;
f1 = f2;
x2 = (1.0 - Phi) * a + Phi * b;
f2 = DistanceAtAngle(points, T, x2);
}
}
return Math.min(f1, f2);
}
public static function PathLength(points)
{
var d = 0.0;
for (var i = 1; i < points.length; i++)
d += Distance(points[i - 1], points[i]);
return d;
}
public static function Distance(p1, p2)
{
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
return Math.sqrt(dx * dx + dy * dy);
}
public static function Centroid(points)
{
var x = 0.0, y = 0.0;
for (var i = 0; i < points.length; i++)
{
x += points[i].x;
y += points[i].y;
}
x /= points.length;
y /= points.length;
return new Point(x, y);
}
public static function RotateBy(points, theta)
{
var c = Centroid(points);
var cos = Math.cos(theta);
var sin = Math.sin(theta);
var newpoints = new Array();
for (var i = 0; i < points.length; i++)
{
var qx = (points[i].x - c.x) * cos - (points[i].y - c.y) * sin + c.x
var qy = (points[i].x - c.x) * sin + (points[i].y - c.y) * cos + c.y;
newpoints[newpoints.length] = new Point(qx, qy);
}
return newpoints;
}
public static function BoundingBox(points)
{
var minX = +Infinity, maxX = -Infinity, minY = +Infinity, maxY = -Infinity;
for (var i = 0; i < points.length; i++)
{
if (points[i].x < minX)
minX = points[i].x;
if (points[i].x > maxX)
maxX = points[i].x;
if (points[i].y < minY)
minY = points[i].y;
if (points[i].y > maxY)
maxY = points[i].y;
}
return new Rectangle(minX, minY, maxX - minX, maxY - minY);
}
public static function DistanceAtAngle(points, T, theta)
{
var newpoints = RotateBy(points, theta);
return PathDistance(newpoints, T.Points);
}
public static function PathDistance(pts1, pts2)
{
var d = 0.0;
for (var i = 0; i < pts1.length; i++) // assumes pts1.length == pts2.length
d += Distance(pts1[i], pts2[i]);
return d / pts1.length;
}
}}
发布于 2011-11-21 07:11:09
这不是应该放在某种类型的课堂上吗?
如下所示:
package
{
// imports
public class Main() extends Sprite // extend Sprite if you want to use it as your document class
{
public function Main()
{
// your code here
}
}
}发布于 2011-11-22 00:30:03
@艾米·布莱克希普,你是对的,因为我在我的脚本中“松散”地留下了我的代码。我并没有创建一个不必要的类,而是简单地将代码放在一个函数中,当我的应用程序启动并工作时,我运行该函数。我似乎错过了关于actionscript的一些非常基本的东西。
下面是我修复的代码:
var myRec:Recognizer = new Recognizer();
public function start():void
{
//resImage.source = "assets/omeme.jpg";
myRec.addTemplate("triangle", new Array(new Point(137,139),new Point(135,141),new Point(133,144),new Point(132,146),new Point(130,149),new Point(128,151),new Point(126,155),new Point(123,160),new Point(120,166),new Point(116,171),new Point(112,177),new Point(107,183),new Point(102,188),new Point(100,191),new Point(95,195),new Point(90,199),new Point(86,203),new Point(82,206),new Point(80,209),new Point(75,213),new Point(73,213),new Point(70,216),new Point(67,219),new Point(64,221),new Point(61,223),new Point(60,225),new Point(62,226),new Point(65,225),new Point(67,226),new Point(74,226),new Point(77,227),new Point(85,229),new Point(91,230),new Point(99,231),new Point(108,232),new Point(116,233),new Point(125,233),new Point(134,234),new Point(145,233),new Point(153,232),new Point(160,233),new Point(170,234),new Point(177,235),new Point(179,236),new Point(186,237),new Point(193,238),new Point(198,239),new Point(200,237),new Point(202,239),new Point(204,238),new Point(206,234),new Point(205,230),new Point(202,222),new Point(197,216),new Point(192,207),new Point(186,198),new Point(179,189),new Point(174,183),new Point(170,178),new Point(164,171),new Point(161,168),new Point(154,160),new Point(148,155),new Point(143,150),new Point(138,148),new Point(136,148)));谢谢,
NinjaSteph
https://stackoverflow.com/questions/8205363
复制相似问题