Graal Forums

Graal Forums (https://forums.graalonline.com/forums/index.php)
-   New Scripting Engine (GS2) (https://forums.graalonline.com/forums/forumdisplay.php?f=153)
-   -   Flood fill issue (https://forums.graalonline.com/forums/showthread.php?t=134262845)

MrOmega 04-16-2011 06:37 AM

Flood fill issue
 
well I attempted two methods to create a tile flood fill, first method is working fine, but is slow, second seems to be fast but stops after 3 'lines', the queue is updated in it but is temp.queue for the for-each loop updated?

PHP Code:

function floodFilltemp.tiletemp.targetTiletemp.replaceTile)
{

  
/*//Method 1 - SUCCESS -
  temp.queue = { temp.tile};

  while (( @ temp.queue) != ( @ {{ NULL, NULL}}))
  {
  
    temp.n = temp.queue[ 0];
    
    if ( player.level.tilelayers[ Tile_Editor_Layer.text].tiles[ temp.n[ 0], temp.n[ 1]] == temp.targetTile)
      triggerServer( "weapon", name, "PlaceTiles", Tile_Editor_Layer.text, { temp.replaceTile}, { temp.n[ 0], temp.n[ 1], 1, 1}); 

    temp.queue.delete( 0);
    
    for ( temp.a = 0; temp.a < 4; temp.a ++;)
    {
    
      if ( player.level.tilelayers[ Tile_Editor_Layer.text].tiles[ temp.n[ 0] + ( !temp.a? -1: temp.a == 1? 1: 0), temp.n[ 1] + ( temp.a == 2? -1: temp.a == 3? 1: 0)] == temp.targetTile)
      {
    
        triggerServer( "weapon", name, "PlaceTiles", Tile_Editor_Layer.text, { temp.replaceTile}, { temp.n[ 0] + ( temp.a == 0? -1: temp.a == 1? 1: 0), temp.n[ 1] + ( temp.a == 2? -1: temp.a == 3? 1: 0), 1, 1}); 
        temp.queue.add({ temp.n[ 0] + ( !temp.a? -1: temp.a == 1? 1: 0), temp.n[ 1] + ( temp.a == 2? -1: temp.a == 3? 1: 0)});

      }
    }
    
    sleep( 0.05); //Added to prevent freeze
    
  }
  */
  
  // Method 2 - BROKEN
  
  
temp.queue = { temp.tile};
  
  for ( 
temp.ntemp.queue)
  {
  
    if ( 
player.level.tilelayersTile_Editor_Layer.text].tilestemp.n0], temp.n1]] == temp.targetTile)
      
temp.temp.temp.n0];
      
    while ( 
player.level.tilelayersTile_Editor_Layer.text].tilestemp.1temp.n1]] == temp.targetTile)
      
temp.--;
        
    while ( 
player.level.tilelayersTile_Editor_Layer.text].tilestemp.etemp.n1]] == temp.targetTile)
      
temp.++;
   
    for ( 
temp.temp.wtemp.temp.etemp.++;)
    {

      if ( 
player.level.tilelayersTile_Editor_Layer.text].tilestemp.atemp.n1]] == temp.targetTile)   
        
triggerServer"weapon"name"PlaceTiles"Tile_Editor_Layer.text, { temp.replaceTile}, { temp.atemp.n1], 11}); 
        
      if ( 
player.level.tilelayersTile_Editor_Layer.text].tilestemp.atemp.n1] - 1] == temp.targetTile)  
        
temp.queue.add({ temp.atemp.n1] - 1});
        
      if ( 
player.level.tilelayersTile_Editor_Layer.text].tilestemp.atemp.n1] + 1] == temp.targetTile)  
        
temp.queue.add({ temp.atemp.n1] + 1});
        
    }
    
    
sleep0.05); //Added to prevent client from freezing
    
  
}
  
  return;  




fowlplay4 04-16-2011 06:50 AM

It's slow because you're sending a trigger for every tile.

It'd be faster if you just built the list of tiles that need to be changed, looped through the list altering each tile as required as well as find the top-left and bottom-right most tiles in the process, and updated the resulting rectangle.

Edit: This was fun.

PHP Code:

//#CLIENTSIDE

function onMouseDown() {
  
floodFill(int(mousex), int(mousey));
}

// Flooding Fill (Works better)
function floodFill(txty) {

  
temp.queue.add({txty});
  
temp.tile player.level.tiles[txty];
  
maxlooplimit 100000;
  
  while (
temp.queue.size() > 0) {
  
    
tx temp.queue[0][0];
    
ty temp.queue[0][1];
    
temp.queue.delete(0);
    
    for (
temp.0temp.4temp.i++) {
      
temp.nx tx vecx(temp.i);
      
temp.ny ty vecy(temp.i);
      if (
checkTile(nxnytemp.tile)) {
        if (!((@{
nxny}) in temp.queue)) {
          
temp.queue.add({nxny});
        }
      }
    }
    
    
floodTile(txty);
  }
}

// West-to-East then North-to-South method.
function floodFill2(txty) {

  
temp.queue.add({txty});
  
temp.tile player.level.tiles[txty];
  
maxlooplimit 100000;
  
  while (
temp.queue.size() > 0) {
  
    
tx temp.queue[0][0];
    
ty temp.queue[0][1];
    
temp.queue.delete(0);
    
    
temp.west tx 1;
    while (
checkTile(westtytemp.tile)) {  
      
temp.west--;
    }
    
    
temp.east tx 1;
    while (
checkTile(easttytemp.tile)) {
      
temp.east++;
    }
    
    for (
temp.tx temp.west 1temp.tx temp.easttemp.tx++) {
      if (
checkTile(txtytemp.tile)) {
        
floodTile(txty);
      }
      if (
checkTile(txty 1temp.tile)) {
        
temp.queue.add({txty 1});
      }
      if (
checkTile(txty 1temp.tile)) {
        
temp.queue.add({txty 1});
      }
    }
  }
}

function 
checkTile(txtytile) {
  if (
tx in |0,64| && ty in |0,64|) {
    if (
player.level.tiles[txty] == tile) return true;
  }
  return 
false;
}

function 
floodTile(txtynosleep) {
  
player.level.tiles[txty] = 322;
  
updateboard(txty11);
  if (!
nosleepsleep(0.05);




All times are GMT +2. The time now is 05:50 AM.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.
Copyright (C) 1998-2019 Toonslab All Rights Reserved.