Android Open Source - tetris-android Spatial Hash Grid






From Project

Back to project page tetris-android.

License

The source code is released under:

MIT License

If you think the Android project tetris-android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.badlogic.androidgames.framework.gl;
//  w  w w. j  av  a2s  . co m
import java.util.ArrayList;
import java.util.List;

import com.badlogic.androidgames.framework.GameObject;

import android.util.FloatMath;

public class SpatialHashGrid {
    List<GameObject>[] dynamicCells;
    List<GameObject>[] staticCells;
    int cellsPerRow;
    int cellsPerCol;
    float cellSize;
    int[] cellIds = new int[4];
    List<GameObject> foundObjects;
    
    @SuppressWarnings("unchecked")
    public SpatialHashGrid(float worldWidth, float worldHeight, float cellSize) {
        this.cellSize = cellSize;
        this.cellsPerRow = (int)FloatMath.ceil(worldWidth/cellSize);
        this.cellsPerCol = (int)FloatMath.ceil(worldHeight/cellSize);
        int numCells = cellsPerRow * cellsPerCol;
        dynamicCells = new List[numCells];
        staticCells = new List[numCells];
        for(int i = 0; i < numCells; i++) {
            dynamicCells[i] = new ArrayList<GameObject>(10);
            staticCells[i] = new ArrayList<GameObject>(10);
        }
        foundObjects = new ArrayList<GameObject>(10);
    }
    
    public void insertStaticObject(GameObject obj) {
        int[] cellIds = getCellIds(obj);
        int i = 0;
        int cellId = -1;
        while(i <= 3 && (cellId = cellIds[i++]) != -1) {
            staticCells[cellId].add(obj);
        }
    }
    
    public void insertDynamicObject(GameObject obj) {
        int[] cellIds = getCellIds(obj);
        int i = 0;
        int cellId = -1;
        while(i <= 3 && (cellId = cellIds[i++]) != -1) {
            dynamicCells[cellId].add(obj);
        }
    }
    
    public void removeObject(GameObject obj) {
        int[] cellIds = getCellIds(obj);
        int i = 0;
        int cellId = -1;
        while(i <= 3 && (cellId = cellIds[i++]) != -1) {
            dynamicCells[cellId].remove(obj);
            staticCells[cellId].remove(obj);
        }
    }
    
    public void clearDynamicCells(GameObject obj) {
        int len = dynamicCells.length;
        for(int i = 0; i < len; i++) {
            dynamicCells[i].clear();
        }
    }
    
    public List<GameObject> getPotentialColliders(GameObject obj) {
        foundObjects.clear();
        int[] cellIds = getCellIds(obj);
        int i = 0;
        int cellId = -1;
        while(i <= 3 && (cellId = cellIds[i++]) != -1) {
            int len = dynamicCells[cellId].size();
            for(int j = 0; j < len; j++) {
                GameObject collider = dynamicCells[cellId].get(j);
                if(!foundObjects.contains(collider))
                    foundObjects.add(collider);
            }
            
            len = staticCells[cellId].size();
            for(int j = 0; j < len; j++) {
                GameObject collider = staticCells[cellId].get(j);
                if(!foundObjects.contains(collider))
                    foundObjects.add(collider);
            }
        }
        return foundObjects;
    }
    
    public int[] getCellIds(GameObject obj) {
        int x1 = (int)FloatMath.floor(obj.bounds.lowerLeft.x / cellSize);
        int y1 = (int)FloatMath.floor(obj.bounds.lowerLeft.y / cellSize);
        int x2 = (int)FloatMath.floor((obj.bounds.lowerLeft.x + obj.bounds.width) / cellSize);
        int y2 = (int)FloatMath.floor((obj.bounds.lowerLeft.y + obj.bounds.height) / cellSize);
        
        if(x1 == x2 && y1 == y2) {
            if(x1 >= 0 && x1 < cellsPerRow && y1 >= 0 && y1 < cellsPerCol)
                cellIds[0] = x1 + y1 * cellsPerRow;
            else
                cellIds[0] = -1;
            cellIds[1] = -1;
            cellIds[2] = -1;
            cellIds[3] = -1;
        }
        else if(x1 == x2) {
            int i = 0;
            if(x1 >= 0 && x1 < cellsPerRow) {
                if(y1 >= 0 && y1 < cellsPerCol)
                    cellIds[i++] = x1 + y1 * cellsPerRow;
                if(y2 >= 0 && y2 < cellsPerCol)
                    cellIds[i++] = x1 + y2 * cellsPerRow;
            }
            while(i <= 3) cellIds[i++] = -1;
        }
        else if(y1 == y2) {
            int i = 0;
            if(y1 >= 0 && y1 < cellsPerCol) {
                if(x1 >= 0 && x1 < cellsPerRow)
                    cellIds[i++] = x1 + y1 * cellsPerRow;
                if(x2 >= 0 && x2 < cellsPerRow)
                    cellIds[i++] = x2 + y1 * cellsPerRow;
            }
            while(i <= 3) cellIds[i++] = -1;                       
        }
        else {
            int i = 0;
            int y1CellsPerRow = y1 * cellsPerRow;
            int y2CellsPerRow = y2 * cellsPerRow;
            if(x1 >= 0 && x1 < cellsPerRow && y1 >= 0 && y1 < cellsPerCol)
                cellIds[i++] = x1 + y1CellsPerRow;
            if(x2 >= 0 && x2 < cellsPerRow && y1 >= 0 && y1 < cellsPerCol)
                cellIds[i++] = x2 + y1CellsPerRow;
            if(x2 >= 0 && x2 < cellsPerRow && y2 >= 0 && y2 < cellsPerCol)
                cellIds[i++] = x2 + y2CellsPerRow;
            if(x1 >= 0 && x1 < cellsPerRow && y2 >= 0 && y2 < cellsPerCol)
                cellIds[i++] = x1 + y2CellsPerRow;
            while(i <= 3) cellIds[i++] = -1;
        }
        return cellIds;
    }
}




