Mapowanie płaskiego buforu na dwuwymiarową tablicę.

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:

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:

 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?

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

0

aRow * 16 + aCol

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1