package com.lfk.justweengine.engine.Layer;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.Log;
import android.view.MotionEvent;
import com.lfk.justweengine.drawable.Bone.BoneGroupSprite;
import com.lfk.justweengine.drawable.Sprite.BaseSub;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 默认实现的绘制层
*
* @author liufengkai
* Created by liufengkai on 16/5/8.
*/
public class DefaultLayer extends Layer {
// 对象绘制组
private CopyOnWriteArrayList<BaseSub> l_sprite_group;
// 对象回收组
private CopyOnWriteArrayList<BaseSub> l_sprite_recycle_group;
public DefaultLayer(Screen screen, Rect layerField) {
super(LayerType.Default, screen, layerField);
init();
}
public DefaultLayer(LayerType type, Screen screen, int x, int y, int w, int h) {
super(type, screen, new Rect(x, y, w, h));
init();
}
/**
* 初始化
*/
private void init() {
l_sprite_group = new CopyOnWriteArrayList<>();
l_sprite_recycle_group = new CopyOnWriteArrayList<>();
}
@Override
protected void layerUpdate() {
for (BaseSub A : l_sprite_group) {
if (!A.getAlive()) continue;
if (!A.isCollidable()) continue;
if (A.isCollided()) continue;
for (BaseSub B : l_sprite_group) {
if (!B.getAlive()) continue;
if (!B.isCollidable()) continue;
if (B.isCollided()) continue;
if (A == B) continue;
if (A.getIdentifier() ==
B.getIdentifier())
continue;
if (collisionCheck(A, B)) {
A.setCollided(true);
A.setOffender(B);
B.setCollided(true);
B.setOffender(A);
break;
}
}
}
}
@Override
protected void layerDraw() {
for (BaseSub baseSub : l_sprite_group) {
if (baseSub.getAlive()) {
baseSub.animation();
baseSub.draw();
}
baseSub.debugDraw();
}
}
@Override
protected void layerCollision() {
// new collision
for (BaseSub baseSub : l_sprite_group) {
if (!baseSub.getAlive()) {
l_sprite_recycle_group.add(baseSub);
l_sprite_group.remove(baseSub);
continue;
}
if (baseSub.isCollidable()) {
if (baseSub.isCollided()) {
// Is it a valid object ?
if (baseSub.getOffender() != null) {
// collision
if (layerListener != null)
layerListener.Collision(baseSub);
// reset offender
baseSub.setOffender(null);
}
baseSub.setCollided(false);
}
}
baseSub.setCollided(false);
}
}
@Override
protected void layerClick(MotionEvent event) {
}
/**
* 检测碰撞
*
* @param A a 物体
* @param B b 物体
* @return 是否碰撞
*/
private boolean collisionCheck(BaseSub A, BaseSub B) {
return RectF.intersects(A.getBounds(), B.getBounds());
}
/**
* add BaseSub to group
*
* @param sprite
*/
public void addToSpriteGroup(BaseSub sprite) {
l_sprite_group.add(sprite);
}
/**
* add boneSprite
*
* @param sprite
*/
public void addToSpriteGroup(BoneGroupSprite sprite) {
for (String name : sprite.getSpriteMap().keySet()) {
addToSpriteGroup(sprite.getBoneSprite(name));
}
}
/**
* remove from group
*
* @param sprite
*/
public void removeFromSpriteGroup(BaseSub sprite) {
l_sprite_group.remove(sprite);
}
public void removeFromSpriteGroup(int index) {
l_sprite_group.remove(index);
}
/**
* get size
*
* @return size
*/
public int getSpriteGroupSize() {
return l_sprite_group.size();
}
public int getRecycleGroupSize() {
return l_sprite_recycle_group.size();
}
public void addToRecycleGroup(BaseSub baseSub) {
l_sprite_recycle_group.add(baseSub);
}
public void removeFromRecycleGroup(int index) {
l_sprite_recycle_group.remove(index);
}
public void removeFromRecycleGroup(BaseSub baseSub) {
l_sprite_recycle_group.remove(baseSub);
}
public boolean isRecycleGroupEmpty() {
return l_sprite_recycle_group.isEmpty();
}
public BaseSub recycleSubFromGroup(int id) {
for (BaseSub baseSub : l_sprite_recycle_group) {
if (baseSub.getIdentifier() == id) {
return baseSub;
}
}
return null;
}
public int getTypeSizeFromRecycleGroup(int id) {
int num = 0;
for (BaseSub baseSub : l_sprite_recycle_group) {
if (baseSub.getIdentifier() == id) {
num++;
}
}
Log.e("num" + num, "id" + id);
return num;
}
}