LoginSignup
3
0

More than 1 year has passed since last update.

クリスマスイブなのでハートをパーティクルで作りましょう!

Last updated at Posted at 2021-12-23

はじめに

皆さん!こんにちは!
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を使う方法

上記の方法だと一瞬でハートが出来てしまいます。
これだと折角のクリスマスイヴの雰囲気も台無しです。
せっかくなら下記の動画のようにロマンチックに演出してみましょう!

ゆっくり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をする際に使ってみてください!




私はロマンチックと縁がありませんので明日のゆこさんの記事を推しています。
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0