= 创作分享 =
编程开发
1.12.2关于粒子效果生成的问题
随克

1.12.2关于粒子效果生成的问题

随克 于 2024-12-20 20:38 ( 1天前 ) [复制链接] [只看楼主] [打印]
49 0
50RF
本帖最后由 QQ酱121421 于 2024-12-20 21:48 编辑

骨粉粒子效果问题
  • 我直接调用:
    1. net.minecraft.item.ItemDye.spawnBonemealParticles(world, pos, 15);
    复制代码



  • 或者复制spawnBonemealParticles()方法:
    1. for (int i = 0; i < 15; ++i) {
    2.     double x = (double) ((float)pos.getX() + rand.nextFloat());
    3.     double y = (double) ((float)pos.getY() + rand.nextFloat());
    4.     double z = (double) ((float)pos.getZ() + rand.nextFloat());

    5.     double d0 = rand.nextGaussian() * 0.02D;
    6.     double d1 = rand.nextGaussian() * 0.02D;
    7.     double d2 = rand.nextGaussian() * 0.02D;

    8.     world.spawnParticle(
    9.         EnumParticleTypes.VILLAGER_HAPPY,
    10.         x, y, z,
    11.         d0, d1, d2
    12.     );
    13. }
    复制代码



  • 两种方法来生成骨粉的粒子效果, 但是都没有骨粉的粒子出现.


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
关于自定义粒子
  • 我的自定义粒子贴图错误, 显示的是原版的那一大张粒子合集图


  • 主类注册粒子贴图:
    1. @SubscribeEvent
    2. public static void onTextureStitchPre(net.minecraftforge.client.event.TextureStitchEvent.Pre event) {
    3.     event.getMap().registerSprite(new ResourceLocation(MODID, "particle/cherry_particle"));
    4. }
    复制代码



  • 粒子类:
    1. public class CherryParticle extends Particle {

    2.     private static Random random = new Random();
    3.     private static double[] axis = new double[]{0.03D, 0.04D, 0.05D, 0.06D, 0.07D};

    4.     public CherryParticle(World world, double x, double y, double z) {
    5.         super(world, x, y, z);

    6.         // 获取粒子贴图
    7.         Texture texture = new Texture();

    8.         // 设置粒子贴图
    9.         this.particleTexture = texture;
    10.         this.particleTextureIndexX = 1;
    11.         this.particleTextureIndexY = 1;

    12.         // 设置粒子生命周期
    13.         this.isExpired = false;
    14.         this.particleAge = 0;
    15.         this.particleMaxAge = (20 * 10); // 粒子生命周期 / 10s

    16.         // 粒子运动
    17.         this.motionX = axis[random.nextInt(axis.length)];
    18.         this.motionY = 0;
    19.         this.motionZ = axis[random.nextInt(axis.length)];

    20.         // 粒子不可以被碰撞
    21.         this.canCollide = false;
    22.     }

    23. //生成粒子效果方法
    24.     public static void spawnParticle(World world, BlockPos pos) {
    25.         IBlockState downBlockState = world.getBlockState(pos.down());
    26.         Block downBlock = downBlockState.getBlock();

    27.         if (!downBlock.isFullCube(downBlockState) && random.nextInt(8) == 0) {
    28.             double x = pos.getX() + (Math.random() * 1);
    29.             double y = pos.getY() - 0.01;
    30.             double z = pos.getZ() + (Math.random() * 1);

    31.             CherryParticle particle = new CherryParticle(world, x, y, z);
    32.             net.minecraft.client.Minecraft.getMinecraft().effectRenderer.addEffect(particle);
    33.         }
    34.     }

    35. //粒子更新逻辑
    36.     private double fall = 0.09;
    37.     @Override
    38.     public void onUpdate() {
    39.         this.prevPosX = this.posX;
    40.         this.prevPosY = this.posY;
    41.         this.prevPosZ = this.posZ;

    42.         this.motionY = -fall;
    43.         if (this.particleAge % 5 == 0 && fall >= 0.01)
    44.             /*更新下落速度*/fall -= 0.002;

    45.         //移动
    46.         this.move(this.motionX, this.motionY, this.motionZ);

    47.         expiredParticle();
    48.     }

    49. //检查移除
    50.     public void expiredParticle() {
    51.         BlockPos pos = new BlockPos(this.posX, this.posY, this.posZ);
    52.         IBlockState posBlockState = this.world.getBlockState(pos);
    53.         Block posBlock = posBlockState.getBlock();

    54.         // 粒子生命周期结束 || (当前位置方块是完整方块 && 当前位置方块不是樱花树叶)
    55.         if (this.particleAge++ >= this.particleMaxAge || (posBlock.isFullCube(posBlockState) && posBlock != BlockBase.CHERRY_LEAVES))
    56.             /*移除粒子*/this.setExpired();
    57.     }

    58. //材质
    59.     class Texture extends TextureAtlasSprite {
    60.         public Texture() {
    61.             super("suikecherry:particle/cherry_particle");

    62.             this.width = 3;
    63.             this.height = 3;
    64.             this.initSprite(3, 3, 0, 0, false);
    65.         }
    66.     }
    67. }
    复制代码




  • 以上实现的效果:


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
顺便问一下怎么识别玩家是否是创造模式, 我从别人源码复制的
  1. if (!player.capabilities.isCreativeMode)
复制代码


会报错:
  1. 错误: capabilities  
  2. 在 Entity 中是 private 访问控制
  3.             if (!player.capabilities.isCreativeMode)
  4.                        ^
  5. 错误: 找不到符号
  6.             if (!player.capabilities.isCreativeMode)
  7.                                     ^
  8.   符号:   变量 isCreativeMode
  9.   位置: 类型为CapabilityDispatcher的变量 capabilities
复制代码

发表于 前天 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 0 条回复!
百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表