同じスペースを占有したり、HTML5キャンバス上でオーバーラップしたりせずに、マップ上にオブジェクトを生成するにはどうすればよいですか?
X座標は、ある程度ランダムに生成されます。配列内をチェックして、それがすでに存在するかどうかを確認し、その後の次の20個の値(幅を考慮して)を確認しようと思いましたが、運がありませんでした。
var nrOfPlatforms = 14,
platforms = [],
platformWidth = 20,
platformHeight = 20;
var generatePlatforms = function(){
var positiony = 0, type;
for (var i = 0; i < nrOfPlatforms; i++) {
type = ~~(Math.random()*5);
if (type == 0) type = 1;
else type = 0;
var positionx = (Math.random() * 4000) + 500 - (points/100);
var duplicatetest = 21;
for (var d = 0; d < duplicatetest; d++) {
var duplicate = $(jQuery.inArray((positionx + d), platforms));
if (duplicate > 0) {
var duplicateconfirmed = true;
}
}
if (duplicateconfirmed) {
var positionx = positionx + 20;
}
var duplicateconfirmed = false;
platforms[i] = new Platform(positionx,positiony,type);
}
}();
もともとは4000くらいの大きさのエリアでチートを発生させてオッズを下げて修正しましたが、ゲームが進むにつれて難易度を上げて、一緒に見せて難しくしたいと思っています。しかし、それらは重複しています。
粗い絵の形で、私はこれが欲しい
....[]....[].....[]..[]..[][]...
これではない
......[]...[[]]...[[]]....[]....
それが理にかなっていることを願っています。
参考までに、配列チェックと難易度の前のコードを次に示します。これは、安価な距離ハックです。
var nrOfPlatforms = 14,
platforms = [],
platformWidth = 20,
platformHeight = 20;
var generatePlatforms = function(){
var position = 0, type;
for (var i = 0; i < nrOfPlatforms; i++) {
type = ~~(Math.random()*5);
if (type == 0) type = 1;
else type = 0;
platforms[i] = new Platform((Math.random() * 4000) + 500,position,type);
}
}();
編集1
デバッグ後、duplicateがインデックス番号ではなく[object Object]として返されますが、理由はわかりませんが
編集2
問題は、オブジェクトが配列プラットフォームにあり、xが配列オブジェクトにあることです。では、どうすれば内部を再度検索できますか?、それが以前は失敗していた理由です。firebugとconsole.log(platforms)に感謝します。
platforms = [Object { image=img, x=1128, y=260, more...}, Object { image=img, x=1640, y=260, more...} etc