はじめに
皆さん!こんにちは!
1年は早いもので、気づけばもうクリスマスイブです!
クリスマスにちなんで今回はハート型にパーティクルを展開するコードをメモ程度に残しておこうと思います!
注意
筆者は時代の流行に追いついていないのでPocketMine-MP3を基準にしてこの記事を書いております。
ここに乗ってるコードを使用する際は、PocketMine-MP4の記述方法に変更してから実装してください。
それとこの時期はExplosionクラスも用意したほうがいいかも!
数式
ハートに描画する数式は以下のとおりです。
筆者は数学が死ぬほど嫌いなのでネットで探したりそれをscratchで試したりしてます。
x+size*sin(rad)^3*2
y+2+(size*cos(rad)-cos(rad)^4)*2
実装
実際にプラグインで実装してみます。
for ($i=0; $i<360; $i+=10) {
$pos = new Vector3($x+1*sin(deg2rad($i))**3*2, $y+2+(1*cos(deg2rad($i))-cos(deg2rad($i))**4)*2, $z);
$level->addParticle(new HeartParticle($pos));
}
Generatorを使う方法
上記の方法だと一瞬でハートが出来てしまいます。
これだと折角のクリスマスイヴの雰囲気も台無しです。
せっかくなら下記の動画のようにロマンチックに演出してみましょう!
あたらしいぷらぐいんのえいぞう pic.twitter.com/5FKA7oQT8F
— Yurisi (@Dev_yrs) May 18, 2020
ゆっくり1つずつパーティクルを出すにはSchedulerとGeneratorを利用します
Main.php
$func = function (int $x, int $y, int $z, Level $level) {
for ($i=0; $i<360; $i+=10) {
yield;
$level->addParticle(new HeartParticle(new Vector3($x+1*sin(deg2rad($i))**3*2, $y+2+(1*cos(deg2rad($i))-cos(deg2rad($i))**4)*2, $z)));
}
};
$this->getScheduler()->scheduleRepeatingTask(new HeartTask($func($player->getX(), $player->getY(), $player->getZ(), $player->getLevel())), 1);
EventGenerater.php
use pocketmine\scheduler\Task;
class EventGenerater extends Task {
private $generator;
public function __construct(\Generator $generator) {
$this->generator = $generator;
}
public function onRun(int $currentTick) {
if ($this->generator->valid()) {
$this->generator->next();
} else {
$this->getHandler()->cancel();
}
}
}
これでゆっくり出るようになったはずです!
おわりに
これでクリスマスイブにMinecraft内でロマンチックを演出することが出来ます!
ぜひ恋人同士なんかとMinecraftをする際に使ってみてください!
私はロマンチックと縁がありませんので明日のゆこさんの記事を推しています。