Minecraft 1.19.2 Fabric模组开发 04.动画效果方块

news2024/9/20 10:46:43

我们本次尝试在1.19 Fabric中制作一个具有动画效果的方块

fabric 00_00_01-00_00_04 00_00_00-00_00_30.gif
效果演示 效果演示 效果演示

首先,请确保你的开发包中引入了geckolib依赖,相关教程请参考:Minecraft 1.19.2 Fabric模组开发 03.动画生物实体

1.首先我们要使用geckolib制作一个物品和对应的动画:

在blockbench中新建一个Geckolib动画模型

cr0.jpg

制作相关的模型和动画:

mdr.jpg

之后导出方块模型文件,动画文件,展示文件:

cr2.jpg

之后我们找到Geckolib Model Settings并点击将模型转换为Block/Item格式:

cr1.jpg

导出物品模型文件:

cri.jpg

将这些文件分别放入到resources包中的如下位置:

39383_0cf2862181-crp.jpg

2.在block包中新建一个我们的方块类BlockGooseBody:

BlockGooseBody.java

package net.joy187.joyggd.block;

import net.joy187.joyggd.init.BlockEntityInit;
import net.minecraft.block.*;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityTicker;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.screen.NamedScreenHandlerFactory;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.DirectionProperty;
import net.minecraft.state.property.Properties;
import net.minecraft.util.*;
import net.minecraft.util.function.BooleanBiFunction;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;

import java.util.stream.Stream;

public class BlockGooseBody extends BlockWithEntity implements BlockEntityProvider {
	//定义方块的朝向
    public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING;

    public BlockGooseBody(Settings settings) {
        super(settings);
    }
    
    //定义方块的碰撞体积
    private static final VoxelShape SHAPE = Stream.of(
            Block.createCuboidShape(3.0D, 0.0D, 3.0D, 13.0D, 13.0D, 13.0D)
    ).reduce((v1, v2) -> VoxelShapes.combineAndSimplify(v1, v2, BooleanBiFunction.OR)).get();

    //确定与之绑定的方块实体
    @Nullable
    @Override
    public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
        return new BlockEntityGooseBody(pos, state);
    }
    
    @Override
    public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {

        return SHAPE;
    }

    @Nullable
    @Override
    public BlockState getPlacementState(ItemPlacementContext ctx) {
        return this.getDefaultState().with(FACING, ctx.getPlayerFacing().getOpposite());
    }

    @Override
    public BlockState rotate(BlockState state, BlockRotation rotation) {
        return state.with(FACING, rotation.rotate(state.get(FACING)));
    }

    @Override
    public BlockState mirror(BlockState state, BlockMirror mirror) {
        return state.rotate(mirror.getRotation(state.get(FACING)));
    }

    @Override
    protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
        builder.add(FACING);
    }

    @Override
    public BlockRenderType getRenderType(BlockState state) {
        return BlockRenderType.ENTITYBLOCK_ANIMATED;
    }
    
}

在BlockInit类中将我们的物品进行注册:

BlockInit.java

package net.joy187.joyggd.init;

import net.minecraft.block.Block;

import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.block.BlockGooseBody;
import net.minecraft.block.*;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.intprovider.UniformIntProvider;
import net.minecraft.util.registry.Registry;

public class BlockInit {
	//注册该方块
    public static final Block GOOSEBODY = registerBlockWithoutBlockItem("goosebody" ,
    		new BlockGooseBody(FabricBlockSettings.copy(Blocks.BONE_BLOCK).nonOpaque()));
    
    private static Block registerBlockWithoutBlockItem(String name, Block block) {
        return Registry.register(Registry.BLOCK, new Identifier(ModMain.MOD_ID, name), block);
    }
    
    private static Block registerBlock(String name, Block block, ItemGroup group) {
        registerBlockItem(name, block, group);
        return Registry.register(Registry.BLOCK, new Identifier(ModMain.MOD_ID, name), block);
    }

