2017-01-06 3 views
0

В Момент я работаю над маленькой игрой с картой. Все будет работать, но что-то неясно.Gamemap Border Calculation

, как вы можете видеть здесь, что я имею и хочу еще раз: https://picul.de/view/HsY

На данный момент мой код выглядит следующим образом:

function calcTile ($x, $y, $tilemin, $tilemax,$atilemin, $atilemax){ 

//ActualTile 
$m = calcNoise($x, $y); 

//Above Tiles 
$tl = calcNoise($x-1, $y-1); 
$t = calcNoise($x, $y-1); 
$tr = calcNoise($x+1, $y-1); 

//Right Tile 
$r = calcNoise($x+1, $y); 

//Below Tiles 
$br = calcNoise($x+1, $y+1); 
$b = calcNoise($x, $y+1); 
$bl = calcNoise($x-1, $y+1); 

//Left Tiles 
$l = calcNoise($x-1, $y); 

    if(
     $t >= $tilemin && $t <= $tilemax && 
     $r >= $tilemin && $r <= $tilemax && 
     $b >= $tilemin && $b <= $tilemax && 
     $l >= $tilemin && $l <= $tilemax 
    ){ 

     $field = 50; 

    } else 

//Vertical 
    if(
     $t >= $atilemin && $t <= $atilemax && 
     $r >= $tilemin && $r <= $tilemax && 
     $b >= $atilemin && $b <= $atilemax && 
     $l >= $tilemin && $l <= $tilemax 
    ){ 

     $field = 45; 

    } else 

//Horizontal 
    if(
     $t >= $tilemin && $t <= $tilemax && 
     $r >= $atilemin && $r <= $atilemax && 
     $b >= $tilemin && $b <= $tilemax && 
     $l >= $atilemin && $l <= $atilemax 
    ){ 

     $field = 46; 

    } else { 
     ... 
    } 
} 

Так моя новая идея, чтобы показать с шаблонами, как этот :

$array = array(
     2 => array(
       '0', '1', '1', 
       '0', '1', '1', 
       '0', '0', '0' 

     ), 

     3 => array('1', '1', '0', 
        '1', '1', '0', 
        '0', '0', '0' 
     ), 

     4 => array('0', '0', '0', 
        '1', '1', '0', 
        '1', '1', '0' 
     )  
    ); 

$key = array_search(array('0', '1', '1', 
        '0', '1', '1', 
        '0', '0', '0'), $array); // $key = 2; 
echo $key."<br><br>"; 

Это будет работа.

Но моя проблема в том, что это будет возможно, что есть 2 или более Узоры для одной и той же плитки ..

Моя идея состояла в том, чтобы массив массив также

array(
     2 => array(array(
       '0', '1', '1', 
       '0', '1', '1', 
       '0', '0', '0' 
      ), array(
       '0', '1', '1', 
       '0', '1', '1', 
       '0', '0', '1' 
      ) 
     ) 

Но проблема сейчас что я не могу найти что-то, заставляющее array_search хотеть номер массива:

$ key = array_search (array ('0', '1', '1', '0', '1', '1' , '0', '0', '0'), $ array [2]);

но как я могу решить эту проблему? Как я могу сообщить им этот номер?

Это те цифры на данный момент: https://picul.de/view/Hs-

1-50 другой являются тест-х

Или другой вопрос: Есть ли лучший способ «Рассчитать» Граница/Corner и т.д.?

Привет Daniel

ответ

0

Поиск массив так:

$tiles = [ 
    1 => [ 
     '0', '1', '1', 
     '0', '1', '1', 
     '0', '0', '0' 
    ], 
    2 => [ 
     '1', '1', '0', 
     '1', '1', '0', 
     '0', '0', '0' 
    ], 
    42 => [ 
     '0', '0', '0', 
     '1', '1', '0', 
     '1', '1', '0' 
    ] 
]; 

$search_tile = [ 
    '0', '1', '1', 
    '0', '1', '1', 
    '0', '0', '0' 
]; 

$found_key = false; 

foreach ($tiles as $key => $value) { 
    // compare both arrays in some way 
    if (implode('', $tile) == implode('', $search_tile)) { 
     $found_key = $key; 
    } 
} 

... но петля не нужно в этом случае, если определить структуру данных для игры карты. таким образом вы также можете определить различные плитки, которые имеют один и тот же шаблон, не запутывая их в любой момент.

// these are the available tiles 

$tiles = [ 
    1 => [ 
     '0', '1', '1', 
     '0', '1', '1', 
     '0', '0', '0' 
    ], 
    2 => [ 
     '1', '1', '0', 
     '1', '1', '0', 
     '0', '0', '0' 
    ], 
    12 => [ 
     '0', '0', '0', 
     '1', '1', '0', 
     '1', '1', '0' 
    ] 
]; 



// this is a game map of 3x2 fields, with a tile mapped to each field. 

$map = [ 
    [ /* field A0 */ 
     'tile' => 1, 
     'other_property' => 'x' 
    ], 
    [ /* field A1 */ 
     'tile' => 12, 
     'other_property' => 'y' 
    ], 
    [ /* field A2 */ 
     'tile' => 2, 
     'other_property' => 'z' 
    ], 
    [ /* field B0 */ 
     'tile' => 1, 
     'other_property' => 'x' 
    ], 
    [ /* field B1 */ 
     'tile' => 1, 
     'other_property' => 'a' 
    ], 
    [ /* field B2 */ 
     'tile' => 12, 
     'other_property' => 'b' 
    ], 
]; 



// this function returns tile number belonging to the field at X/Y 

function get_tile($x, $y, $map, $map_width) { 
    $index = $y * $map_width + $x; 
    return $map[$index]['tile']; 
} 


// get the bottom right field's tile number 

$tile_index = get_tile(2, 1, $map, 3); 


// get the tile array from $tiles 

$current_tile = $tiles[ $tile_index ];