Actionscript 3 有人能帮我检测平台的碰撞吗?(Actionscript 3.0)
我目前正在制作一个flash platformer引擎…但是我的碰撞检测需要一些重要的帮助。每当我的角色“跳跃”并落在碰撞对象上时,他都会在一瞬间穿过碰撞对象的一半,然后回到顶部(我希望他在那里)。如果我继续跳几次,他出现的阴影,如果你愿意的话,会在一瞬间越来越深入到碰撞物体中,最终使他一路坠落。这是我主要课程的代码,如果你需要我澄清什么,请询问Actionscript 3 有人能帮我检测平台的碰撞吗?(Actionscript 3.0),actionscript-3,collision-detection,collision,Actionscript 3,Collision Detection,Collision,我目前正在制作一个flash platformer引擎…但是我的碰撞检测需要一些重要的帮助。每当我的角色“跳跃”并落在碰撞对象上时,他都会在一瞬间穿过碰撞对象的一半,然后回到顶部(我希望他在那里)。如果我继续跳几次,他出现的阴影,如果你愿意的话,会在一瞬间越来越深入到碰撞物体中,最终使他一路坠落。这是我主要课程的代码,如果你需要我澄清什么,请询问 package { import flash.display.MovieClip; import flash.events.Event; impo
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.display.Stage;
import Player;
import HitObject;
public class TestGame extends MovieClip {
private var _hitObject:HitObject;
private var _player:Player;
private var _leftArrow:Boolean;
private var _rightArrow:Boolean;
private var _upArrow:Boolean;
private var _hit:Boolean;
private var _fall:Boolean;
private var _jump:Boolean = true;
private var _velR:Number = 0;
private var _velL:Number = 0;
private var _scale:Number = .1;
private var _jumpCount:Number = 0;
private var _i:Number = .5;
private var _i2:Number = 7;
private var _i3:Number = 0;
private var _adjustHit:Number;
private var _jumpRL:Number;
private var _jumpVel:Number;
public function TestGame() {
_hitObject = new HitObject();
_player = new Player();
addChild(_hitObject);
addChild(_player);
_hitObject.x = (stage.width * 0.5) + 50;
_hitObject.y = (stage.height * 0.5) + 150;
_hitObject.scaleY = 3;
_hitObject.alpha = .5;
_player.scaleX = _scale;
_player.scaleY = _scale;
_player.x += 200;
_player.y += 250;
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
}
private function enterFrameHandler(e:Event) {
if(_player.hitTestObject(_hitObject)) {
_adjustHit = _hitObject.y - _hitObject.height/2 - _player.height/2;
_player.y = _adjustHit;
_hit = true;
_jump = false;
if(_i3 > 8) {
_jump = true;
}
_jumpCount = 0;
_i2 = 7;
_fall = false;
_i3++;
}
else if(!_player.hitTestObject(_hitObject) && !_upArrow) {
_fall = true;
}
if(_fall) {
_player.y += _i;
_i += .5;
if(_i < 3) {
_i = 3;
}
_hit = false;
}
if(_upArrow && _hit && _jump) {
if(_velR > 0) {
_jumpRL = _velR;
_jumpVel = _velR;
}
else if(_velL > 0) {
_jumpRL = -_velL;
_jumpVel = _velL;
}
else {
_jumpVel = 1;
if(_player.scaleX == .1) {
_jumpRL = 1;
}
else {
_jumpRL = -1;
}
}
_player.y -= _i2 + _jumpVel/2;
_player.x += _jumpRL/2;
_jumpCount += _i2;
_i2 -= .5;
_fall = false;
if(_i2 < -3) {
_jumpCount = 61;
}
if(_jumpCount > 60) {
_i2 = 7;
_jump = false;
_fall = true;
_jumpCount = 0;
}
_i3 = 0;
}
if(_rightArrow) {
_player.startRun();
_player.scaleX = _scale;
_velL = 0;
_player.x += _velR;
if(_velR < 20) {
_velR += 2;
}
if(_velR > 20) {
_velR = 20;
}
}
else if(_leftArrow) {
_player.startRun();
_player.scaleX = -_scale;
_velR = 0;
_player.x -= _velL;
if(_velL < 20) {
_velL += 2;
}
if(_velL > 20) {
_velL = 20;
}
}
if(_velR > 0) {
_player.x += _velR;
_velR -= .7;
}
else if(_velL > 0) {
_player.x -= _velL;
_velL -= .7;
}
if(_velR < 0 || _velL < 0) {
_velR = 0;
_velL = 0;
}
}
private function keyDownHandler(e:KeyboardEvent):void {
if(e.keyCode == 39) {
_rightArrow = true;
}
if(e.keyCode == 37) {
_leftArrow = true;
}
if(e.keyCode == 38) {
_upArrow = true;
}
}
private function keyUpHandler(e:KeyboardEvent):void {
_upArrow = false;
_rightArrow = false;
_leftArrow = false;
}
}
包{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.events.KeyboardEvent;
导入flash.display.Stage;
进口球员;
导入对象;
公共类TestGame扩展了MovieClip{
私有变量hitObject:hitObject;
私有变量玩家:玩家;
私有变量左箭头:布尔值;
私有变量_rightArrow:布尔值;
私有变量向上箭头:布尔值;
私有变量hit:Boolean;
私有变量:布尔值;
private var_jump:Boolean=true;
私有变量水平:数字=0;
私有变量水平:数字=0;
私有var_标度:数字=0.1;
私有变量_jumpCount:Number=0;
私有变量i:Number=.5;
私有变量i2:Number=7;
私有变量i3:Number=0;
私有变量_adjustHit:Number;
专用变量:编号;
私有变量_jumpVel:编号;
公共函数TestGame(){
_hitObject=新的hitObject();
_player=新玩家();
addChild(_hitObject);
addChild(_player);
_hitObject.x=(stage.width*0.5)+50;
_hitObject.y=(stage.height*0.5)+150;
_hitObject.scaleY=3;
_hitObject.alpha=.5;
_player.scaleX=_scale;
_player.scaleY=\u scale;
_player.x+=200;
_player.y+=250;
stage.addEventListener(Event.ENTER\u FRAME,enterFrameHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN,keydowHandler);
stage.addEventListener(KeyboardEvent.KEY\u UP,keyUpHandler);
}
私有函数enterFrameHandler(e:事件){
if(_player.hitTestObject(_hitTestObject)){
_调整命中=_hitObject.y-_hitObject.height/2-_player.height/2;
_player.y=_=hit;
_命中=真;
_跳跃=假;
如果(_i3>8){
_跳跃=真;
}
_跳数=0;
_i2=7;
_fall=false;
_i3++;
}
如果(!\u player.hitTestObject(\u hitTestObject)和(&!\u upArrow),则为else{
_秋天=真;
}
如果(_fall){
_player.y+=\u i;
_i+=0.5;
如果(_i<3){
_i=3;
}
_命中=错误;
}
如果(_向上箭头&&u击中&&u跳跃){
如果(_水平>0){
_jumpRL=_-velR;
_jumpVel=_velR;
}
否则,如果(_级别>0){
_jumpRL=-\u水平;
_jumpVel=_velL;
}
否则{
_jumpVel=1;
如果(_player.scaleX==.1){
_jumpRL=1;
}
否则{
_jumpRL=-1;
}
}
_player.y-=\u i2+\u jumpVel/2;
_player.x+=\u jumpRL/2;
_跳线计数+=\u i2;
_i2-=.5;
_fall=false;
如果(_i2<-3){
_跳跃计数=61;
}
如果(_jumpCount>60){
_i2=7;
_跳跃=假;
_秋天=真;
_跳数=0;
}
_i3=0;
}
如果(_向右箭头){
_player.startRun();
_player.scaleX=_scale;
_velL=0;
_player.x+=\u级别;
如果(_水平<20){
_velR+=2;
}
如果(水平>20){
_velR=20;
}
}
else if(_leftArrow){
_player.startRun();
_player.scaleX=-\u刻度;
_velR=0;
_player.x-=\u水平;
如果(水平<20){
_velL+=2;
}
如果(水平>20){
_velL=20;
}
}
如果(_水平>0){
_player.x+=\u级别;
_velR-=.7;
}
否则,如果(_级别>0){
_player.x-=\u水平;
_水平-=.7;
}
如果(_水平<0 | | | u水平<0){
_velR=0;
_velL=0;
}
}
私有函数keyDownHandler(e:KeyboardEvent):void{
如果(e.keyCode==39){
_右箭头=真;
}
如果(e.keyCode==37){
_leftArrow=true;
}
如果(e.keyCode==38){
_向上箭头=真;
}
}
私有函数keyUpHandler(e:KeyboardEvent):void{
_向上箭头=假;
_右箭头=假;
_leftArrow=false;
}
}
}如果您只是想要易于使用的碰撞检测,请查看for Actionscript 3。我以前使用过它,它胜过我使用过的所有其他碰撞检测框架 如果您只是想要易于使用的碰撞检测,请查看for Actionscript 3。我以前使用过它,它胜过我使用过的所有其他碰撞检测框架 根据您所说的,在时间't'时,玩家似乎还没有击中物体,但在时间't+1'时,玩家移动了10px(例如),因此现在似乎卡在物体中,直到您的碰撞处理程序将玩家移动到正确的位置 此外,由于上下跳跃,可能在碰撞后,球员在其位置增加之前没有正确地向后移动,这就是为什么随着时间的推移,如果你继续跳跃,球员最终会摔倒的原因 比较数字时要小心。我看到一个假设