提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
360行目: 360行目:
  
 
:: ''[[新しいEventSystemの使い方]]を参照して下さい''
 
:: ''[[新しいEventSystemの使い方]]を参照して下さい''
 +
 +
Minecraft1.1向けのBukkit API以降、新しいイベントの仕組みが提供されています。<BR />
 +
この新しい仕組みは、シンプルでかつ、汎用性・高速性・可読性等に優れています。<BR />
 +
 +
=== チュートリアル ===
 +
当項目の、翻訳元記事で紹介されている動画を参照して下さい。<BR />
 +
http://wiki.bukkit.org/Introduction_to_the_New_Event_System#Video_Tutorial
 +
 +
=== 基礎 ===
 +
 +
PlayerLoginEventについて説明します。<BR />
 +
このイベントは最低限動作するための処理のみを記述するよう心がけ、<BR />
 +
極力シンプルに保ちつつ編集していきましょう。
 +
 +
==== イベントリスナ ====
 +
まず、イベントを待ち受ける処理(Event Listenerと呼ばれます)が必要です:
 +
<blockquote><source lang="java">public void onPlayerLogin(PlayerLoginEvent event) {
 +
    // Your code here...
 +
}</source></blockquote>
 +
次に、発生するイベント(Event Handlerと呼ばれます)が必要になります。
 +
 +
==== イベントハンドラ ====
 +
イベントハンドラはイベントリスナに対する注釈であり、次のような書き方をします:
 +
<blockquote><source lang="java">@EventHandler // EventPriority.NORMAL がデフォルト値</source></blockquote>
 +
この記述は、メソッドがイベント優先度がNORMALのイベントハンドラである事を指定します。
 +
 +
イベントハンドラには優先度を指定でき、次のような書き方をします:
 +
<blockquote><source lang="java">@EventHandler(priority = EventPriority.HIGHEST) // 高優先度のイベントとする
 +
@EventHandler(priority = EventPriority.LOW) // 低優先度のイベントとする</source></blockquote>
 +
 +
以上をまとめると、次のようになります:
 +
<blockquote><source lang="java">@EventHandler
 +
public void onPlayerLogin(PlayerLoginEvent event) {
 +
    // Your code here...
 +
}</source></blockquote>
 +
 +
==== リスナの追加 ====
 +
"PlayerListener"として拡張する場合は、"Listener"インタフェースを実装する必要があります。<BR />
 +
この時点では、次のような形のメソッドになりそうです:
 +
<blockquote><source lang="java">public class myPlayerListener implements Listener {
 +
    @EventHandler
 +
    public void onPlayerLogin(PlayerLoginEvent event) {
 +
        // Your code here...
 +
    }
 +
}</source></blockquote>
 +
 +
リスナ内部のメソッドは任意の名前を付けて呼び出する事が可能であり、<BR />
 +
"onPlayerLogin()"のような、メソッドの名称が重要ではない事に言及しておきましょう。<BR />
 +
「Bukkitは、どのEventを識別可能でどうやってListenするのか?」と不思議に思うかもしれませんが・・・<BR />
 +
Bukkitは、あなたが指定したイベントからそれら(識別可能なEventと、そのListenの方法)を読み込みます。<BR />
 +
上記の例で言えば、PlayerLoginEventから読み込みます。
 +
 +
:'''Note''': 特定のイベントまたはBukkitが登録しないイベントに関しては、手動で指定しなければなりません。(訳が不適切か)
 +
 +
==== イベントハンドラの設定 ====
 +
イベントハンドラには、様々な内容を指定可能です。<BR />
 +
現時点では次のような指定が行えます:
 +
<blockquote>
 +
{| class="wikitable"
 +
|型
 +
|項目名
 +
|デフォルト値
 +
|概要
 +
|指定できる値
 +
|-
 +
|EventPriority
 +
|priority
 +
|EventPriority.NORMAL
 +
|リスナに指定する優先度。
 +
|
 +
* EventPriority.MONITOR
 +
* EventPriority.HIGHEST
 +
* EventPriority.HIGH
 +
* EventPriority.NORMAL
 +
* EventPriority.LOW
 +
* EventPriority.LOWEST
 +
|-
 +
|boolean
 +
|ignoreCancelled
 +
|false
 +
|この値にTrueを指定したメソッド場合は、イベントがキャンセルされた際にイベントを受け付けない。
 +
|
 +
* true
 +
* false
 +
|}
 +
</blockquote>
 +
 +
=== イベントの登録 ===
 +
イベントを記述するクラスは、<BR />
 +
Listenerインタフェースを実装(implements)し、かつイベントハンドラを含んでいなければなりません。
 +
 +
<blockquote><source lang="java">import org.bukkit.event.Listener;
 +
 +
public class LoginListener implements Listener {
 +
}</source></blockquote>
 +
 +
イベントの登録処理は、PluginManagerインスタンスのregisterEventsメソッドとして、プラグインとリスナに記述します。
 +
<blockquote><source lang="java">getServer().getPluginManager().registerEvents(Listener, Plugin);</source></blockquote>
 +
 +
==== リスナの例 ====
 +
このリスナは、2つのイベントハンドラを含んでいます。<BR />
 +
1つは高優先度のもの、もうひとつは通常の優先度のものです。
 +
<blockquote><source lang="java">import org.bukkit.event.Listener;
 +
import org.bukkit.event.EventHandler;
 +
import org.bukkit.event.EventPriority;
 +
import org.bukkit.event.player.PlayerLoginEvent;
 +
 +
public class LoginListener implements Listener {
 +
    @EventHandler
 +
    public void normalLogin(PlayerLoginEvent event) {
 +
        // 何かの処理
 +
    }
 +
 +
    @EventHandler(priority = EventPriority.HIGH)
 +
    public void highLogin(PlayerLoginEvent event) {
 +
        // 何かの処理
 +
    }
 +
}</source></blockquote>
 +
 +
