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ステートメントではなく、最初に1つの単純な「ifnotspacereturnspace」でこれを実行します。

その後、あなたはあなたのランダムで始めることができます-それはあなたのために働くはずです。

于 2012-06-14T16:18:57.943 に答える
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

以前にスペースがあった時間の約4分の1は、次のコードのために別のスペースを作成します。

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

以前にスペースが作成されたときにスペースを作成していることに注意してください。


サイドノート:

この行の必要はありません&& rand1 > 25

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

以前に持っていたので、その行の時点でいつになることif(ptg == 'space' && rand1 <= 25){は不可能です。rand1<= 25ptg == 'space'

(同様&& rand2 > 50に、次の条件で。)

于 2012-06-14T16:15:09.313 に答える
0

インクリメントしてもよろしいですchunktogeneratetoか?

現在のコードでは0のままであるように見えますが、表示していないセグメントに含まれていますか?

編集:ああ、それは関数の引数です。その変数をログに記録してみてください、多分それが問題ですか?

于 2012-06-14T16:19:46.440 に答える
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のロジックをスペースとして分離し、1回だけテストするようにします
  3. 割り当て、比較などがより高速で堅牢になるため、アクションを文字列ではなく数値として表すことを検討してください。
于 2012-06-14T16:25:30.853 に答える