2

私はいくつかのユニークなプロパティを持つ地形ジェネレータを書いていますが、スコープの問題に苦労しています。これは初心者の問題のように思えるかもしれませんが、アーカイブを検索しましたが、問題を明らかにするものは何も見つかりませんでした。関数内に関数があり(このオブジェクトパラダイムに精通していません)、別のオブジェクトから内部関数にアクセスしようとしています。コードで、Chromeコンソールに「UncaughtTypeError:Undefined Waxy.js:45 BoundingBoxwaxy.js:45(匿名関数)のプロパティ'width'を読み取れません」というエラーが表示されます。このエラーは、呼び出し時に最後の行で発生します。 bounds.width'この関数を公開する必要がありますが、どうすればよいですか?

関連するコードは次のとおりです。

//A wrapper class for an int triple
var Point = (function(dimensions) {
  var x = function() {return dimensions.x || 0}
  var y = function() {return dimensions.y || 0}
  var z = function() {return dimensions.z || 0}
})//end Point

//a working set, rectangular prism
var BoundingBox = (function(dimensions) {
  var lowerBound = function(){return Point(dimensions[0])}
  var upperBound = function(){return Point({x:dimensions[1].x + dimensions[0].x, y:dimensions[1].y + dimensions[0].y, z:dimensions[1].z + dimensions[0].z})}

  var width = function() {return this.upperBound.x - this.lowerBound.x}
  var depth = function() {return this.upperBound.y - this.lowerBound.y}
  var height = function() {return this.upperBound.z - this.lowerBound.z}

  var contains = function(cOffset, cDims) {
    return !((cOffset.x < this.lowerBound.x || cOffset.y < this.lowerBound.y || cOffset.z < this.lowerBound.z) ||
      (cDims.x > this.upperBound.x || cDims.y > this.upperBound.y || cDims.z > this.upperBound.z))
  }
  var intersects = function(iOffset, iDims) {
    return ((iOffset.x >= this.lowerBound.x && iOffset.y >= this.lowerBound.y && iOffset.z >= this.lowerBound.z) ||
      (iDims.x <= this.upperBound.x && iDims.y <= this.upperBound.y && iDims.z <= this.upperBound.z))
  }
  var iterator = function() { return BoxIterator(this) }

})//end BoundingBox

//stores terrain value for each x,y,z in a working set (BoundingBox)
//each property in a list has a value for each node in working set
var MapData = (function(workingSet, properties) {
  var bounds = workingSet
  var props = properties
  var data = []
  //make sure property name is spelled right
  var map = function(x,y,z,property) {return data[x,y,z,props.indexOf(property)] }
  var terrainMap = function(x,y,z) {return map(x,y,z,'terrain')}
  //!isEmpty equiv. isTerrain
  var isEmpty = function(x,y,z) {return map(x,y,z,'terrain')===0}
  var tempMap = function(x,y,z){return map(x,y,z,'temperature')}

})//end MapData

//create a sheet of terrain drops
var DropSheet = (function(opts) {
  var depth = opts.depth
  var width = opts.width
  var rate = opts.rate
  var generate = function() {
    for(var i = 0; i<depth * width; i++) {
      drop[i] = Math.random() <= rate
    }
    return drop
  }
})//end DropSheet

//simulated annealing
var WaxyGenerator = (function(opts) {
  var initialTemp = opts.initialTemp || 1.0
  var fillPercent = opts.fillPercent || 0.35
  var conductivity = opts.conductivity || 0.04
  var freezing = opts.freezing || 0.1
  var floorTemp = opts.floorTemp || 0.0
  var bounds = opts.bounds || BoundingBox([{x:0,y:0,z:0}, {x:80,y:80,z:80}])
  //each property in propertyList has its own map data
  var propertyList = opts.propertyList || ['terrain', 'temperature']
  var materials = opts.materials || ['grass', 'dirt', 'grass_dirt', 'obsidian', 'whitewool', 'brick']
  //map of data
  var data = MapData(bounds, propertyList)
  //create a drop sheet
  var sheetMaker=DropSheet({width:bounds.width, depth:bounds.depth, rate:fillPercent})
  //some functions...
}
4

1 に答える 1

1

BoundingBoxを作成するときはnew、のようなキーワードを使用する必要がありますopts.bounds || new BoundingBox([{x:0,y:0,z:0}, {x:80,y:80,z:80}])。また、オブジェクトのプロパティをプライベートではなくパブリックにするには、次のようにオブジェクトを割り当てる必要がありますthis

this.width = function() {return this.upperBound.x - this.lowerBound.x}

最後に、を使用widthする場合、それは関数であるため、呼び出す必要があります。bounds.width()。次のように、変数にすることができます(変更されない場合)。

this.width = this.upperBound.x - this.lowerBound.x;

しかし、明らかに、upperBoundまたはlowerBoundが変更されても、変数は変更されません。

于 2013-03-24T17:17:49.257 に答える