我想要一个可旋转的线,由箭头键控制。当你点击鼠标时,一个球从光标上落下,当它碰到线时停下来。AS3碰撞检测问题?
但是,球总是停在线的最高点,穿过平行于x轴的线。
我的文档类如下:
package
{
import flash.display.MovieClip;
import flash.events.*
import flash.display.Stage
import ball
public class Engine extends MovieClip
{
public static var stageRef:Stage
private static var leftKey:Boolean = false
private static var rightKey:Boolean = false
public static var pi = Math.PI
public static var lineRotate:Number = 0
public static var spinRate:Number = 60
public static var ground:line = new line()
public function Engine()
{
// constructor code
stage.addEventListener(Event.ENTER_FRAME, loop)
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler)
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler)
stage.addEventListener(MouseEvent.CLICK, addBall)
stageRef = stage
ground.x = 300
ground.y = 200
stage.addChild(ground)
}
private static function keyDownHandler(e:KeyboardEvent)
{
if (e.keyCode == 37) //left
{
leftKey = true
}
if (e.keyCode == 39)
{
rightKey = true
}
}
private static function keyUpHandler(e:KeyboardEvent)
{
if (e.keyCode == 37) //left
{
leftKey = false
}
if (e.keyCode == 39) //right
{
rightKey = false
}
}
public function loop(e:Event)
{
spin()
}
public static function addBall(e:MouseEvent) //adds ball
{
var tempBall:ball = new ball()
tempBall.x = e.stageX
tempBall.y = e.stageY
stageRef.addChild(tempBall)
}
private static function spin() //spins the "ground" line
{
if (leftKey) // minus
{
lineRotate -= spinRate
}
if (rightKey) // plus
{
lineRotate += spinRate
}
ground.rotation = lineRotate * (pi/180) //convert to radians
}
}
}
对球的类如下:
package
{
import flash.display.MovieClip;
import flash.events.*
public class ball extends MovieClip
{
public var vX:Number = 0
public var vY:Number = 2
private var gravity:Number = 0
public function ball()
{
// constructor code
addEventListener(Event.ENTER_FRAME, loop)
}
public function loop(e:Event)
{
this.x += vX
this.y += vY
this.vY += gravity
if (this.x > stage.stageWidth || this.x < 0 || this.y < 0 || this.y > stage.stageHeight)
{
removeSelf()
}
if (Engine.ground.hitTestObject(this))
{
trace('yep')
stopBall()
}
else
{
trace('nope')
}
}
public function removeSelf()
{
removeEventListener(Event.ENTER_FRAME, loop)
this.parent.removeChild(this)
}
public function stopBall()
{
gravity = 0
vY = 0
vX = 0
}
}
}
我已经上传到瑞士法郎here.
雅,我明白你的意思与整个classng的东西。这最终会逐渐渗透到一个更大的游戏中,并且这样更有条理。我知道我只有一条线和球,所以我觉得把它们分类是一个不错的主意,因为所有的东西都是分开的。 谢谢反正!当我有第二个时,我会尝试你的建议... – Electriczap4
当你意识到后果并且你不关心他们时,在事情发生的时候就可以破解它。从一开始,从正确的角度思考它仍然是一个好主意:)。你不需要单独的类,引擎可以接管你需要的东西。注意我没有关于发送一个引用到底的问题......这是否是一个好主意也是有争议的,但是对于这个代码来说它确实不重要,因为它的大小......按照逻辑来分组的东西是好的if它是为了达到目的,并不总是有一个“正确”的方式来做到这一点,虽然有快速和缓慢。玩的开心! – Neoraptor
你的代码很好。它有一个小的不需要的依赖。我对此感到困扰,因为我知道当人们开始编程时,他们不知道这样的事情。我以为你是新人,所以我搞砸了你,因为我必须以艰难的方式学习它...... 2000-3000行的代码游戏让我头痛,因为我的依赖主要是愚蠢的。我大约在喊OOP。再加上所有的书籍和内容都没有提出这些简单的东西,我窃听你。事实上,我自己在那场比赛中学会了自己。成为程序员的10倍。这就是为什么我关注这个:) – Neoraptor