我最近学到了一些动作脚本,我决定给自己做一个简单的弓箭游戏。到目前为止,我已经让箭头以一种弧形的方式飞行。接下来我要做的就是拉弓,然后就可以拉绳子了。
到目前为止,我认为我将以MC的身份绘制弓,并使用图形来绘制弦。我已经到了该拉绳子的时候了,但我不知道如何从这里继续前进。任何建议都将不胜感激。
如果可能,只要给我一个指针,我想自己编写代码,我不是要求一个完成的结果。
代码:
package {
import flash.display.MovieClip;
import flash.display.Shape;
import flash.display.Stage;
import flash.events.MouseEvent;
public class bow extends MovieClip {
var myStage:Stage;
var bowString:Shape;
var bowStringMc:MovieClip;
public function bow(stageRef) {
this.myStage = stageRef;
myStage.addChild(this);
this.x = myStage.stageWidth / 2;
this.y = myStage.stageHeight / 2;
this.drawBowstring();
}
public function drawBowstring() {
bowString = new Shape();
bowStringMc = new MovieClip();
bowStringMc.addChild(bowString);
myStage.addChild(bowStringMc);
bowString.graphics.lineStyle(2, 0x000000);
bowString.graphics.curveTo(-50,this.height/2,0,(this.height-10));
bowStringMc.x = this.x-1;
bowStringMc.y = this.y - this.height / 2 + 5;
bowStringMc.addEventListener(MouseEvent.MOUSE_DOWN, pullBowstring);
}
public function pullBowstring(e:MouseEvent) {
// Have to start redrawing the graphic i gess but how?
}
}
}更新
Thx vvMINOvv & Slomojo,这两个答案对我很有帮助!我目前有2条线,这是当弓拉回时我重新绘制的图形。
如果其他人想看看我是怎么做到的,这里有一个粗略的片段:
public function drawBowstring() {
bowStringTop = new Shape();
bowStringBottom = new Shape();
bowStringMc = new MovieClip();
bowStringMc.addChild(bowStringTop);
bowStringMc.addChild(bowStringBottom);
myStage.addChild(bowStringMc);
bowStringTop.graphics.lineStyle(2, 0x000000);
bowStringTop.graphics.moveTo(0, 0);
bowStringTop.graphics.lineTo(0, this.height / 2);
bowStringBottom.graphics.lineStyle(2, 0x000000);
bowStringBottom.graphics.moveTo(0, this.height-10);
bowStringBottom.graphics.lineTo(0, this.height / 2);
bowStringMc.x = this.x-1;
bowStringMc.y = this.y - this.height / 2 + 5;
this.hand.addEventListener(MouseEvent.MOUSE_DOWN, pullBowstring);
}
public function pullBowstring(e:MouseEvent) {
myStage.addEventListener(MouseEvent.MOUSE_MOVE, reDrawBowstring);
myStage.addEventListener(MouseEvent.MOUSE_UP, releaseBowstring);
}
public function releaseBowstring(e:MouseEvent) {
myStage.removeEventListener(MouseEvent.MOUSE_MOVE, reDrawBowstring);
myStage.removeEventListener(MouseEvent.MOUSE_UP, releaseBowstring);
}
public function reDrawBowstring(e:MouseEvent) {
if (this.hand.x < -18 || this.hand.x > 0) {
this.releaseBowstring(e);
}
this.hand.x = mouseX;
this.arrow.x = mouseX;
bowStringTop.graphics.clear();
bowStringBottom.graphics.clear();
bowStringTop.graphics.lineStyle(2, 0x000000);
bowStringTop.graphics.moveTo(0, 0);
bowStringTop.graphics.lineTo(this.hand.x, (this.height / 2)-5);
bowStringBottom.graphics.lineStyle(2, 0x000000);
bowStringBottom.graphics.moveTo(0, this.height-10);
bowStringBottom.graphics.lineTo(this.hand.x, (this.height / 2)-5);
}发布于 2011-01-17 07:20:38
你可以在flash中使用draw类。所以一个简单的例子可能看起来像这样。
myString.graphics.clear();
myString.graphics.lineStyle(1);
myString.graphics.moveTo(bowTopX,bowTopY);
myString.graphics.curveTo(mouseX,mouseY,bowBottomX,bowBottomY);这将从弓的顶部到底部绘制一条线,并沿鼠标所在的方向弯曲。你可以让代码在一个函数中运行,这个函数会在每次flash刷新显示或其他东西时调用,或者在鼠标移动时调用。clear()允许您清除特定形状并重新绘制它,如果以足够快的时间间隔完成此操作,它看起来就像是动画
希望这篇文章能让您对可能发生的事情有所了解。
发布于 2011-01-17 04:27:36
在这个阶段最好的事情是准确地定义您希望如何与弓进行交互。
根据渲染比例的不同,您只需绘制弓形字符串,使其在鼠标按下时跟随鼠标指针,但限制为您喜欢的限制。
在拉回时,你最好把绳子画成两条线,从弓的两端到受约束的鼠标位置。
当您释放弓时,您可能希望在给定点(可能是当弓弦到达平坦点时)将弦绘制为单条曲线,以便您可以绘制弦运动的弹性阶段。(当涉及到休息时。)
希望你熟悉补间引擎,如果不熟悉,可以看看Desuades Motion Package或Tweensy。(你可以在http://fluxdb.fluxusproject.org上找到它们)
https://stackoverflow.com/questions/4707699
复制相似问题