1

これは、ゲームアプリケーション用です。変数skipnpcを宣言します。これは、ノンプレイヤーキャラクターが自分のターンを使用し、その行動に関連するAIコードが一定期間スキップされることを示すインジケーターとして設計されています。私が抱えている問題は、skipnpcの値が失われていることです。発行するconsole.logコマンドのどこが可変スコープに関連しているのかを示しましたが、修正方法がわかりません。

function npcMovement() {
    skipnpc = false;...
    sql4 = "SELECT id FROM game_moblist WHERE spawn_id =" + spawnid + " AND posx=" + parseInt(mobpathx[mobpathx.length - 1]) + " AND posy=" + parseInt(mobpathy[mobpathy.length - 1])
    connection.query(sql4, function (err, send, fields) {
        console.log("skipnpc pathing")
        io.sockets.emit('groupmoveresult', send, parseInt(mobpathx[mobpathx.length - 1]), parseInt(mobpathy[mobpathy.length - 1]))
        skipnpc = true
        console.log("skipnpc=true:" + skipnpc)
    });
    console.log("skipnpc = false:" + skipnpc)

後で使用します

if (skipnpc==false){
  ...

それ以上のAIコードが試行される前

4

2 に答える 2

2

connection.queryは非同期で実行されます。したがって、完了する前に、ここで最終行に到達します。

于 2012-08-01T16:23:43.273 に答える
1

簡単に言えば、最後にヒットするskipnpcまでにまだ存在することが保証されています。結果を確認する前に、実行する時間を与えていません。結果に依存するものはすべて、渡したコールバックの一部として実行する必要があります。そうしないと、アクセスしようとしたときに結果が表示されません。falseconsole.log(...)connection.query(...)connection.query(...)

非同期プログラミングには多少の慣れが必要です。asyncモジュールとそのメソッドを使用してコードを再編成し、waterfall(...)すべてが深くネストされないようにすることができる場合があります。ただし、非同期呼び出しを行うと、コードがその直後を流れることを理解する必要があります。

于 2012-08-02T09:50:35.850 に答える