Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

Nie wiem jak się za to ugryźć. Mam grid mapę 255x255 i dajmy, że w środku niej jest kółko. I chciałbym przenieść to kółko z środka do rogu 0x0 i znaleźć drugi róg tego kółka np 128x122. Mam nadzieję, że chociaż napisane ułomnie to zrozumiale.

  • Administratorzy
Opublikowano
18 godzin temu, Uzjel napisał:

Róg kółka?

chciałby przenieść cały kwadrat w którym jest koło, wiec zakładam, że to róg kwadratu :)

Opublikowano

ja bym jednak poprosil o narysowanie tego, bo totalnie nie wiem o co chodzi : D

Opublikowano

Użyłem złego przykładu, to wcale nie jest koło, tylko tak dla zobrazowania użyłem, równie dobrze to może być np literka A. I szerokość nie jest równa wysokości.

Opublikowano

OK. No to dość proste. Czym są u ciebie puste dane? Możemy znać że to "0"?

W takim razie pozycję x znajdujesz poprzez:

_x=ds_grid_width(index);
for(_x=ds_grid_width(index); _x>0; _x--) {
	if(ds_grid_get_min(index, _x, 0, _x, ds_grid_height(index))>0) {
		exit
	}
}

Y podobnie. Jeżeli operujesz na stringach to musisz zamiast ds_grid_get_min() zrobić znów for i przelecieć przez wszystko w y

  • Administratorzy
Opublikowano

No ale jak znasz wysokość i szerokość, to nadal jak wyżej.

A jak nie znasz, to ciężka sprawa... chyba, ze to jedyny kształt w tym gridzie ? Wtedy będzie tak:

 

var _w = ds_grid_width(index);
var _h = ds_grid_height(index);


var xstart = _w, xend = 0, ystart = _h, yend = 0;

for(var i = 0; i < _w; i++) {
    for(var j = 0; j < _h; j++) {
      if index[# i, j] == 1 {
        xstart = min(xstart, i);
        xend = max(xend, i);
        ystart = min(ystart, j);
        yend = max(yend, j);
      }
    }
}


// ok, mamy juz prostokat w ktorym jest figura, teraz przesuwamy
 
var offsetx = -1, offsety = -20;

for(var i = xstart; i < xend; i++;) {
    for(var j = ystart; j < _yend; j++) {
      if index[# i, j] == 1 {
        index[# ((i + _w + xoffset) % _w), ((j + _h + yoffset) % _h)] = 1;
        index[# i, j] = 0;

        /* robimy operację modulo, żeby przenosiło na drugi koniec grida w przypadku, gdy np. litera zaczyna się na osi X w pozycji 2, a ustawisz offset na -5.
        ponieważ jednak modulo z liczb ujemnych nie jest tylko dopisaniem znaku - przed wartością, dodajemy pełną wysokość
        np. 3 % 10 = 3, ale -3 % 10 = 7, wystarczy jednak dodawać zawsze 10 do liczby i po sprawie (-3 + 10) % 10 = 3. */
      }
    }
}

tu jest jeszcze taki jeden problem, że jak szerokość litery jest taka, ze po odjęciu offsetu nachodzi na siebie z drugiej strony, no to skasuje się część litery niestety - trzeba by wtedy do nowego grida po prostu przenosić i stary kasować.

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...