feat: Falling blocks

This commit is contained in:
Jakub Žitník 2025-03-13 17:07:53 +01:00
parent 4ef8e217ad
commit 412959d456
Signed by: jzitnik
GPG Key ID: C577A802A6AF4EF3
10 changed files with 158 additions and 4 deletions

View File

@ -26,6 +26,7 @@ public class SpriteLoader {
OAK_PLANKS,
OAK_DOOR,
OBSIDIAN,
SAND,
// Flowers etc
GRASS_BUSH,
@ -78,6 +79,7 @@ public class SpriteLoader {
ITEM_OAK_DOOR,
ITEM_WOOL,
ITEM_OBSIDIAN,
ITEM_SAND,
// Ore Items
ITEM_COAL_ORE,
@ -172,6 +174,7 @@ public class SpriteLoader {
SPRITES_MAP.put(SPRITES.WOOL, new Wool());
SPRITES_MAP.put(SPRITES.COBBLESTONE, new SimpleSprite("cobblestone.ans"));
SPRITES_MAP.put(SPRITES.OBSIDIAN, new SimpleSprite("obsidian.ans"));
SPRITES_MAP.put(SPRITES.SAND, new SimpleSprite("sand.ans"));
// Flowers etc.
SPRITES_MAP.put(SPRITES.GRASS_BUSH, new SimpleSprite("grass_bush.ans"));
@ -224,6 +227,7 @@ public class SpriteLoader {
SPRITES_MAP.put(SPRITES.ITEM_OAK_DOOR, new SimpleSprite("oak_door/items/oak_door.ans"));
SPRITES_MAP.put(SPRITES.ITEM_WOOL, new WoolItem());
SPRITES_MAP.put(SPRITES.ITEM_OBSIDIAN, new SimpleSprite("items/obsidian.ans"));
SPRITES_MAP.put(SPRITES.ITEM_SAND, new SimpleSprite("items/sand.ans"));
// Ore Items
SPRITES_MAP.put(SPRITES.ITEM_COAL_ORE, new SimpleSprite("items/coal_ore.ans"));

View File

@ -0,0 +1,11 @@
package cz.jzitnik.game.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BreaksFalling {
}

View File

@ -0,0 +1,11 @@
package cz.jzitnik.game.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FallingBlock {
}

View File

@ -4,12 +4,14 @@ import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.BlockDropPercentage;
import cz.jzitnik.game.annotations.BlockRegistry;
import cz.jzitnik.game.annotations.BreakableByWater;
import cz.jzitnik.game.annotations.BreaksFalling;
import cz.jzitnik.game.annotations.CustomDrop;
import cz.jzitnik.game.annotations.PlaceOnSolid;
import cz.jzitnik.game.entities.Block;
@PlaceOnSolid
@BreakableByWater
@BreaksFalling
@CustomDrop(tool = "shears", drops = "grass_bush")
@BlockDropPercentage(13)
@BlockRegistry(value = "grass_bush", drops = "wheat_seeds")

View File

@ -0,0 +1,17 @@
package cz.jzitnik.game.entities.items.registry.blocks;
import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.BlockRegistry;
import cz.jzitnik.game.annotations.FallingBlock;
import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.entities.items.ItemType;
import java.util.ArrayList;
@FallingBlock
@BlockRegistry("sand")
public class SandBlock extends Block {
public SandBlock() {
super("sand", SpriteLoader.SPRITES.SAND, 1, ItemType.SHOVEL, new ArrayList<>());
}
}

View File

@ -0,0 +1,13 @@
package cz.jzitnik.game.entities.items.registry.items;
import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.annotations.ItemRegistry;
import cz.jzitnik.game.entities.items.Item;
import cz.jzitnik.game.entities.items.ItemType;
@ItemRegistry("sand")
public class SandItem extends Item {
public SandItem() {
super("sand", "Sand", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_SAND);
}
}

View File

@ -3,7 +3,6 @@ package cz.jzitnik.game.generation;
import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.Game;
import cz.jzitnik.game.SpriteLoader;
import cz.jzitnik.game.entities.items.ItemBlockSupplier;
import cz.jzitnik.game.sprites.Steve;
import java.util.List;
@ -33,9 +32,6 @@ public class Generation {
// Spawn player at a valid starting point
world[terrainHeight[256] - 1][256].add(steveBlock2);
world[terrainHeight[256] - 2][256].add(steveBlock);
game.getInventory().addItem(ItemBlockSupplier.getItem("water_bucket"));
game.getInventory().addItem(ItemBlockSupplier.getItem("lava_bucket"));
}
private static void initializeWorld(List<Block>[][] world) {

View File

@ -0,0 +1,50 @@
package cz.jzitnik.game.logic.services.falling;
import cz.jzitnik.game.Game;
import cz.jzitnik.game.annotations.BreaksFalling;
import cz.jzitnik.game.annotations.CustomLogic;
import cz.jzitnik.game.annotations.FallingBlock;
import cz.jzitnik.game.entities.Block;
import cz.jzitnik.game.logic.CustomLogicInterface;
@CustomLogic
public class FallingLogic implements CustomLogicInterface {
private static final int RADIUS = 30;
@Override
public void nextIteration(Game game) {
var world = game.getWorld();
int[] data = game.getPlayerCords();
int playerX = data[0];
int playerY = data[1];
int startX = Math.max(0, playerX - RADIUS);
int startY = Math.max(0, playerY - RADIUS);
int endX = Math.min(world[0].length - 1, playerX + RADIUS);
int endY = Math.min(world.length - 1, playerY + RADIUS);
for (int y = startY; y <= endY; y++) {
for (int x = startX; x <= endX; x++) {
var blocks = world[y][x];
if (world[y+1][x].stream().anyMatch(block -> block.getClass().isAnnotationPresent(BreaksFalling.class))) {
var fallingBlocks = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(FallingBlock.class)).toList();
for (Block block : fallingBlocks) {
blocks.remove(block);
game.getInventory().addItem(block.getDrops());
}
}
if (!world[y+1][x].stream().allMatch(block -> block.isGhost())) {
continue;
}
var fallingBlocks = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(FallingBlock.class)).toList();
for (Block block : fallingBlocks) {
blocks.remove(block);
world[y + 1][x].add(block);
}
}
}
}
}

View File

@ -0,0 +1,25 @@
                                                 
                                            
                                       
                                     
                             
                          
                       
                         
                          
                       
                        
                         
                        
                        
                   
                       
                         
                       
                       
                            
                              
                                 
                                       
                                             
                                                 

View File

@ -0,0 +1,25 @@