先上一张效果图
逻辑分析
- 首先是玩家在游戏里输入命令(指定文件的名字 ,以及一个数(用来区分黑白像素))
- 当玩家发送命令后,代码首先会获取玩家的位置, 用来确定生成图片的位置
- 分析参数,获取本地文件中的指定的图片
- 分析参数,获取区分黑白像素的阈值( 0~255)
- 使用java的库, 将图片文件封装为一个BufferedImage对象(用于获取图片的宽高,以及以数组的形式获取图片的像素值)
- 使用两层for循环, 在循环内部首先根据下标获取文件的像素点 ,根据设定的阈值判断为黑色或白色
- 获取当前坐标下的方块对象(x,y,z)
- 黑色使用煤炭块,白色使用羊毛块, 调用方块对象的set方法,设置为对应方块
代码分析
package com.qwrdxer;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Drawit extends JavaPlugin{
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("Drawit")) {
if (!(sender instanceof Player)) {
sender.sendMessage("Only players can use this command!");
return true;
}
// 检测指令执行者是玩家后,我们便可以安全的进行强制转换类操作。
Player s = (Player) sender;
//获取s的 x,y,z坐标
int x = (int)s.getLocation().getX()+70;
int y = 4;
int z = (int)s.getLocation().getZ();
//获得接口
World world=s.getWorld();
//获得命令后的参数
String arg = args[0];
int arg2=Integer.parseInt(args[1]); //黑白颜色的判断权值, 0~255 越小判断为黑的范围越大
String path="C:\\img\\"+arg;
getLogger().info(path);
/*
->未实现功能
根据url地址下载网络上的图片,
获取它的长和宽,每一个像素点对应MC里的12色羊毛
*/
/*
使用图片IO获取像素点
*/
File file = new File(path);//导入文件
BufferedImage bufImg = null;
try {
bufImg = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int height = bufImg.getHeight();
int width = bufImg.getWidth();
/*
开始绘制图片
*/
int point;
for(int zindx=z;zindx<z+width;zindx++){
for(int yindx=y;yindx<y+height;yindx++){
point=bufImg.getRGB(zindx-z,(height-1)-(yindx-y))&0x0000ff;
getLogger().info(point+"");
Block currentBlock = world.getBlockAt(x+10, yindx,zindx);
/*
为方便实现,使用黑白两种颜色的羊毛
条件判断会根据玩家输入的参数作为阈值
*/
if(point>=arg2){
currentBlock.setType(Material.SNOW_BLOCK);
}
else{
currentBlock.setType(Material.COAL_BLOCK);
}
}
}
return true;
}
return false;
}
}
使用方式
注:
目前是使用绝对路径,因此需要在C盘下创建一个名字为img的文件夹
在这里存放图片, 游戏里的参数直接输入文件名即可
使用方式
- 将插件放到服务器的插件目录
- 命令参数 /Drawit 文件名 0~255中的某个数
文件名为C:\img 下的某个图片 ,可自行指定,需要带文件后缀(.jpg 等)
0~255 的某个数是指判断为黑白的阈值, 数值越大,判断为白色的方块越少
示例如下:
/Drawit demo.jpg 127
效果展示
挖坑
- 稍作修改,玩家可以在本地输入网上图片的url , 代码根据url临时下载到本地,然后后面的操作相同。
- 加入 8色 12色 36色等 ( 目前有bug ,库函数显示找不到带颜色的羊毛的对象,可能是版本的问题)