==== プラグインへのイベントの登録 ====
 +
イベントの登録処理は、リスナとプラグインが必要です。<BR />
 +
丁度よい事に、既にLoginListenerを作成していますので、これを利用してLoginPluginを作りましょう!
 +
<blockquote><source lang="java">import org.bukkit.plugin.java.JavaPlugin;
 +
 +
public class LoginPlugin extends JavaPlugin {
 +
    public void onEnable() {
 +
        getServer().getPluginManager().registerEvents(new LoginListener(), this);
 +
    }
 +
}</source></blockquote>
 +
 +
==== プラグインへのイベントのリスナとしての登録 ====
 +
 +
メインとなるクラスもイベントを持つ事ができます。<BR />
 +
例:
 +
 +
<blockquote><source lang="java">import org.bukkit.plugin.java.JavaPlugin;
 +
import org.bukkit.event.Listener;
 +
import org.bukkit.event.EventHandler;
 +
import org.bukkit.event.player.PlayerLoginEvent;
 +
 +
public class LoginPlugin extends JavaPlugin implements Listener {
 +
    public void onEnable() {
 +
        getServer().getPluginManager().registerEvents(this, this);
 +
    }
 +
 +
    @EventHandler
 +
    public void normalLogin(PlayerLoginEvent event) {
 +
        // 何かの処理
 +
    }
 +
}</source></blockquote>
 +
 +
==== リスナへのイベントの登録 ====
 +
イベントの登録には複数の方法があります。リスナクラスでイベントを登録する例を記述します。
 +
<blockquote><source lang="java">import org.bukkit.event.Listener;
 +
import org.bukkit.event.EventHandler;
 +
import org.bukkit.event.EventPriority;
 +
import org.bukkit.event.player.PlayerLoginEvent;
 +
 +
public class LoginListener implements Listener {
 +
    public LoginListener(LoginPlugin plugin) {
 +
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
 +
    }
 +
 +
    @EventHandler
 +
    public void normalLogin(PlayerLoginEvent event) {
 +
        // Some code here
 +
    }
 +
 +
    @EventHandler(priority = EventPriority.HIGH)
 +
    public void highLogin(PlayerLoginEvent event) {
 +
        // Some code here
 +
    }
 +
}</source></blockquote>
 +
 +
LoginPluginは次のようになります:
 +
<blockquote><source lang="java">import org.bukkit.plugin.java.JavaPlugin;
 +
 +
public class LoginPlugin extends JavaPlugin {
 +
    public void onEnable() {
 +
        new LoginListener(this);
 +
    }
 +
}</source></blockquote>
 +
 +
=== イベントの自作 ===
 +
Bukkit自体が利用しているイベント記述の仕組みと全く同一の仕組みを利用して、
 +
イベントを自作する事ができます。
 +
この方法は、従来のような、
 +
自作イベントである事に起因する固有のチェックが不要な点、
 +
Bukkitの処理方法をそのまま利用するためにパフォーマンスを犠牲にしないという点で、
 +
従来のイベント自作の方法よりも優れています。
 +
 +
イベントを自作する際は、次の2点に留意して下さい。
 +
:* Eventクラスを継承する必要がある
 +
:* static(静的)なハンドラとして作成する必要がある
 +
 +
staticハンドラは、自作イベント中に次のように記述して下さい。
 +
<blockquote><source lang="java">private static final HandlerList handlers = new HandlerList();
 +
 +
public HandlerList getHandlers() {
 +
    return handlers;
 +
}
 +
 +
public static HandlerList getHandlerList() {
 +
    return handlers;
 +
}</source></blockquote>
 +
 +
上記のコードを実際に自作のイベント処理の中に記述する事で、
 +
処理は疎結合となり、実行速度が改善します。
 +
 +
==== 自作イベントの例 ====
 +
<blockquote><source lang="java">import org.bukkit.event.Event;
 +
import org.bukkit.event.HandlerList;
 +
 +
public class CustomEvent extends Event {
 +
    private static final HandlerList handlers = new HandlerList();
 +
    private String message;
 +
 +
    public CustomEvent(String example) {
 +
        message = example;
 +
    }
 +
 +
    public String getMessage() {
 +
        return message;
 +
    }
 +
 +
    public HandlerList getHandlers() {
 +
        return handlers;
 +
    }
 +
 +
    public static HandlerList getHandlerList() {
 +
        return handlers;
 +
    }
 +
}</source></blockquote>
 +
 +
==== 自作イベントの呼び出し ====
 +
 +
イベントの呼び出し方法は、従来の方法と同様です:
 +
 +
<blockquote><source lang="java">// イベントのインスタンス化
 +
CustomEvent event = new CustomEvent("Sample Message");
 +
// イベントの実行
 +
Bukkit.getServer().getPluginManager().callEvent(event);
 +
// イベントから得たメッセージの出力処理
 +
Bukkit.getServer().broadcastMessage(event.getMessage());</source></blockquote>
 +
 +
==== 自作イベントの待ち受け ====
 +
イベントはどのようにListen(待受,受付などとも表記)すれば良いでしょう?
 +
簡単です。通常のイベントと同様に待ち受けして下さい。
 +
<blockquote><source lang="java">import org.bukkit.event.Listener;
 +
import org.bukkit.event.EventHandler;
 +
 +
public class CustomListener implements Listener {
 +
    @EventHandler
 +
    public void normalLogin(CustomEvent event) {
 +
        // 何かの処理
 +
    }
 +
}</source></blockquote>
  
 
== コマンド ==
 
== コマンド ==

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート: