0

我的代码有效(不会失败),但它没有做正确的事情。

每次我想生成一个新的“块”时,我都会调用“生成”函数,每次调用时都会将一个新数字传递给函数。它可以很好地生成块,但它不会生成我希望它生成的内容。

如果上一代是空格,我希望它生成空格、跳跃、幻灯片或间隙。但如果上一代不是空间,则生成空间。它不这样做。它有时会产生 2 个间隙、2 个跳跃或 2 个幻灯片,我不知道为什么......?

这是我的代码:

var ptg = 'space'; // what was previously generated to top
var wtgt; // what is currently being generated to top
var chunktogenerateto = 0;

function generate(a){
    chunktogenerateto = a;

    var rand1 = Math.floor(Math.random()*100) + 1;

    if(ptg == 'space' && rand1 <= 25){
        wtgt = 'space';
    }
    else if(ptg == 'space' && rand1 <= 50 && rand1 > 25){
        wtgt = 'jump';
    }
    else if(ptg == 'space' && rand1 <= 75 && rand1 > 50){
        wtgt = 'slide';
    }
    else if(ptg == 'space' && rand1 > 75){
        wtgt = 'gap';
    }
    else{
        wtgt = 'space';
    }

    ptg = wtgt;

    topGen(wtgt);
}

function topGen(g){
    document.getElementById('t' + chunktogenerateto).setAttribute('src','images/terrain/t' + g + '.png');
}

我希望这不是一个错字...帮助!

“生成”的调用来自:

var chunkpos = new Array();
chunkpos[0] = -100;
chunkpos[1] = 0;
chunkpos[2] = 100;
chunkpos[3] = 200;
chunkpos[4] = 300;
chunkpos[5] = 400;
chunkpos[6] = 500;
chunkpos[7] = 600;
chunkpos[8] = 700;
chunkpos[9] = 800;
chunkpos[10] = 900;
chunkpos[11] = 1000;
var temppos = new Array();
var time1;
var millis1;
var time2;
var millis2;
var millis3;
var firstreset = true;
var pos;
var poschange;

function moveLevel(){
    if(firstreset == true){
        resetTime();
    }
    var time2 = new Date();
    var millis2 = time2.getTime();
    var millis3 = millis2 - millis1;
    poschange = Math.floor(millis3 / 5);
    for(i = 0; i < chunkpos.length; i++){
        temppos[i] = chunkpos[i] - poschange;
        if(temppos[i] <= -150){
            generate(i);
            temppos[i] += 1200;
        }
        pos = temppos[i];
        document.getElementById('chunk' + i).setAttribute('style','left: ' + pos + 'px;');
    }
}



function resetTime(){
    time1 = new Date();
    millis1 = time1.getTime();
    if(firstreset != true){
        for(i = 0; i < chunkpos.length; i++){
            chunkpos[i] = temppos[i];
        }
    }
    firstreset = false;
    setTimeout('resetTime()',1000);
}

对“moveLevel”的调用来自:

window.onload = function(){
    if(test = 'runnable')
    {
        gameLoop();
    }
    else
    {
        document.getElementById('gm').innerHTML = (gm + 'Failed to run game.');
    }
}

function gameLoop(){
    if(currentscreen == 'playing'){
        moveLevel();
    }
    setTimeout('gameLoop()',0);
}

这是包含所有代码的 zip 文件的下载链接: ParkourFreak.zip 我遇到问题的代码位于 scripts/generation.js 下。主游戏页面(生成可见的地方是 index.html。

4

5 回答 5

1

而不是每个以“if(ptg == 'space' ... etc”开头的if语句) - 首先在一个简单的“if not space return space”中执行此操作。

之后你可以开始你的随机 - 这应该适合你。

于 2012-06-14T16:18:57.943 回答
0
// elsewhere
var wtgts = ['space','jump','slide','gap'];

// in the function
if(ptg !== 'space') {
    wtgt = 'space';
} else {
    var randidx = Math.floor(Math.random()*4);
    wtgt = wtgts[randidx];
}

甚至在函数中:

var newidx = (ptg == 'space') ? Math.floor(Math.random()*4) : 0;
wtgt = wtgts[newidx];
  1. 权重是相等的,所以只需从 0 到 3 中选择一个随机索引,然后使用它从数组中选择一个动作。
  2. 将 ptg 的逻辑分隔为空间,以便您只测试一次
  3. 考虑将动作表示为数字而不是字符串,因为分配、比较等会更快、更健壮。
于 2012-06-14T16:25:30.853 回答
0

我认为问题出在一代人身上,而事实上我所要做的就是改变这一点:

if(temppos[i] <= -100){
    generate(i);
    temppos[i] += 1200;
}

对此:

if(temppos[i] <= -100){
    generate(i);
    chunkpos[i] += 1200;
    temppos[i] += 1200;
}
于 2012-06-15T00:11:20.230 回答
0

大约四分之一的时间你以前有一个空间,它会创建另一个,因为这段代码:

if(ptg == 'space' && rand1 <= 25){
    wtgt = 'space';
}

请注意,它是在先前创建空间时创建空间。


边注:

&& rand1 > 25这条线上不需要:

else if(ptg == 'space' && rand1 <= 50 && rand1 > 25){

既然你以前有过if(ptg == 'space' && rand1 <= 25){,那条线就不可能rand1<= 25when ptg == 'space'

(同样&& rand2 > 50在以下条件下。)

于 2012-06-14T16:15:09.313 回答
0

你确定你在增加chunktogenerateto

当前代码似乎保持在 0,是在您未显示的段中吗?

编辑:哦,这是函数的参数。尝试记录该变量,也许这就是问题所在?

于 2012-06-14T16:19:46.440 回答