    private static Item registerBlockItem(String name, Block block, ItemGroup group) {
        return Registry.register(Registry.ITEM, new Identifier(ModMain.MOD_ID, name),
                new BlockItem(block, new FabricItemSettings().group(group)));
    }

    public static void registerModBlocks() {
        System.out.println("Registering Mod Blocks for " + ModMain.MOD_ID);
    }
    
}

3.在block包新建一个方块实体类BlockEntityGooseBody:

BlockEntityGooseBody.java

package net.joy187.joyggd.block;

import net.joy187.joyggd.entity.EntityGoose;
import net.joy187.joyggd.init.BlockEntityInit;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.util.math.BlockPos;
import software.bernie.geckolib3.core.IAnimatable;
import software.bernie.geckolib3.core.PlayState;
import software.bernie.geckolib3.core.builder.AnimationBuilder;
import software.bernie.geckolib3.core.controller.AnimationController;
import software.bernie.geckolib3.core.event.predicate.AnimationEvent;
import software.bernie.geckolib3.core.manager.AnimationData;
import software.bernie.geckolib3.core.manager.AnimationFactory;

public class BlockEntityGooseBody extends BlockEntity implements IAnimatable {
	private AnimationFactory manager = new AnimationFactory(this);
	
	public BlockEntityGooseBody(BlockPos pos, BlockState state) {
		super(BlockEntityInit.BLOCKGOOSEBODY , pos, state);
		// TODO Auto-generated constructor stub
	}
    
    //指定该状态机播放什么动画
    private <E extends IAnimatable> PlayState predicate(AnimationEvent<E> event) {
        event.getController().setAnimation(new AnimationBuilder().addAnimation("animation.goosebody.rotate", true));

        return PlayState.CONTINUE;
    }

	//将状态机进行注册
	@Override
	public void registerControllers(AnimationData data) {
		data.addAnimationController(new AnimationController<BlockEntityGooseBody>(this, "controller",
                0, this::predicate));
	}

	@Override
	public AnimationFactory getFactory() {
		// TODO Auto-generated method stub
		return this.manager;
	}

}

新建一个BlockEntityInit类将该方块实体进行注册:

BlockEntityInit.java

package net.joy187.joyggd.init;

import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.block.BlockEntityGooseBody;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;

public class BlockEntityInit {

	public static BlockEntityType<BlockEntityGooseBody> BLOCKGOOSEBODY;
    
	public static void registerAllBlockEntities() {
	    //将该方块实体进行注册
		BLOCKGOOSEBODY = Registry.register(Registry.BLOCK_ENTITY_TYPE,
			new Identifier(ModMain.MOD_ID, "goosebody"),FabricBlockEntityTypeBuilder.create(BlockEntityGooseBody::new
					,BlockInit.GOOSEBODY).build(null));
	}
	
}

4.之后就是该实体的渲染工作了,新建一个模型类ModelGooseBody和一个渲染类RenderGooseBody

ModelGooseBody.java

package net.joy187.joyggd.block.model;

import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.block.BlockEntityGooseBody;
import net.joy187.joyggd.entity.EntityGoose;
import net.minecraft.util.Identifier;
import software.bernie.geckolib3.model.AnimatedGeoModel;

public class ModelGooseBody extends AnimatedGeoModel<BlockEntityGooseBody> {
    
    //方块模型文件地址
    @Override
    public Identifier getModelResource(BlockEntityGooseBody animatable) {
        return new Identifier(ModMain.MOD_ID, "geo/goosebody.geo.json");
    }
    
    //方块贴图文件地址
    @Override
    public Identifier getTextureResource(BlockEntityGooseBody entity) {

        return new Identifier(ModMain.MOD_ID, "textures/block/body.png");
    }
    //方块动画文件地址
    @Override
    public Identifier getAnimationResource(BlockEntityGooseBody entity) {
        return new Identifier(ModMain.MOD_ID, "animations/goosebody.animation.json");
    }
    
}

这个类用来将我们刚刚的模型进行渲染

RenderGooseBody.java

