我是一名初學者 Flash/AS3 程式員,我有一個非常復雜的問題。如何防止精靈在半空中跳躍?我已經看到與“半空中的精靈/跳躍”相關的另一個問題,但我個人無法弄清楚如何在 AS3 中做到這一點。感謝您的任何回復。代碼:
public class DocumentMain extends MovieClip {
private var _vx: Number;
import flash.utils.Timer;
import flash.ui.Keyboard;
import flash.events.Event;
import flash.events.KeyboardEvent;
private var _vy: Number;
public function DocumentMain() {
// constructor code
_vx = 0;
_vy = 0
_startMarker.visible = false;
this.addEventListener("enterFrame", a);
stage.addEventListener("keyDown", b);
stage.addEventListener("keyUp", c);
_windows.addEventListener("enterFrame", handleCollision);
function handleCollision( e:Event ):void
{
{
var collisionWall:Boolean = false;
if (wall.hitTestObject(_windows)) {
collisionWall = true;
}
if (collisionWall) {
while (collisionWall) {
_windows.x = 0.1;
collisionWall = false;
if (wall.hitTestObject(_windows)) {
collisionWall = true;
}
}
_vx = 0;
}
}
}
function a(e:Event):void {
_vy = 2;
_windows.x = _vx;
_windows.y = _vy;
if (_vy > 0) {
if (_windows.y > stage.stageHeight) {
_windows.x = _startMarker.x;
_windows.y = _startMarker.y;
_vy = 0;
}
else {
var collision:Boolean = false;
if (ground.hitTestObject(_windows)) {
collision = true;
}
if (collision) {
while (collision) {
_windows.y -= 0.1;
collision = false;
if (ground.hitTestObject(_windows)) {
collision = true;
}
}
_vy = 0;
}
}
}
}
function b(e:KeyboardEvent):void {
var step:uint = 5
switch (e.keyCode) {
case 37:
_windows.rotationY = -180;
_vx = -7;
break;
case 39:
_windows.rotationY = 0;
_vx = 7;
break;
case 38:
_vy = -20;
break;
}
}
function c(e:KeyboardEvent):void {
switch (e.keyCode) {
case 37:
case 39:
_vx = 0;
}
}
}
}
uj5u.com熱心網友回復:
您需要為玩家控制的精靈宣告“在地面上”的條件(我希望在這里它被稱為_windows),并基于該條件,讓玩家使用向上鍵更改垂直速度,或者忽略。
您在這里有一段代碼旨在處理您的函式中的地面碰撞(粗略,但從我所看到的情況來看確實有效)a(e:Event),如果與地面,設定為真。由于您的函式首先應用“重力”然后檢查碰撞,因此它應該可以正確處理懸崖/斜坡以及跳躍。因此,您Boolean在游戲類中宣告一個變數,例如“isOnGround”,首先將其設定為 false,然后檢查與地面的碰撞,如果為 true,則將該變數設定為 true。然后,在b()函式處(“keyDown”處理程式)檢查 var 是否為真,如果是,則允許跳轉,因此您可以愉快地設定_vy,否則您什么也不做。
// adding only changed fragments
public class DocumentMain extends MovieClip {
private var _isOnGround:Boolean; // the flag
...
function a(e:Event):void {
...
_isOnGround = false; // reset flag
if (ground.hitTestObject(_windows)) {
collision = true;
_isOnGround = true; // we ARE on ground, rest isn't relevant here
}
...
}
}
function b(e:KeyboardEvent):void {
...
case 38:
if (_isOnGround) { // check here
_vy = -20;
_isOnGround = false; // just in case here
} // otherwise do nothing
break;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416905.html
標籤:
