/* * The MIT License (MIT) * * FXGL - JavaFX Game Library * * Copyright (c) 2015-2017 AlmasB (almaslvl@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package com.almasb.fxglgames.towerfall.collision; import com.almasb.fxgl.algorithm.AASubdivision; import com.almasb.fxgl.annotation.AddCollisionHandler; import com.almasb.fxgl.app.FXGL; import com.almasb.fxgl.core.collection.Array; import com.almasb.fxgl.core.math.FXGLMath; import com.almasb.fxgl.ecs.Entity; import com.almasb.fxgl.entity.Entities; import com.almasb.fxgl.entity.GameEntity; import com.almasb.fxgl.entity.component.CollidableComponent; import com.almasb.fxgl.physics.CollisionHandler; import com.almasb.fxgl.physics.PhysicsComponent; import com.almasb.fxglgames.towerfall.ArrowControl; import com.almasb.fxglgames.towerfall.EntityType; import javafx.geometry.Rectangle2D; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import org.jbox2d.dynamics.BodyType; import org.jbox2d.dynamics.FixtureDef; /** * @author Almas Baimagambetov (almaslvl@gmail.com) */ @AddCollisionHandler public class ArrowPlatformHandler extends CollisionHandler { private Image blockImage; public ArrowPlatformHandler() { super(EntityType.ARROW, EntityType.PLATFORM); blockImage = FXGL.getAssetLoader().loadTexture("towerfall/brick.png", 40, 40).getImage(); } @Override protected void onCollisionBegin(Entity arrow, Entity platform) { // necessary since we can collide with two platforms in the same frame if (arrow.hasControl(ArrowControl.class)) { arrow.getComponentUnsafe(CollidableComponent.class).setValue(false); arrow.removeControl(ArrowControl.class); GameEntity block = (GameEntity) platform; Rectangle2D grid = new Rectangle2D(0, 0, 40, 40); Array<Rectangle2D> grids = AASubdivision.divide(grid, 30, 5); for (Rectangle2D rect : grids) { PhysicsComponent physics = new PhysicsComponent(); physics.setBodyType(BodyType.DYNAMIC); FixtureDef fd = new FixtureDef(); fd.setDensity(0.7f); fd.setRestitution(0.3f); physics.setFixtureDef(fd); physics.setOnPhysicsInitialized(() -> physics.setLinearVelocity(FXGLMath.random(-1, 1) * 50, FXGLMath.random(-3, -1) * 50)); Image img = new WritableImage(blockImage.getPixelReader(), (int) rect.getMinX(), (int) rect.getMinY(), (int) rect.getWidth(), (int) rect.getHeight()); Entities.builder() .at(block.getX() + rect.getMinX(), block.getY() + rect.getMinY()) .viewFromNodeWithBBox(new ImageView(img)) //.viewFromNodeWithBBox(new Rectangle(rect.getWidth(), rect.getHeight(), Color.BLUE)) .with(physics) .buildAndAttach(FXGL.getApp().getGameWorld()); } platform.removeFromWorld(); } } }