基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器

绘制简单粒子特效与BukkitRunable定时器

    • 粒子特效
    • 多线程BukkitRunable

粒子特效

利用定时器来设定特效出现是否延迟,以及周期频率
奖励特效一:
VexLighting
在玩家处生成一道闪电

基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第1张图片

// 闪电特效
package com.project.minecraft.vexview;

import com.project.minecraft.main;
import lk.vexview.api.VexViewAPI;
import lk.vexview.effects.VexLightning;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class Jiangli_Effect1 extends BukkitRunnable {
    Player player;


    public Jiangli_Effect1(Player player){
        this.player = player;
    }

    int s = 5;
    @Override
    public void run() {
        s--;
        VexLightning vl = new VexLightning(0, 255, 255);
        VexViewAPI.spawnVexEffect(player.getLocation(), vl);

    }


    /**
     * 开启特效的方法
     */
    public void startEffect() {
        runTaskTimer(main.plugin, 0L, 20L*4);
    }

//    /**
//     * 关闭特效的方法
//     */
//    public void stopEffect() {
//       cancel();
//    }

}

奖励特效二:
以玩家为底点,生成一个向上的螺旋
基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第2张图片

package com.project.minecraft.vexview;

import com.project.minecraft.main;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class Jiangli_Effect2 extends BukkitRunnable {
     Player player;

    public Jiangli_Effect2(Player player){
        this.player = player;
    }

    int s = 20;
    @Override
    public void run(){

        s --;
        // 依然还是要判断玩家
        if (player == null || !player.isOnline()) {
            cancel();
        }

        Location location = player.getLocation();

        for (double radius = 0, y = 0, degree = 0; degree < 360 * 4; degree++, y += 0.01, radius += 0.01) {
            double radians = Math.toRadians(degree);
            double x = radius * Math.cos(radians);
            double z = radius * Math.sin(radians);

            location.add(x, y, z);
            location.getWorld().playEffect(location, Effect.FLAME, 50);
            location.subtract(x, y, z);
        }
        if (s == 0){
            cancel();
        }

//        if (degree >= 360) {
//            degree = 0;
//        } else {
//            degree += 10;
//        }
//

    }
    /**
     * 开启特效的方法
     */
    public void startEffect() {
        runTaskTimer(main.plugin, 0L, 20L*2);
    }

//    /**
//     * 关闭特效的方法
//     */
//    public void stopEffect() {
//      cancel();
//    }

}

其他粒子特效(声音或者图形)基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第3张图片
+编写的数学函数即可生成 想要得到的粒子特效。

多线程BukkitRunable

Bukkit定时器是平时开发也会用到的,比如延迟,冷却,准备时间等等,都会使用。
bukkit提供了一个专有的线程,可以用来实现延迟等效果。

Java里面1000L是1秒,而Bukkit里面的是20L一秒,Bukkit服务器是使用单线程的.

然后想要实现一个定时器,可以直接new一个BukkitRunnable抽象类然后创建继承的Runnable接口方法就行了。

这里不会多说,具体请反编译核心文件的org.bukkit.scheduler查看,文档直接官方看就行了

一般有2种方法实现,1是直接new匿名类,2是创建一个类继承BukkitRunnable实现定时器。

基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第4张图片
匿名类的方法创建定时器,一般来说,我喜欢创建一类继承来实现
基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第5张图片
基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第6张图片
基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器_第7张图片
定时器编程教程
http://mineplugin.org/index.php?oldid=6917

你可能感兴趣的:(#)