package net.joy187.joyggd.block.render;


import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.block.BlockEntityGooseBody;
import net.joy187.joyggd.block.model.ModelGooseBody;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
import software.bernie.geckolib3.renderers.geo.GeoBlockRenderer;

public class RenderGooseBody extends GeoBlockRenderer<BlockEntityGooseBody> {
	public RenderGooseBody(BlockEntityRendererFactory.Context context) {
	    //将上面的模型传进来
		super(new ModelGooseBody());
	}
    
    @Override
    public RenderLayer getRenderType(BlockEntityGooseBody animatable, float partialTicks, MatrixStack stack,
                                     VertexConsumerProvider renderTypeBuffer, VertexConsumer vertexBuilder,
                                     int packedLightIn, Identifier textureLocation) {

        return RenderLayer.getEntityTranslucent(getTextureResource(animatable));
    }
}

5.方块制作完了,需要有一个物品与之对应,所以在Items包中新建一个物品类ItemGooseBody:

ItemGooseBody.java

package net.joy187.joyggd.items;

import net.minecraft.block.Block;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import software.bernie.geckolib3.core.IAnimatable;
import software.bernie.geckolib3.core.PlayState;
import software.bernie.geckolib3.core.controller.AnimationController;
import software.bernie.geckolib3.core.event.predicate.AnimationEvent;
import software.bernie.geckolib3.core.manager.AnimationData;
import software.bernie.geckolib3.core.manager.AnimationFactory;

public class ItemGooseBody extends BlockItem implements IAnimatable{

	public AnimationFactory factory = new AnimationFactory(this);
	
	public ItemGooseBody(Block block,Settings settings){
		super(block,settings);
	}
	
	//指定该状态机播放什么动画
	private <E extends IAnimatable> PlayState predicate(AnimationEvent<E> event){
		//event.getController().setAnimation(new AnimationBuilder().addAnimation("idle" ,stoudloop trwe));
		return PlayState.CONTINUE;
	}
	
	//注册所有状态机
	@Override
	public void registerControllers(AnimationData animationData){
		animationData.addAnimationController(new AnimationController(this,"controller",
		0, this::predicate));
	}
		
	@Override
	public AnimationFactory getFactory() 
	{
		return this.factory; 
	}
}

之后我们要对该方块进行建模和渲染,分别新建一个模型类ModelItemGooseBody和渲染类RenderItemGooseBody:

ModelItemGooseBody.java

package net.joy187.joyggd.items.model;

import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.items.ItemGooseBody;
import net.minecraft.util.Identifier;
import software.bernie.geckolib3.model.AnimatedGeoModel;

                                                        //将上面的物品类填入<>中
public class ModelItemGooseBody extends AnimatedGeoModel<ItemGooseBody> {
    
    //模型地址
    @Override
    public Identifier getModelResource(ItemGooseBody animatable) {
        return new Identifier(ModMain.MOD_ID, "geo/goosebody.geo.json");
    }
    
    //贴图地址
    @Override
    public Identifier getTextureResource(ItemGooseBody entity) {

        return new Identifier(ModMain.MOD_ID, "textures/block/body.png");
    }
    
    //动画文件地址
    @Override
    public Identifier getAnimationResource(ItemGooseBody entity) {
        return new Identifier(ModMain.MOD_ID, "animations/goosebody.animation.json");
    }
    
}

之后是渲染文件,用于将上面的物品模型进行渲染:

RenderItemGooseBody.java

package net.joy187.joyggd.items.render;

import net.joy187.joyggd.items.ItemGooseBody;
import net.joy187.joyggd.items.model.ModelItemGooseBody;
import software.bernie.geckolib3.renderers.geo.GeoItemRenderer;
                                                    //将上面的物品类填入<>中
public class RenderItemGooseBody extends GeoItemRenderer<ItemGooseBody> {
	public RenderItemGooseBody() { 
	    //将上面的物品模型文件放入super()中
		super(new ModelItemGooseBody());
	}
}

