Mapowanie płaskiego buforu na dwuwymiarową tablicę.

Mapowanie płaskiego buforu na dwuwymiarową tablicę.
Darkhog
  • Rejestracja: dni
  • Ostatnio: dni
0

Otóż mam taki problem. Umyśliłem sobie napisać edytorek "czcionek" do zabawki zwanej MegaZeux (ten wbudowany jest fatalny, szczególnie jeśli chodzi o SMZX).

Wszystko niby w porządku, no ale jednak jest problem.

Otóż mam 1-wymiarowy bufor znaków zadeklarowany w ten sposób:

Kopiuj
type
  TCharArr = Array[0..3,0..13] of byte;
  TCharset = Array[0..255] of TCharArr; 

TCharArr jest "właściwym" znakiem. Zrobiłem tak, żeby mi było łatwiej rysowanie znaków napisać (zmapować tablicę 2d na inną tablicę 2d jest łatwiej). Samo rysowanie odbywa się na drawgridach.

Tu jest moja funkcja rysująca podgląd znaków w "charsecie" na draw gridzie:

Kopiuj
 procedure Tmain.charsetgridDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var x,y:byte;
  realx,realy:LongInt;
begin
  x:=0;
  y:=0;
  realx:=aRect.Left+10;
  realy:=aRect.Top+4;
  //clearing character cell
  charsetgrid.Canvas.Brush.Color:=clWhite;
  charsetgrid.Canvas.FillRect(aRect);
  for x:=0 to 3 do begin
    for y:=0 to 13 do begin
      charsetgrid.Canvas.Font.Color:=clBlue;
      charsetgrid.Canvas.Brush.Color:=Colores[Charset[aCol+aRow][x][y]];
      charsetgrid.Canvas.FillRect(realx+x,realy+y,realx+x+2,realy+y+2);
      charsetgrid.Canvas.TextOut(realx,realy,IntToStr(acol*arow));//Charset[aCol+aRow][x][y]
    end;
  end;
end;

Niestety po dodaniu rysowania tekstu na poszczególnych komórkach okazało się, że mapuje je conajmniej... dziwnie. Przy acol*arow:
user image
Przy acol+arow:
user image

Acol+arow bliżej prawdy do tego co ja bym chciał, ale ciągle nie to. Ja potrzebuję, żeby to szło
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
etc., aż do 255. Skończyły mi się pomysły jak to poprawnie zaimplementować. Pomożecie?

//edit: Dlaczego zawsze tak musi być że jak założę temat to rozwiązanie samo mi wpada do głowy?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Najłatwiej będzie chyba jak stworzysz sobie osobną zmienną, która będzie licznikiem i będziesz ją co iterację inkrementował.
Ew.spróbuj wzorem szerokość*pozycja x+pozycja y

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

aRow * 16 + aCol

Darkhog
  • Rejestracja: dni
  • Ostatnio: dni
0

Abrakadaber: wiem ;), zobacz edita. Ale może się przyda innym, dzięki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.