Простой тайловый движок
- package com.mycompany.myapp;
- import android.graphics.Bitmap;
- import android.graphics.Canvas;
- import android.content.Context;
- import java.io.DataInputStream;
- public class Map {
- private final int tileWidth = 32;
- private final int tileHeight = 32;
- private Bitmap[] tiles;
- private byte[] m;
- private int ww, wh, layers;
- private int x;
- private int y;
- private int level_w, level_h;
- // вырезаем из основного изображения тайлы
- public Map(Bitmap bitmap) {
- int w = bitmap.getWidth() / tileWidth;
- int h = bitmap.getHeight() / tileHeight;
- tiles = new Bitmap[w * h];
- int index = 0;
- for (int j = 0; j < h; j++) {
- for (int i = 0; i < w; i++) {
- tiles[index++] = Bitmap.createBitmap(bitmap, i * tileWidth, j * tileHeight, tileWidth, tileHeight);
- }
- }
- bitmap = null;
- System.gc();
- }
- // загружаем уровень из файла
- public void create(Context context) {
- String path = "maps/Map0";
- try {
- DataInputStream dis = new DataInputStream(context.getAssets().open(path));
- if (dis != null) {
- ww = dis.readInt();
- wh = dis.readInt();
- layers = dis.readInt();
- int size = ww * wh * layers;
- m = new byte[size];
- for (int i = 0; i < size; i++)
- m[i] = dis.readByte();
- }
- dis.close();
- } catch (Throwable t) {}
- level_w = ww * tileWidth;
- level_h = wh * tileHeight;
- }
- public void draw(Canvas canvas, int screenWidth, int screenHeight) {
- int cell = 0, tile = 0;
- // обрезает невидимую область экрана
- int diff = -x / tileWidth;
- int x0 = (diff > 0) ? diff : 0;
- diff = (level_w + x - screenWidth) / tileWidth;
- int x9 = (diff > 0) ? ww - diff : ww;
- diff = -y / tileHeight;
- int y0 = (diff > 0) ? diff : 0;
- diff = (level_h + y - screenHeight) / tileHeight;
- int y9 = (diff > 0) ? wh - diff : wh;
- // рисуем тайлы
- for (int e = 0; e < layers; e++)
- for (int j = y0; j < y9; j++)
- for (int i = x0; i < x9; i++) {
- cell = j * ww + i + e * ww * wh;
- tile = m[cell];
- if (tile >= 0)
- canvas.drawBitmap(tiles[tile], x + i * tileWidth, y + j * tileHeight, null);
- }
- }
- // центровка и скроллинг
- public void move(int screenWidth, int screenHeight, int hero_x, int hero_y, int hero_w, int hero_h) {
- int x0 = (screenWidth > level_w) ? screenWidth / 2 - level_w / 2 : 0;
- int x9 = (screenWidth > level_w) ? x0 : screenWidth - level_w;
- int y0 = (screenHeight > level_h) ? screenHeight / 2 - level_h / 2 : 0;
- int y9 = (screenHeight > level_h) ? y0 : screenHeight - level_h;
- x = -(hero_x + hero_w / 2 - screenWidth / 2);
- y = -(hero_y + hero_h / 2 - screenHeight / 2);
- x = (x > 0) ? x0 : (x < x9) ? x9 : x;
- y = (y > 0) ? y0 : (y < y9) ? y9 : y;
- }
- }
Это простой пример тайлого движка, где показано, как отрисовываются только видимые тайлы без перебора всех тайлов и других извращений.
Плюс бонус - скроллинг
Плюс бонус - скроллинг