在ItemInit中注册我们的方块:

ItemInit.java

package net.joy187.joyggd.init;

import net.minecraft.item.Item;
import net.minecraft.item.SpawnEggItem;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.joy187.joyggd.ModMain;
import net.joy187.joyggd.items.ItemGooseBody;
import net.joy187.joyggd.items.ItemPele;
import net.joy187.joyggd.items.ItemSheriff;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;

public class ItemInit {
    
    //注册该物品
   public static final Item GOOSEBODY =  registerItem("goosebody",
    						 //这个是指定该物品与BlockInit中的一个方块形成对应关系
    		new ItemGooseBody(BlockInit.GOOSEBODY,new FabricItemSettings().group(ModMain.ITEMTAB)));
    
    private static Item registerItem(String name, Item item) {
        return Registry.register(Registry.ITEM, new Identifier(ModMain.MOD_ID, name), item);
    }

    public static void registerModItems() {
    	ModMain.LOGGER.debug("Registering Mod Items for " + ModMain.MOD_ID);
    }
}

6.在项目主类中添加相关类注册事件:

ModMain.java

package net.joy187.joyggd;

import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry;
import net.joy187.joyggd.entity.EntityGoose;
import net.joy187.joyggd.init.BlockEntityInit;
import net.joy187.joyggd.init.BlockInit;
import net.joy187.joyggd.init.EntityInit;
import net.joy187.joyggd.init.ItemInit;
import net.minecraft.client.render.entity.FlyingItemEntityRenderer;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import software.bernie.geckolib3.GeckoLib;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ModMain implements ModInitializer {
	
	public static final String MOD_ID = "joyggd";
	public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);

    public static final ItemGroup ITEMTAB = FabricItemGroupBuilder.build(
            new Identifier(MOD_ID, "itemtab"), () -> new ItemStack(ItemInit.SHERIFF));
	
	@Override
	public void onInitialize() {
	    //物品总类注册
		ItemInit.registerModItems();
		//方块类BlockInit注册
		BlockInit.registerModBlocks();
		//方块实体类注册
		BlockEntityInit.registerAllBlockEntities();
		
		GeckoLib.initialize();
	}
}

来到客户端类,将一系列方块和实体的渲染进行注册:

ModClient.java

package net.joy187.joyggd;

import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
import net.joy187.joyggd.block.render.RenderGooseBody;
import net.joy187.joyggd.entity.render.RenderGoose;
import net.joy187.joyggd.init.BlockEntityInit;
import net.joy187.joyggd.init.BlockInit;
import net.joy187.joyggd.init.EntityInit;
import net.joy187.joyggd.init.ItemInit;
import net.joy187.joyggd.items.render.RenderItemGooseBody;
import net.minecraft.client.render.RenderLayer;
import software.bernie.geckolib3.renderers.geo.GeoItemRenderer;

public class ModClient implements ClientModInitializer{

	@Override
	public void onInitializeClient() {
		
		//方块渲染类型注册
		BlockRenderLayerMap.INSTANCE.putBlock(BlockInit.GOOSEBODY, RenderLayer.getCutout());
		
		//方块实体渲染进行注册
		BlockEntityRendererRegistry.register(BlockEntityInit.BLOCKGOOSEBODY, RenderGooseBody::new);	
		
		//物品渲染类型进行注册
		GeoItemRenderer.registerItemRenderer(ItemInit.GOOSEBODY, new RenderItemGooseBody());
	}
	
}

7.代码部分结束,来到资源包制作。

在lang语言包的en_us.json中添加方块的名称:

en_us.json

"block.joyggd.goosebody":"Block Name"

在blockstates中添加方块状态文件:

goosebody.json

{
  "variants":{
    "facing=north":{"model":"joyggd:block/goosebody"},
    "facing=east":{"model":"joyggd:block/goosebody","y":90},
    "facing=south":{"model":"joyggd:block/goosebody","y":180},
    "facing=west":{"model":"joyggd:block/goosebody","y":270}
  }
}

