取得するとレベルアップするアイテムなどを作ります.
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 &
へなちょこなので,色々改造してみて下さい.