Простой тайловый движок

  1. package com.mycompany.myapp;
  2.  
  3. import android.graphics.Bitmap;
  4. import android.graphics.Canvas;
  5. import android.content.Context;
  6. import java.io.DataInputStream;
  7.  
  8. public class Map {
  9.  
  10.     private final int tileWidth = 32;
  11.     private final int tileHeight = 32;
  12.  
  13.     private Bitmap[] tiles;
  14.  
  15.     private byte[] m;
  16.  
  17.     private int ww, wh, layers;
  18.     private int x;
  19.     private int y;
  20.     private int level_w, level_h;
  21.  
  22.     // вырезаем из основного изображения тайлы
  23.     public Map(Bitmap bitmap) {
  24.  
  25.         int w = bitmap.getWidth() / tileWidth;
  26.         int h = bitmap.getHeight() / tileHeight;
  27.  
  28.         tiles = new Bitmap[w * h];
  29.  
  30.         int index = 0;
  31.  
  32.         for (int j = 0; j < h; j++) {
  33.             for (int i = 0; i < w; i++) {
  34.  
  35.                 tiles[index++] = Bitmap.createBitmap(bitmap, i * tileWidth, j * tileHeight, tileWidth, tileHeight);
  36.             }
  37.         }
  38.  
  39.         bitmap = null;
  40.         System.gc();
  41.     }
  42.  
  43.     // загружаем уровень из файла
  44.     public void create(Context context) {
  45.  
  46.         String path = "maps/Map0";
  47.  
  48.         try {
  49.             DataInputStream dis = new DataInputStream(context.getAssets().open(path));
  50.  
  51.             if (dis != null) {
  52.  
  53.                 ww = dis.readInt();
  54.                 wh = dis.readInt();
  55.                 layers = dis.readInt();
  56.  
  57.                 int size = ww * wh * layers;
  58.  
  59.                 m = new byte[size];
  60.  
  61.                 for (int i = 0; i < size; i++)
  62.                     m[i] = dis.readByte();
  63.             }
  64.  
  65.             dis.close();
  66.         } catch (Throwable t) {}
  67.  
  68.         level_w = ww * tileWidth;
  69.         level_h = wh * tileHeight;
  70.     }
  71.  
  72.     public void draw(Canvas canvas, int screenWidth, int screenHeight) {
  73.  
  74.         int cell = 0, tile = 0;
  75.  
  76.         // обрезает невидимую область экрана
  77.         int diff = -x / tileWidth;
  78.         int x0 = (diff > 0) ? diff : 0;
  79.         diff = (level_w + x - screenWidth) / tileWidth;
  80.         int x9 = (diff > 0) ? ww - diff : ww;
  81.  
  82.         diff = -y / tileHeight;
  83.         int y0 = (diff > 0) ? diff : 0;
  84.         diff = (level_h + y - screenHeight) / tileHeight;
  85.         int y9 = (diff > 0) ? wh - diff : wh;
  86.  
  87.         // рисуем тайлы
  88.         for (int e = 0; e < layers; e++)
  89.             for (int j = y0; j < y9; j++)
  90.                 for (int i = x0; i < x9; i++) {
  91.                     cell = j * ww + i + e * ww * wh;
  92.  
  93.                     tile = m[cell];
  94.  
  95.                     if (tile >= 0)
  96.                         canvas.drawBitmap(tiles[tile], x + i * tileWidth, y + j * tileHeight, null);
  97.                 }
  98.  
  99.     }
  100.  
  101.     // центровка и скроллинг
  102.     public void move(int screenWidth, int screenHeight, int hero_x, int hero_y, int hero_w, int hero_h) {
  103.  
  104.         int x0 = (screenWidth > level_w) ? screenWidth / 2 - level_w / 2 : 0;
  105.         int x9 = (screenWidth > level_w) ? x0 : screenWidth - level_w;
  106.  
  107.         int y0 = (screenHeight > level_h) ? screenHeight / 2 - level_h / 2 : 0;
  108.         int y9 = (screenHeight > level_h) ? y0 : screenHeight - level_h;
  109.  
  110.         x = -(hero_x + hero_w / 2 - screenWidth / 2);
  111.         y = -(hero_y + hero_h / 2 - screenHeight / 2);
  112.  
  113.         x = (x > 0) ? x0 : (x < x9) ? x9 : x;
  114.         y = (y > 0) ? y0 : (y < y9) ? y9 : y;
  115.  
  116.     }
  117. }
Это простой пример тайлого движка, где показано, как отрисовываются только видимые тайлы без перебора всех тайлов и других извращений.
Плюс бонус - скроллинг :gg:

Реклама

Мы в соцсетях

tw tg yt gt