来到数据包中,在data\你的modid\loot_tables\blocks中创建一个方块挖掉后的掉落物文件:

goosebody.json

{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "joyggd:goosebody"
        }
      ]
    }
  ]
}

8.进入游戏调试。

第一步中导出的文件源代码:

方块的geo文件(放入geo文件夹):

goosebody.geo.json

{
	"format_version": "1.12.0",
	"minecraft:geometry": [
		{
			"description": {
				"identifier": "geometry.goosebody - Converted",
				"texture_width": 16,
				"texture_height": 16,
				"visible_bounds_width": 2,
				"visible_bounds_height": 2.5,
				"visible_bounds_offset": [0, 0.75, 0]
			},
			"bones": [
				{

						{
							"origin": [-4.33043, 0, -5.47826],
							"size": [0.17391, 0.08696, 3.92609],
							"uv": {
								"north": {"uv": [2.66957, 14.8913], "uv_size": [0.17391, -0.51304]},
								"east": {"uv": [2.86957, 3.65217], "uv_size": [0.08696, 11.82609]},
								"south": {"uv": [3.04348, 3.65217], "uv_size": [-0.17391, 0.08696]},
								"west": {"uv": [2.95652, 3.65217], "uv_size": [0.08696, 11.82609]},
								"up": {"uv": [3.73043, 14.52174], "uv_size": [-0.17391, -0.51304]},
								"down": {"uv": [3.26848, 14.27717], "uv_size": [-0.17391, 0.32609]}
							}
						},
						//略
						{
							"origin": [1.06087, 0, -5.47826],
							"size": [0.34783, 0.08696, 6.88261],
							"uv": {
								"north": {"uv": [8.06087, 14.8913], "uv_size": [0.34783, -0.51304]},
								"east": {"uv": [8.26087, 0.69565], "uv_size": [0.08696, 14.78261]},
								"south": {"uv": [8.6087, 0.69565], "uv_size": [-0.34783, 0.08696]},
								"west": {"uv": [8.52174, 0.69565], "uv_size": [0.08696, 14.78261]},
								"up": {"uv": [9.29565, 14.52174], "uv_size": [-0.34783, -3.46957]},
								"down": {"uv": [8.8337, 11.32065], "uv_size": [-0.34783, 3.28261]}
							}
						}
					]
				}
			]
		}
	]
}

本次方块的动画文件(放入animations文件夹):

goosebody.animations.json

{
	"format_version": "1.8.0",
	"animations": {
		"animation.goosebody.rotate": {
			"loop": true,
			"animation_length": 2,
			"bones": {
				"body": {
					"rotation": {
						"0.0": {
							"vector": [0, 0, 0]
						},
						"0.5": {
							"vector": [0, -90, 0]
						},
						"1.0": {
							"vector": [0, -180, 0]
						},
						"1.5": {
							"vector": [0, -270, 0]
						},
						"2.0": {
							"vector": [0, -360, 0]
						}
					}
				}
			}
		}
	},
	"geckolib_format_version": 2
}

方块展示文件(放入models/block文件夹):

goosebody.json

{
  "credit": "Made with Blockbench",
  "parent": "builtin/entity",
  "display": {
    "thirdperson_righthand": {
      "scale": [
        0.75,
        0.75,
        0.75
      ]
    },
    "thirdperson_lefthand": {
      "scale": [
        0.75,
        0.75,
        0.75
      ]
    },
    "firstperson_righthand": {
      "rotation": [
        -180,
        -3.25,
        -180
      ],
      "translation": [
        0,
        -1.5,
        -3
      ],
      "scale": [
        0.75,
        0.75,
        0.75
      ]
    },
    "firstperson_lefthand": {
      "rotation": [
        -180,
        32,
        180
      ],
      "translation": [
        0.75,
        -1.75,
        -1.75
      ],
      "scale": [
        0.75,
        0.75,
        0.75
      ]
    },
    "ground": {
      "translation": [
        0,
        -3.5,
        0
      ]
    },
    "gui": {
      "translation": [
        0,
        -7.5,
        0
      ]
    },
    "head": {
      "translation": [
        0,
        6.25,
        0
      ]
    },
    "fixed": {
      "translation": [
        -0.75,
        -5.5,
        0
      ]
    }
  }
}

