Game Maker の GML でフラッド フィル スクリプトを実装しようとしていますが、行き詰まりました。床ブロックを埋めるための簡単な解決策と思われるものを修正するために3時間試みた後、この問題について助けを求めています. タイルが既にタイル リストに追加されているかどうか、およびそれが壁と衝突するかどうかをテストしています (したがって、10 行の collision_rectangle 関数。これらは、床タイルが壁と重なるかどうかをテストしているだけです)。 )。申し訳ありませんが、これらは多くの不要なスペースを占有し、コードをごちゃごちゃさせています。GML でそれを行う別の方法が見つかりませんでした。ここにいる誰かが GML のデータ構造に精通しており、私が間違っていることを知っている場合は、率直に言ってください! あなたは私のプロジェクトを保存します!
コード:
// 2 arrays: one with x values of each tile, one with y values of each
tile_locations_x = ds_list_create();
tile_locations_y = ds_list_create();
tile_stack_x = ds_stack_create();
tile_stack_y = ds_stack_create();
ds_stack_push(tile_stack_x, obj_player.x);
ds_stack_push(tile_stack_y, obj_player.y);
// iterator for "for" loops
var i;
while (!ds_stack_empty(tile_stack_x)) {
test_location_x = ds_stack_pop(tile_stack_x);
test_location_y = ds_stack_pop(tile_stack_y);
ds_list_add(tile_locations_x, test_location_x);
ds_list_add(tile_locations_y, test_location_y);
tile_add(bg_floortiles, 0, 0, 16, 16, test_location_x, test_location_y, 99999);
// Add the 4 cardinal directions to the stack after checking if they're already in the list
// left of point
testpoint_x = test_location_x - 16;
testpoint_y = test_location_y;
// Check point testpoint_x, testpoint_y is valid
valid = true;
// Check added location list first, then check stack because the same location stackd multiple times doesn't work
for (i = 0; i < ds_list_size(tile_locations_x); i += 1) {
if (ds_list_find_value(tile_locations_x, i) == testpoint_x && ds_list_find_value(tile_locations_y, i) == testpoint_y) {
valid = false;
break;
}
}
if (valid) {
precise_collision_check = true;
if ( collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_horizontal, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_vertical, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal4, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector4, precise_collision_check, true) == noone) {
ds_stack_push(tile_stack_x, testpoint_x);
ds_stack_push(tile_stack_y, testpoint_y);
}
}
// right of point
testpoint_x = test_location_x + 16;
testpoint_y = test_location_y;
// Check point testpoint_x, testpoint_y is valid
valid = true;
// Check added location list first, then check stack because the same location stackd multiple times doesn't work
for (i = 0; i < ds_list_size(tile_locations_x); i += 1) {
if (ds_list_find_value(tile_locations_x, i) == testpoint_x && ds_list_find_value(tile_locations_y, i) == testpoint_y) {
valid = false;
break;
}
}
if (valid) {
precise_collision_check = true;
if ( collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_horizontal, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_vertical, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal4, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector4, precise_collision_check, true) == noone) {
ds_stack_push(tile_stack_x, testpoint_x);
ds_stack_push(tile_stack_y, testpoint_y);
}
}
// above point
testpoint_x = test_location_x;
testpoint_y = test_location_y - 16;
// Check point testpoint_x, testpoint_y is valid
valid = true;
// Check added location list first, then check stack because the same location stackd multiple times doesn't work
for (i = 0; i < ds_list_size(tile_locations_x); i += 1) {
if (ds_list_find_value(tile_locations_x, i) == testpoint_x && ds_list_find_value(tile_locations_y, i) == testpoint_y) {
valid = false;
break;
}
}
if (valid) {
precise_collision_check = true;
if ( collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_horizontal, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_vertical, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal4, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector4, precise_collision_check, true) == noone) {
ds_stack_push(tile_stack_x, testpoint_x);
ds_stack_push(tile_stack_y, testpoint_y);
}
}
// below point
testpoint_x = test_location_x;
testpoint_y = test_location_y + 16;
// Check point testpoint_x, testpoint_y is valid
valid = true;
// Check added location list first, then check stack because the same location stackd multiple times doesn't work
for (i = 0; i < ds_list_size(tile_locations_x); i += 1) {
if (ds_list_find_value(tile_locations_x, i) == testpoint_x && ds_list_find_value(tile_locations_y, i) == testpoint_y) {
valid = false;
break;
}
}
if (valid) {
precise_collision_check = true;
if ( collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_horizontal, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_vertical, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonal4, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector1, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector2, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector3, precise_collision_check, true) == noone &&
collision_rectangle(testpoint_x, testpoint_y, testpoint_x + 16, testpoint_y + 16, obj_diagonalconnector4, precise_collision_check, true) == noone) {
ds_stack_push(tile_stack_x, testpoint_x);
ds_stack_push(tile_stack_y, testpoint_y);
}
}
}
ds_list_destroy(tile_locations_x);
ds_list_destroy(tile_locations_y);
ds_stack_destroy(tile_stack_x);
ds_stack_destroy(tile_stack_y);
それはおそらく私が見落としているマイナーなものです。セカンドオピニオンが欲しいだけです。助けてくれてありがとう!
-ニール