2.5D Renderer

Stage 5: Текстурирование

Текстуры

В прошлом мы получили уровни, состоящие из однотонных стен, пола и потолков, однако в настоящих играх мы привыкли встречать разнообразные локации, например: лаборатории, пещеры, подземелье или что-то еще. А чтобы создать что-то подобное, необходимо реализовать текстурирование.

Все цвета будем описывать не в виде строк, а в виде набора трех цветов:


  interface Color {
    r: number
    g: number
    b: number
  }

Теперь зададим описание самой текстуры:


  type Texture = {
    width: number;
    height: number;
    bitmap: number[][];
    colors: Color[];
    scale: number;
  }

Затем определим текстуры для будущего оформления стен, пола и потолка:


  const textures: Record<string, Texture> = {
    ceil: {
      scale: 4,
      width: 4,
      height: 4,
      bitmap: [
        [1, 0, 1, 0],
        [0, 1, 0, 1],
        [1, 0, 1, 0],
        [0, 1, 0, 1],
      ],
      colors: [
        { r: 70, g: 70, b: 70 },
        { r: 50, g: 50, b: 50 },
      ],
    },
    floor: {
      scale: 2,
      width: 4,
      height: 4,
      bitmap: [
        [0, 0, 1, 1],
        [0, 0, 1, 1],
        [1, 1, 0, 0],
        [1, 1, 0, 0],
      ],
      colors: [
        { r: 120, g: 120, b: 120 },
        { r: 90, g: 90, b: 90 },
      ],
    },
    wall: {
      scale: 1,
      width: 8,
      height: 8,
      bitmap: [
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 0, 0, 0, 1, 1, 1, 1],
        [1, 1, 1, 1, 0, 0, 0, 0],
        [1, 1, 1, 1, 0, 0, 0, 0],
        [1, 1, 1, 1, 0, 0, 0, 0],
        [1, 1, 1, 1, 0, 0, 0, 0],
      ],
      colors: [
        { r: 120, g: 200, b: 120 },
        { r: 200, g: 100, b: 100 },
      ],
    },
  };

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