物品模型文件(放入models/item文件夹):

goosebody.json

{}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eCharts工具类

ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。ECharts最初由百度团队开源&#xff0c;并于2018年初捐赠给Apache基金会&#xff0c;成为ASF孵化级项目。 ECharts官方地址…

【数据结构与算法】顺序表的原理及实现

1.什么是顺序表 顺序表是用一段物理地址连续的存储单元进行存储元素的线性结构&#xff0c;通常是以数组进行存储。通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。 2.顺序表的实现 判断顺序表是否为空表public boolean isEmpty()判断顺序表是否满publi…

excel功能小技巧:自动求和的注意事项

在EXCEL里有个非常方便的按钮&#xff0c;叫做自动求和。不需要输入公式&#xff0c;直接一点&#xff0c;即可得出求和结果。由于它操作上的便利&#xff0c;所以深受小白喜爱。不过看着简单的自动求和按钮&#xff0c;实际上却藏着不少暗坑&#xff0c;稍不留神&#xff0c;可…

juc系列(2)--线程的使用及原理

目录线程创建线程ThreadRunnableCallable线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终止模式daemon不推荐线程原理运行机制线程调度未来优化线程状态查看线程线程 创建线程 Thread Thread 创建线程方式&#xff1a;创建线程类&#xff0c;匿名内部类方…

R-P-Faster R-CNN day65 读论文:高分辨率遥感影像综合地理空间目标检测框架

An Efficient and Robust Integrated Geospatial Object Detection Framework for High Spatial Resolution Remote Sensing Imagery 1. Introduction3. Overview of the Proposed R-P-Faster R-CNN Framework3.1. 有效集成区域建议网络与目标检测Faster R-CNN框架3.1.2. RPN与…

java反射在spring ioc和aop中的应用

java反射在spring ioc和aop中的应用 反射&#xff1a; 1.反射是什么&#xff1f; 程序运行时&#xff0c;通过类名能够获得类的属性和方法。使用方式如下 Class clazz Class.ForName(“Student”)Class clazz Student.class;Class clazz student.getClass(); 获取到claz…

java JUC 中 Object里wait()、notify() 实现原理及实战讲解

1.Object中的wait()实现原理 在进行wait()之前&#xff0c;就代表着需要争夺Synchorized&#xff0c;而Synchronized代码块通过javap生成的字节码中包含monitorenter和monitorexit两个指令。 当在进加锁的时候会执行monitorenter指令&#xff0c;执行该指令可以获取对象的mon…

前端与HTML

本节课程围绕“前端要解决的基本问题”及“什么是 HTML ”两个基本问题展开&#xff0c;了解 HTML 高效的编写原则。 什么是前端 使用web技术栈解决多端的人机交互问题 技术栈 html&#xff08;内容&#xff09; css &#xff08;样式&#xff09;javascript &#xff08;行…

linux部署KubeSphere和k8s集群

上一篇文章讲述了在单个节点上安装 KubeSphere和k8s&#xff0c;这节主要讲解k8s多节点集群部署 准备环境&#xff1a;Alibaba Cloud Linux系统3台机器第一步&#xff1a;设置主机名称hostname--(3台机器都设置) hostnamectl set-hostname master hostnamectl set-hostname nod…

智云通CRM:为什么你总是在请客,但业绩却上不来?

王总是一位企业老板&#xff0c;社会资源比较好&#xff0c;在过去的一年里&#xff0c;他新代理的一个保健品的项目&#xff0c;需要销售产品和招募合伙人。他想利用自己的人脉资源做销售&#xff0c;但他的销售过程并不顺利&#xff0c;在连续主动邀约之后效果不佳。 于是他…

