取得するとレベルアップするアイテムなどを作ります.
import ac.hiu.j314.elmve.*; import ac.hiu.j314.vesma.*; public class Item extends VesmaObject implements NeverSave { protected void init() { super.init(); a3UI = "x-res:///item.a3"; } public void touched(Order o) { ElmStub e = o.getSender(); send(makeOrder(e,"levelUp",NULL)); send(makeOrder(e,"hear","レベルアップ!\n")); send(makeMyOrder("dispose",NULL),2000); } }
ヘナチョコですが,以下のa3ファイルを使って下さい.
アイテムや敵(kappa)を自動的に生成するオブジェクトを作ります. a3ファイルには以下のstrangeHole.a3を使用して下さい.
import ac.hiu.j314.elmve.*; import ac.hiu.j314.vesma.*; public class StrangeHole extends VesmaObject { int counter = 0; protected void init() { super.init(); a3UI = "x-res:///strangeHole.a3"; } public void generate(Order o) { if (Math.random()>0.3) makeKappa(); else makeItem(); send(makeOrder("generate",NULL),10000); } protected void makeKappa() { makeElm("Character","c"+counter); Place p = new Place(20.0*Math.random()-10.0, 20.0*Math.random()-10.0, 0.0); ElmStub elm = getElm("c"+counter); send(makeOrder(elm,"setPlace",p)); send(makeOrder(elm,"method4",NULL)); counter++; } protected void makeItem() { makeElm("Item","c"+counter); Place p = new Place(20.0*Math.random()-10.0, 20.0*Math.random()-10.0, 0.0); ElmStub elm = getElm("c"+counter); send(makeOrder(elm,"setPlace",p)); counter++; } }
スペースキーで,攻撃するようにクライアントを改良します.
import ac.hiu.j314.elmve.*; import ac.hiu.j314.vesma.*; import java.awt.event.*; public class Game extends Vesma3d { public void processKeyPressed(KeyEvent e) { try { if (e.getKeyCode()==KeyEvent.VK_SPACE) { processCommand("attack &"); System.out.println("attack!"); } else { super.processKeyPressed(e); } } catch (Exception ee) { ee.printStackTrace(); } } }
上のクライアントを実行するには,VESMAを起動した時に一番最初に 現れるVesmaLauncherウィンドウの[Client Class:]欄にGameと入力 してから「OK」ボタンを押して下さい.
GAvatarクラスに以下のメソッドを追加して下さい.
public void levelUp(Order o) { level++; strength++; hitPoint = level*10; } public void goNorth(Order o) { if (deadFlag) return; super.goNorth(o); } public void goSouth(Order o) { if (deadFlag) return; super.goSouth(o); } public void goWest(Order o) { if (deadFlag) return; super.goWest(o); } public void goEast(Order o) { if (deadFlag) return; super.goEast(o); }
Characterクラスに以下の変更・追加をして下さい. 最初の一行は,すでに書いてある行ですが,下線の部分を 追加して下さい.
public class Character extends VesmaAgent implements NeverSave { ^^^^^^^^^^^^^^^^^^^^ <--加える public void method4(Order o) { if (deadFlag) return; ElmStub e = getElm("@ac.hiu.j314.elmve.ElmAvatar"); Request r = makeRequest(e,"getPlace",NULL); receive(r,"method5",NULL); send(r); } public void method5(ReplySet rs) { Place avatarPlace = rs.getPlace(0,0); Place myPlace = getPlace(); Place tmp = new Place(); tmp.sub(avatarPlace,myPlace); tmp.scale(0.03); myPlace.add(tmp); setPlace(myPlace); if (tmp.distance(new Place()) < 0.1) if (Math.random()<0.2) send(makeOrder("attack",NULL)); repaint(); send(makeOrder("method4",NULL),200); }
動作確認には,以下のようなコマンドを使用します.
cct StrangeHole touch hole ##hole generate &
へなちょこなので,色々改造してみて下さい.