左右撞击碰撞有问题,它会检测到它,但是如果你按住例如右键,你可以穿过一堵墙,而没有任何真正的挣扎,无论是厚还是薄的
。我知道我的碰撞检测不是很好,但这是我的第一个项目,因为我正在尝试一些简单的东西。
xFart是x方向上的速度,fart康斯坦特是你可以为更高或更低的速度而改变的常数,friksjons康斯坦特是游戏中的摩擦力。
希望得到一些帮助,而不仅仅是绷带:)
package AS
{
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.geom.Point;
public class Bane extends MovieClip
{
//Bevegelse variabler
private var goUp:Boolean;
private var goDown:Boolean;
private var goLeft:Boolean;
private var goRight:Boolean;
//Fart variabler
private var xScrollFart:Number = 10;
private var yScrollFart:Number = 10;
private var xFart:Number = 0;
private var yFart:Number = 0;
//Konstanter som kan endres
private var minFart:Number = 0.5;
private var maksFart:Number = 18;
private var gravitasjonKonstant:Number = 1.8;
private var hoppeKonstant:Number = 35;
private var fartKonstant:uint = 4;
private var friksjonKonstant:Number = 0.95;
//Kollisjon
private var upBumping:Boolean = false;
private var downBumping:Boolean = false;
private var leftBumping:Boolean = false;
private var rightBumping:Boolean = false
//Kollisjonspunkter
private var leftBumpPoint:Point = new Point(300 - 20, 300 - 40);
private var rightBumpPoint:Point = new Point(300 + 20, 300 - 40);
private var upBumpPoint:Point = new Point(300, 300 - 80);
private var downBumpPoint:Point = new Point(300, 300);
public function Bane()
{
goUp = false;
goDown = false;
goLeft = false;
goRight = false;
Constants.stageRef.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
Constants.stageRef.addEventListener(KeyboardEvent.KEY_UP, keyUp);
Constants.stageRef.addEventListener(Event.ENTER_FRAME, frameListener);
}
private function keyDown(evt:KeyboardEvent)
{
if(evt.keyCode==65) {goLeft=true}
if(evt.keyCode==68) {goRight=true}
if(evt.keyCode==87) {goUp=true}
if(evt.keyCode==83) {goDown=true}
if(evt.keyCode==37) {goLeft=true}
if(evt.keyCode==38) {goUp=true}
if(evt.keyCode==39) {goRight=true}
if(evt.keyCode==40) {goDown=true}
}
private function keyUp(evt:KeyboardEvent)
{
if(evt.keyCode==65) {goLeft=false}
if(evt.keyCode==68) {goRight=false}
if(evt.keyCode==87) {goUp=false}
if(evt.keyCode==83) {goDown=false}
if(evt.keyCode==37) {goLeft=false}
if(evt.keyCode==38) {goUp=false}
if(evt.keyCode==39) {goRight=false}
if(evt.keyCode==40) {goDown=false}
}
//Kjører koden 29 ganger i sekundet, hver frame
private function frameListener(e:Event)
{
//Kollisjon
if(this.hitTestPoint(upBumpPoint.x, upBumpPoint.y, true))
{
trace("upBumping");
upBumping = true;
}
else
{
upBumping = false;
}
if(this.hitTestPoint(downBumpPoint.x, downBumpPoint.y, true))
{
trace("downBump");
downBumping = true;
}
else
{
downBumping = false;
}
if(this.hitTestPoint(leftBumpPoint.x, leftBumpPoint.y, true))
{
trace("leftBump");
leftBumping = true;
}
else
{
leftBumping = false;
}
if(this.hitTestPoint(rightBumpPoint.x, rightBumpPoint.y, true))
{
trace("rightBump");
rightBumping = true;
}
else
{
rightBumping = false;
}
if(leftBumping)
{
if(xFart < 0)
{
xFart *= -0.5;
}
}
if(rightBumping)
{
if(xFart > 0)
{
xFart *= -0.5;
}
}
if(upBumping)
{
if(yFart < 0)
{
yFart *= -0.5;
}
}
if(downBumping)
{
if(yFart > 0)
{
yFart *= 0;
}
goDown = false;
}
if(goLeft == true)
{
xFart -= fartKonstant
}
if(goRight == true)
{
xFart += fartKonstant
}
if(goDown == true)
{
yFart += fartKonstant
}
if(Math.abs(xFart) <= minFart)
{
xFart = 0
}
if(xFart >= maksFart)
{
xFart = maksFart;
}
if(xFart <= (maksFart * -1))
{
xFart = maksFart * -1;
}
xFart *= friksjonKonstant;
yFart *= friksjonKonstant;
xScrollFart -= xFart;
yScrollFart -= yFart;
this.x = xScrollFart;
this.y = yScrollFart;
if(downBumping == false)
{
goUp = false;
yFart += gravitasjonKonstant;
}
else if(downBumping == true)
{
if(goUp)
{
yFart = hoppeKonstant * -1;
}
}
}
}
}
您没有解决冲突,这就是问题所在。除了检测碰撞的事实外,您还需要对碰撞对象执行一些操作,以便它们脱离碰撞。
每个模拟报价的当前逻辑如下:
- 检查与框边界的冲突。(顺便说一句,为什么要同时检查相反的边界?物体是否有可能同时与左右边界碰撞?
- 如果发生碰撞,请将速度减半,并沿 x/y 轴将方向更改为相反的方向。
- 根据一些规则更改速度。(顺便说一句,为什么要同时计算相反的运动?你的物体真的可以同时向左和向右移动吗?
- 以当前速度移动对象。
问题是,在整个计算完成后,对象可能仍然与边界发生冲突。您错过了该步骤,在该步骤中,您可以通过沿上一步后发生碰撞的路径向后移动对象来解决碰撞。
因此,要解决此问题,您需要首先在检测到物体时将物体移出碰撞。这应该是您计算的第二步。
- 检查冲突。
- 如果检测到,计算物体与障碍物的碰撞程度,并将其沿来时的路径移回,使其不再发生碰撞。
- 。你的其余逻辑...
以下链接可能很有用:
- 碰撞检测和响应
- 宽相碰撞