2023/1/15 JS-变量提升与函数提升 执行上下文

1 变量提升与函数提升 变量声明提升 通过 var 声明的变量&#xff0c;在声明语句之前就可以访问到 - 值: undefined <script>console.log(a); // undefinedvar a 10 </script>函数声明提升 通过 function 声明的函数, 在声明语句之前就可以直接调用 - 值: 函数…

走近软件生态系统

生态系统&#xff08;Ecosystem&#xff09;原本是一个生物学术语&#xff0c;意思是由一些生命体相互依存、相互制约而形成的大系统&#xff0c;就像我们学生时代在生物学课堂上学到的那样。隐喻无处不在&#xff0c;人们把这个术语移植到了 IT 领域中来&#xff0c;比如我们常…

计算机基础(六):静态链接与动态链接

上一篇文章简单概括了 C语言程序经过编译&#xff0c;生成汇编语言、机器语言的基本过程。今天主要介绍其中链接阶段的实现思路。 静态链接 静态链接是将被依赖的代码片段复制到执行程序中&#xff0c;进行代码整合。因为我们在汇编代码中看到的是具体的符号&#xff0c;而且…

电路方案分析(十七)TI远程声控参考设计

远程声控参考设计 描述 CC2650远程控制设计为基于ZigBeeRF4CE™兼容的软件架构RemeTI™或蓝牙低能耗软件堆栈的快速测试、评估和开发远程控制应用程序提供了最佳基础。 该方案设计包含了CC2560远程控制的原理图和布局文件&#xff0c;以及一个演示了使用RF4CE和低能耗蓝牙的…

层次分析法和熵值法经典实操案例+数据

1、数据来源&#xff1a;无 2、时间跨度&#xff1a;无 3、区域范围&#xff1a;无 4、指标说明&#xff1a; 层次分析法&#xff08;Analytic Hierarchy Process&#xff0c;简称AHP&#xff09;是美国运筹学家、匹兹堡大学T. L. Saaty教授在20世纪70年代初期提出的&#…

《Buildozer打包实战指南》第二节 安装Kivy和Buildozer

目录 2.1 安装Kivy 2.2 安装Buildozer 2.3 验证安装 2.4 一点建议 Python是Ubuntu系统中自带的&#xff0c;我们在桌面上右键打开终端&#xff0c;然后输入python3 --version就可以看到Ubuntu系统中的Python版本了。 可以看到&#xff0c;Python的版本是3.10.6。虽然Python…

【Go基础】结构体

1. 结构体引入 Golang也支持面向对象编程&#xff0c;但是和传统的面向对象有区别&#xff0c;并不是像Java、C那样纯粹的面向对象语言&#xff0c;而是通过特别的手段实现面向对象特点。 Golang没有类(Class)的概念&#xff0c;但是提供了结构体(struct)&#xff0c;和其他编…

Nacos的学习

Nacos的学习 1、下载地址 https://github.com/alibaba/nacos/releases/tag/2.1.1 在bin目录中输入命令 startup.cmd -m standalone 输入localhost:8848/nacos 账号&#xff1a;nacos&#xff0c;密码&#xff1a;nacos 2、Spring与Nacos &#xff08;1&#xff09;新增一个配…

100天精通Python(数据分析篇)——第72天:Pandas文本数据处理方法之判断类型、去除空白字符、拆分和连接

文章目录每篇前言一、Python字符串内置方法1. 判断类型2. 去除空白字符3. 拆分和连接二、Pandas判断类型1. str.isspace()2. str.isalnum()3. str.isalpha()4. str.isdecimal()5. str.isdigit()6. str.isnumeric()7. str.istitle()8. str.islower()9. str.isupper()三、Pandas去…

音视频技术开发周刊 | 279

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。基于NeRF的APP上架苹果商店&#xff01;照片转3D只需一部手机这个名叫Luma AI的“NeRF APP”&#xff0c;正式上架App Store后爆火。反 AiArt 运动中两件匪夷所思的蠢事Redd…