Java Source Code List

com.badlogic.androidgames.framework.Audio.java
com.badlogic.androidgames.framework.Color.java
com.badlogic.androidgames.framework.DynamicGameObject.java
com.badlogic.androidgames.framework.FileIOInternal.java
com.badlogic.androidgames.framework.FileIO.java
com.badlogic.androidgames.framework.GameObject.java
com.badlogic.androidgames.framework.Game.java
com.badlogic.androidgames.framework.Graphics.java
com.badlogic.androidgames.framework.Input.java
com.badlogic.androidgames.framework.Music.java
com.badlogic.androidgames.framework.Pixmap.java
com.badlogic.androidgames.framework.Pool.java
com.badlogic.androidgames.framework.Screen.java
com.badlogic.androidgames.framework.Sound.java
com.badlogic.androidgames.framework.TestScreen.java
com.badlogic.androidgames.framework.gl.Animation.java
com.badlogic.androidgames.framework.gl.BTMPFont.java
com.badlogic.androidgames.framework.gl.Camera2D.java
com.badlogic.androidgames.framework.gl.Font.java
com.badlogic.androidgames.framework.gl.SpatialHashGrid.java
com.badlogic.androidgames.framework.gl.SpriteBatcher.java
com.badlogic.androidgames.framework.gl.TextureRegion.java
com.badlogic.androidgames.framework.gl.Texture.java
com.badlogic.androidgames.framework.gl.Vertices.java
com.badlogic.androidgames.framework.helper.DebugDraw.java
com.badlogic.androidgames.framework.helper.FPSCounter.java
com.badlogic.androidgames.framework.helper.Logger.java
com.badlogic.androidgames.framework.impl.AccelerometerHandler.java
com.badlogic.androidgames.framework.impl.AndroidAudio.java
com.badlogic.androidgames.framework.impl.AndroidFastRenderView.java
com.badlogic.androidgames.framework.impl.AndroidFileIOInternal.java
com.badlogic.androidgames.framework.impl.AndroidFileIO.java
com.badlogic.androidgames.framework.impl.AndroidGame.java
com.badlogic.androidgames.framework.impl.AndroidGraphics.java
com.badlogic.androidgames.framework.impl.AndroidInput.java
com.badlogic.androidgames.framework.impl.AndroidMusic.java
com.badlogic.androidgames.framework.impl.AndroidPixmap.java
com.badlogic.androidgames.framework.impl.AndroidSound.java
com.badlogic.androidgames.framework.impl.GLGame.java
com.badlogic.androidgames.framework.impl.GLGraphics.java
com.badlogic.androidgames.framework.impl.GLScreen.java
com.badlogic.androidgames.framework.impl.KeyboardHandler.java
com.badlogic.androidgames.framework.impl.MultiTouchHandler.java
com.badlogic.androidgames.framework.impl.SingleTouchHandler.java
com.badlogic.androidgames.framework.impl.TouchHandler.java
com.badlogic.androidgames.framework.math.Circle.java
com.badlogic.androidgames.framework.math.OverlapTester.java
com.badlogic.androidgames.framework.math.Rectangle.java
com.badlogic.androidgames.framework.math.Vector2.java
com.ultimate39.android.games.tetris.Assets.java
com.ultimate39.android.games.tetris.FactoryShape.java
com.ultimate39.android.games.tetris.GameScreen.java
com.ultimate39.android.games.tetris.MainMenuScreen.java
com.ultimate39.android.games.tetris.Settings.java
com.ultimate39.android.games.tetris.Shape.java
com.ultimate39.android.games.tetris.Square.java
com.ultimate39.android.games.tetris.Tetris.java
com.ultimate39.android.games.tetris.World.java