我在 as3 中為學校做一個評估任務,我做了一個功能,如果角色沒有站在某物的頂部,它會讓角色跌倒,但布爾變數跌倒在不應該的情況下繼續保持。我已經弄清楚是什么導致它停止了很短的時間然后再次跌倒超過它所站立的地方是速度值增加了超過它所在的地板所以我在另一個地方重置了代碼中的速度值但是那不解決下降布林值在不應該時為真的問題。
我在 if(falling) 陳述句的 gameEngine 函式中的臨時解決方案中發表了評論
// Imports
import flash.events.KeyboardEvent;
import flash.events.Event;
// Constants that can be edited
const grav:Number = 0.05;
const jumpPow:Number = 15;
const walkingDistance = 50;
// Variables
var jumpVel:Number = jumpPow;
var velocity:Number = 0;
var dt:Number = 0;
var movingCount:Number = 0;
var newX:Number = 0;
var newY:Number = 0;
var charCornerHit:Number = 0; // 0 = TL 1 = TR 2 = BR 3 = BL (clockwise)
var jumping:Boolean = false;
var falling:Boolean = false;
var movingRight:Boolean = false;
var movingLeft:Boolean = false;
var hitDetVal:Boolean = false; // false
var floorHit:Boolean = false;
var object1Hit:Boolean = false;
var cCnrTL:Array = new Array(char.x, char.y);
var cCnrTR:Array = new Array(char.x char.width, char.y);
var cCnrBR:Array = new Array(char.x char.width, char.y char.height);
var cCnrBL:Array = new Array(char.x, char.y char.height);
var charCorners:Array = new Array(cCnrTL, cCnrTR, cCnrBR, cCnrBL); // Clockwise
addEventListener(Event.ENTER_FRAME, gameEngine);
function gameEngine(evt:Event):void{
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveCharacter);
charCorners[0][0] = char.x;
charCorners[0][1] = char.y;
charCorners[1][0] = char.x char.width;
charCorners[1][1] = char.y;
charCorners[2][0] = char.x char.width;
charCorners[2][1] = char.y char.height;
charCorners[3][0] = char.x;
charCorners[3][1] = char.y char.height;
//trace(char.y);
// Check if char is standing on something
// Supposed to only check when character is not falling
if (falling == false) {
//trace(char.y char.height 1)
hitDetection(0, char.y char.height 1)
if (hitDetVal == false) {
falling = true;
hitDetVal = false;
trace("not standing");
}
else {trace("standing on something");}
}
// Move char loop
if (movingRight){
if (movingCount == walkingDistance) {
movingCount = 0
movingRight = false;
} else {
char.x =1
movingCount = 1;
}
} else if (movingLeft) {
if (movingCount == walkingDistance) {
movingCount = 0
movingLeft = false;
} else {
char.x-=1
movingCount = 1;
}
}
//trace(velocity)
if (falling) {
dt = 1
velocity = velocity grav*dt
hitDetection(0, velocity)
if (hitDetVal) {
falling = false;
hitDetVal = false;
// TEMPORARY SOLUTION - Stopped character from falling past the floor but still ran falling condition
//velocity = 0;
//dt = 0;
if (floorHit) {
if (char.y < floor.y){
char.y = floor.y - char.height;
floorHit = false;
trace("Char Stopped falling")
}
} else if (object1Hit) {
if (char.y - char.height < object1.y){
char.y = object1.y - char.height;
object1Hit = false;
trace("Char Stopped falling")
}
}
} else {
char.y = velocity;
}
} else {
if (jumping) {
}
velocity = 0;
dt = 0;
}
}
function moveCharacter(event:KeyboardEvent):void{
if(event.keyCode == Keyboard.LEFT){
if(movingRight){
movingRight = false;
trace("STOPPED")
} else {
movingCount = 0
movingLeft = true;
trace("LEFT");
}
}
if(event.keyCode == Keyboard.RIGHT){
if(movingLeft){
movingLeft = false;
trace("STOPPED")
} else {
movingCount = 0
movingRight = true;
trace("RIGHT");
}
}
if(event.keyCode == Keyboard.UP){
jumping = true;
trace("UP");
}
}
function hitDetection(distX:Number, distY:Number) {
for (var i:uint = 0; i < charCorners.length; i ) {
newX = charCorners[i][0] distX;
newY = charCorners[i][1] distY;
if (floor.hitTestPoint(newX, newY, true)){
hitDetVal = true;
floorHit = true;
charCornerHit = i;
break;
} else if (object1.hitTestPoint(newX, newY, true)){
hitDetVal = true;
object1Hit = true;
charCornerHit = i;
break;
}
}
}```
uj5u.com熱心網友回復:
這是一個簡單的邏輯錯誤
hitDetection(0, char.y char.height 1)
,當我的 hitDetection 函式已經對角色的每個角落進行了調整時,我通過將 char.y 添加到值來調整位置。只花了大約3個小時就弄清楚了
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/492384.html
