Flash 如何制作闪光形状';s(x,y)坐标与它的起点无关,而是与它在框架上的位置有关
好吧,从昨晚开始我就一直在努力解决这个问题。当我创建一个新对象(一个新单元)并将其绘制到屏幕上(Flash在那里完成所有工作)时,它的第一个放置点被认为是它的原点。也就是说,getX和getY将返回到该点的距离 为什么呢?或者我怎样才能阻止这一切Flash 如何制作闪光形状';s(x,y)坐标与它的起点无关,而是与它在框架上的位置有关,flash,actionscript-3,flash-builder,flash-cs5,Flash,Actionscript 3,Flash Builder,Flash Cs5,好吧,从昨晚开始我就一直在努力解决这个问题。当我创建一个新对象(一个新单元)并将其绘制到屏幕上(Flash在那里完成所有工作)时,它的第一个放置点被认为是它的原点。也就是说,getX和getY将返回到该点的距离 为什么呢?或者我怎样才能阻止这一切 function createUnit(health:int, attack:int, reach:int, speed:int, friendly:Boolean, type:String):Object { var unit = new O
function createUnit(health:int, attack:int, reach:int, speed:int, friendly:Boolean, type:String):Object {
var unit = new Object();
unit.cHealth = health;
unit.tHealth = health;
unit.uAttack = attack;
unit.uReach = reach;
unit.uSpeed = speed;
if (friendly) {
unit.xSpeed = -speed;
} else {
unit.xSpeed = speed;
}
unit.ySpeed = 0;
unit.isFriendly = friendly;
unit.unitType = type;
unit.updateUnit = function() {
if (unit.cHealth <= 0) {
deleteUnit(unit);
}
unit.moveUnit();
unit.findClosestUnit();
}
unit.getY = function():int {
return unit.shape.y;
}
unit.getX = function():int {
return unit.shape.x;
}
unit.moveUnit = function() {
unit.shape.x += unit.xSpeed;
unit.shape.y += unit.ySpeed;
}
unit.findClosestUnit = function() {
var dist:int = 0;
var closestDist:int = 0;
var closestUnit:Object = null;
var array:Array;
if (unit.isFriendly) {
array = eUnits;
} else {
array = fUnits;
}
if (array != null) {
var i:int = 0;
for (i; i < array.length; i++) {
var obj = array[i];
trace(this.shape.x);
dist = Math.sqrt(Math.pow(obj.getX() + unit.getX(), 2) + Math.pow(obj.getY() + unit.getY(), 2));
//trace(dist);
if (dist <= closestDist) {
closestDist = dist;
closestUnit = obj;
//basically the two lines below *will* start the unit's movement towards the nearest enemy.
//unit.ySpeed = (unit.getY() - closestUnit.getY())/unit.uSpeed;
//unit.xSpeed = (unit.getX() - closestUnit.getX())/unit.uSpeed;
}
if (dist <= unit.reach) {
unit.attackUnit(closestUnit);
}
}
}
}
unit.attackUnit = function(unit2:Object) {
unit2.cHealth -= unit.attack;
}
var spawnX:int;
var spawnY:int;
var color:uint;
if (friendly) {
spawnX = stage.stageWidth;
spawnY = stage.stageHeight / 2;
color = 0xFFCC00;
} else {
spawnX = 0;
spawnY = Math.random() * stage.stageHeight;
color = 0x682388;
}
var tShape:Shape = new Shape();
tShape.graphics.beginFill(color);
tShape.graphics.lineStyle(2, 2);
tShape.graphics.drawCircle(spawnX, spawnY, 10);
tShape.graphics.endFill();
stage.addChild(tShape);
unit.shape = tShape;
return unit;
}
函数createUnit(健康:int,攻击:int,到达:int,速度:int,友好:Boolean,类型:String):对象{
var unit=新对象();
unit.cHealth=健康;
unit.tHealth=健康;
unit.uAttack=攻击;
unit.uReach=到达距离;
unit.uSpeed=速度;
如果(友好){
unit.xSpeed=-速度;
}否则{
unit.xSpeed=速度;
}
单位速度=0;
unit.isFriendly=友好;
unit.unitType=类型;
unit.updateUnit=函数(){
if(unit.cHealth我在Flash中对as3中的形状做得不多,但我对movieclips做了很多。这似乎是您应该使用的对象。我建议尝试使用movieclip而不是形状,看看您是否仍然存在同样的问题。(仅当您最终需要movieclip附带的所有功能时才使用movieclip,因为它是最重的DisplayObject)
我看到的另一件事是,您从未设置形状的位置。您总是将形状的位置设置为0,0(从不指定)。您应该这样做
tShape.x = spawnX;
tShape.y = spawnY;
然后只需在形状中的0,0处绘制圆。drawCircle命令在形状中具有自己位置的x、y值处绘制圆。形状是一个与精灵、MovieClip和按钮相同的显示对象。flash中的所有显示对象在0,0处创建时自动初始化其x和y位置
对shape.graphics进行绘图调用时,坐标相对于形状的原点。换句话说,形状有自己的变换
要修复代码,请更改此行:
tShape.graphics.drawCircle(spawnX, spawnY, 10);
致:
因此,绘制圆时,圆心位于形状的原点0,0
然后使用设置形状的位置
tShape.x = spawnX;
tShape.y = spawnY;
从那里,您的代码将按预期工作
另一方面,Actionsript通过使用严格的类型来提高性能,尽管这不是必需的。在项目后期重构时,为您的单元使用对象的选择可能值得再次探讨,并将其从通用对象转换为自定义类类型。使用对象不会破坏您的游戏,但为其创建类型可能会让我感到意外如果游戏需要额外的性能,请提高游戏性能。你读过吗?这就是我正在做的事情……我昨天开始使用flash,但有Java的背景。Java和AS3一样都是重OOP的。为什么要嵌套这样的函数。你的作用域将非常难以管理。你可能想查看document类来获得它我们自己是按照正确的路线开始的。无意冒犯,但这种编码风格很可怕。因为你没有遵循标准OOP,我怀疑你会得到答案。正如你所知道的,原点通常是边界框的左上角,其中包含你要找的元素。哦,我知道这很可怕,我在没有查看clas的情况下开始了它s在AS3中的功能。如果我错了,请纠正我,但由于我将每个形状作为舞台的子对象添加,因此它们的(x,y)正如您所说,coords应该位于舞台的左上角。MovieClip
是最重的DisplayObject
并且不应该被推荐,除非它的所有功能都是必需的,例如具有时间线和能够包含子对象。访问了解我的意思。基于他对spawnin所做的g我猜他最终会想要这些功能中的大部分,而不仅仅是一个圆……但如果不是这样,我已经编辑了我的答案,以确保这是清楚的。我个人认为OP对flash来说是新的,真的需要学习基础知识。正如问题所述,getY和getX正在返回与原点的距离。在这个“函数”中他在叫“.x”和“.y”,这是形状的当前位置,不知道距离会从哪里来。所以,祝你好运,但这个问题没有正确的答案。
tShape.x = spawnX;
tShape.y = spawnY;