訪問していただき、ありがとうございます。
今、Illustratorスクリプトの基礎的な文法や構造を学習しているが
・学習に飽きていた
・作りたいスクリプトが無い
・難しくて挫折しそう
こんな悩みを抱いている人向け用に楽しく学べるスクリプトを作成しました。
Profile
この記事を書いている私は、DTPデザイナーとしてIllustratorの操作経験が15年以上あり、スクリプトも自分の業務で必要になったものを自ら作成し、デザイン作業の効率化を図っています。
最近では、当ブログでも自作スクリプトを公開しています。
本記事は、第1章でスクリプトの要点などを解説し、第2章でスクリプトのコードを公開しています。
ぜひ、公開しているスクリプトコードを参考に、ご自身でコードを書いてみてスクリプトの開発を体験してください
それでは、どうぞお楽しみください。
【ターンバトル】スクリプトの解説
【ターンバトル(ファイル名:turn_battle)】は、僕がJavaScriptベースに自作したIllustrator用のスクリプトです。
まず、この章でスクリプトのポイントや使い方について解説します。
※読み飛ばしてもOK
【ターンバトル】スクリプトのポイント
今回のスクリプトは、Illustratorの機能を活用してロールプレイングで、よくある「ターンバトル風」のゲームが楽しめるスクリプトです。
ゲームの操作方法
ウインドウに表示されている【戦う】と【逃げる】のどちらかのボタンを選んでクリックすることでゲームが進行します。
ゲームルール
・プレイヤーと対戦相手(モンスター)が順番に行動して先に体力が尽きたほうが負けです。
あなたはモンスターに勝てるでしょうか?
【ターンバトル】スクリプトの入手
本記事で作成するスクリプトのプラグラムは、下記よりDLできます。
下記リンクからスクリプトをダウンロード
DL:turn_battle.jsx
【ターンバトル】のスタート
Illustratorから【turn_battle.jsx】を起動させることでゲームがスタートします。
ちなみに、【スクリプトの使い方や作り方】を詳しく知りたい方は、【Illustratorの作業効率が上がる!【スクリプト】の使い方と作り方】の記事を参考にしてください。
【ターンバトル】スクリプトコード
前章では【ターンバトル】スクリプトのポイントついて解説しました。
この章では、【ターンバトル】スクリプトのコードを公開します。
コードにコメントアウトも書いてありますので、カスタマイズする際の参考にしてください。
var docObj = documents.add(DocumentColorSpace.CMYK,595.28,500.95);//新規ドキュメント作成
app.coordinateSystem=CoordinateSystem.ARTBOARDCOORDINATESYSTEM; //座標値をアートボード基準
var CRCODE = String.fromCharCode(13);//改行
var actDoc = activeDocument;//アクティブドキュメント指定
var enemy = Math.floor (Math.random() * 200) + 50;//モンスターのHP
var myName = 'ロト';
var myLife = 100; //自分のHP
var yellow = myLife * 0.5;//イエローライン表示用
var red = myLife * 0.25;//レッドーライン表示用
var win = new Window ('dialog', 'モンスターが現れた', [500,500,710,600]);//ウインドウパネル のモンスターが現れた!
win.add ("statictext", [40,20,180,30], '戦いますか?');//このモンスターと戦いますか?
var btnOK = win.add("button",[15,50,100,80],"戦う",{name:'YES'});//OK枠
var btnCancel = win.add("button",[105,50,190,80],"逃げる",{name:'cancel'});//CANCEL枠
win.onShow =function(){ //.onShow:ウィンドウが表示される時に発生するイベント
base();
app.redraw();//画面表示を再描画
//app.undo();//画面表示を再描画
}
//逃げるボタンの処理ここから
btnCancel.onClick = function (){
var lost = Math.floor (Math.random() * 3);
// textLayer();//関数 レイヤーを作成
if(lost === 1){
battleMess('モンスターから逃げれた');//モンスターから逃げれた
win.close(); //パネル外枠閉じる
}else{
battleMess ('モンスターから逃げられない');//モンスターから逃げられない
};//else
app.redraw();//画面表示を再描画
};
//逃げるボタンの処理ここまで
//戦うボタンの処理ここから
btnOK.onClick = function(){
//textLayer(); //関数 レイヤーを作成
var attack = Math.floor (Math.random() * 30) + 5;
if(critical(attack) === 45 ||critical(attack) === 90){
battleMess(myName + 'は、モンスターへクリティカル攻撃' + " " + critical(attack));//クリティカル!!!!
}else{
battleMess(myName + 'は、モンスターへ' + " " +critical(attack) + 'ダメージを与えた');
};
enemy = enemy - critical(attack);
if(enemy <= 0){
$.sleep(500);
battleMess('モンスターを倒した');//モンスターを倒した
blindfold();
win.close(); //パネル外枠閉じる
}else{
$.sleep(2000);
var reAttack = Math.floor (Math.random() * 20) + 1;
battleMess('モンスターから' + " " + reAttack +'のダメージを受た');
myLife = myLife - reAttack ;
statusMess(myLife)
caveat();
if(myLife <= 0){
$.sleep(500);
battleMess(myName + 'は気絶してしまった......');//モンスターに倒された
win.close(); //パネル外枠閉じる
};
};
app.redraw();//画面表示を再描画
//app.undo();//画面表示を再描画
};
//戦うボタンの処理ここまで
//ベース背景 ここから
function base(){
//アートボード寸法計算 ここから
var rect = actDoc.artboards[0].artboardRect;
var left = rect[0];
var top = rect[1];
var right = rect[2];
var bottom = rect [3];
var width = (right - left) ; //アートボードの横サイズ
var height = (top - bottom) ; //アートボードの縦サイズ
//アートボード寸法計算 ここまで
//背景色ここから
var rectObj = actDoc.pathItems.rectangle(0,0,width,height); //四角形作成
rectObj.fillColor = setCMYKColor(0,0,0,100);//塗り 黒色
rectObj.stroked = false;//線なし
var baseLay = actDoc.layers['レイヤー 1'];//レイヤー1を指定
baseLay.name = '背景画面'; //名称変更
baseLay.locked = true; //レイヤーロック
//背景色ここまで
//モンスターここから
var monsterLay = actDoc.layers.add();//新規レイヤー作成
monsterLay.name = 'モンスター'; //レイヤー名
var siza = 3
for(i = 1 ; I <= 11 ; i++){
for(j = 1 ; j <=15 ; j++){
var rectObj = actDoc.pathItems.rectangle( zikuY(i),zikuX(j),siza,siza); //四角形作成
rectObj.fillColor = setCMYKColor(50,0,0,0);//塗り 黒色
rectObj.stroked = false;
rectObj.note = 'y' + i + 'x' + j;
};
};
//不要 削除 ここから
var todo = ['y1x1','y1x2','y1x3','y1x4','y1x5','y1x6','y1x7','y1x9','y1x10','y1x11','y1x12','y1x13','y1x14','y1x15',
'y2x1','y2x2','y2x3','y2x4','y2x5','y2x6','y2x10','y2x11','y2x12','y2x13','y2x14','y2x15',
'y3x1','y3x2','y3x3','y3x4','y3x5','y3x11','y3x12','y3x13','y3x14','y3x15',
'y4x1','y4x2','y4x3','y4x13','y4x14','y4x15',
'y5x1','y5x2','y5x14','y5x15',
'y6x1','y6x15',
'y7x6','y7x10',
'y9x1','y9x15',
'y10x1','y10x2','y10x14','y10x15',
'y11x1','y11x2','y11x3','y11x13','y11x14','y11x15',];
for(var i = 0; i < actDoc.pageItems.length; i++){
for (var j = 0 ; j < todo.length ; j++){
if(actDoc.pageItems[i].note === todo[j]){
try{
actDoc.pageItems[i].selected = true;
}catch(e){
alert ('選択でエラーが出ています。');
};//catch(e)
};
};
};
var selObj = actDoc.selection;
for(var i = 0; i < selObj.length; i++){
selObj[i].remove();
};
actDoc.selection = null;
//不要 削除 ここまで
//白色 ここから
var white = ['y3x6','y3x7','y4x4','y4x5','y5x3','y5x4','y6x6','y7x5','y7x7','y8x6','y7x9','y6x10','y7x11','y8x10',];
for(var i = 0; i < actDoc.pageItems.length; i++){
for (var j = 0 ; j < white.length ; j++){
if(actDoc.pageItems[i].note === white[j]){
try{
actDoc.pageItems[i].selected = true;
}catch(e){
alert ('選択でエラーが出ています。');
};//catch(e)
};
};
};
var selObj = actDoc.selection;
for(var i = 0; i < selObj.length; i++){
selObj[i].fillColor = setCMYKColor(0,0,0,0);
};
actDoc.selection = null;
//白色 ここまで
//オレンジ ここから
var orange = ['y9x5','y9x11','y10x6','y10x7','y10x8','y10x9','y10x10',];
for(var i = 0; i < actDoc.pageItems.length; i++){
for (var j = 0 ; j red && myLife <= yellow){//20より大きく かつ 50以下
for(var i = 0; i < actDoc.layers['フレーム'].pageItems.length; i++){
if(actDoc.layers['フレーム'].pageItems[i].note === '枠'){
try{
actDoc.layers['フレーム'].pageItems[i].selected = true;
}catch(e){
alert ('ライン選択でエラーが出ています。');
};//catch(e)
};//if
};//for
var selObj = actDoc.selection;
for(var i = 0; i < selObj.length; i++){
selObj[i].strokeColor = setCMYKColor(0,0,50,0);//線 黄色
};
app.executeMenuCommand("deselectall");//選択解除
var actLay02 = actDoc.layers['ステータス'];
actLay02.locked = false; //レイヤーロック解除
for(var i=0; i < actDoc.textFrames.length; i++){
try{
actDoc.textFrames[i].selected = true; //あれば選択
}catch(e){};
};
var selObj = actDoc.selection;
for(var i = 0; i < selObj.length; i++){
for(var j = 0; j < selObj[i].paragraphs.length; j++){
selObj[i].paragraphs[j].fillColor = setCMYKColor(0,0,50,0);
};
};
}else{
if(myLife >= 0 && myLife <= yellow){//0以上かつ30以下
for(var i = 0; i < actDoc.layers['フレーム'].pageItems.length; i++){
if(actDoc.layers['フレーム'].pageItems[i].note === '枠'){
try{
actDoc.layers['フレーム'].pageItems[i].selected = true;
}catch(e){
alert ('ライン選択でエラーが出ています。');
};
};
};
var selObj = actDoc.selection;
for(var i = 0; i < selObj.length; i++){
selObj[i].strokeColor = setCMYKColor(0,50,0,0);//線 赤色
};
app.executeMenuCommand("deselectall");//選択解除
for(var i=0; i < actDoc.textFrames.length; i++){
try{
actDoc.textFrames[i].selected = true; //あれば選択
}catch(e){};
};
var selObj = actDoc.selection;
for(var i = 0; i < selObj.length; i++){
for(var j = 0; j < selObj[i].paragraphs.length; j++){
selObj[i].paragraphs[j].fillColor = setCMYKColor(0,50,0,0);
};//for
};//for
};//if
};//else
app.executeMenuCommand("deselectall");//選択解除
};
//警告 ここまで
//ステータス値の変化ここから
function statusMess(aaa){
if(0 >= myLife){
myLife = 0;
};
for(var i=0; i < actDoc.layers['ステータス'].textFrames.length; i++){
if(actDoc.layers['ステータス'].textFrames[i].note === 'HP'){
actDoc.layers['ステータス'].textFrames[i].selected = true; //あれば選択
};
};
var selObj = actDoc.selection; //ドキュメント内の選択中のオブジェクト
for(var j=0; j < selObj.length; j++){
selObj[j].paragraphs[0].remove();//3段目の文字を削除
selObj[j].paragraphs.addBefore('HP:' + myLife);
};
}
//ステータス値の変化ここまで
//戦闘文字の作成ここから
function battleMess(text){
try{//戦闘文字のテキストフレームが存在する場合
if(actDoc.layers['戦闘文字'].textFrames.length === 2){//戦闘文字レイヤー内のテキストフレームを数える
for(var i = 0; i < actDoc.textFrames.length; i++){
if(actDoc.textFrames[i].note === '戦闘メッセージ'){ //属性に【戦闘メッセージ】があるか確認
actDoc.textFrames[i].selected = true; //あれば選択
};
};
try{
var selObj = actDoc.selection; //ドキュメント内の選択中のオブジェクト
for(var j = 0; j < selObj.length; j++){
selObj[j].paragraphs.addBefore (text);//テキストを段落前に追加
selObj[j].paragraphs[5].remove();//6段目の文字を削除
};
}catch(e){};
}else{//戦闘文字のテキストフレームが存在しない場合
var messArea = actDoc.pathItems.rectangle(-287.3,172.67,366.26,76.872);//四角形を作成
var txtObj = actDoc.textFrames.areaText(messArea);//四角形をエリアテキストに変換
txtObj.note = '戦闘メッセージ'//テキストフレームに属性を追加
var prObj = txtObj.paragraphs.add(text); //文字を入力
txtObj.paragraphs[0].fillColor = setCMYKColor(0,0,0,0); //段落の文字色
txtObj.paragraphs[0].autoLeading = false; //段落の行間を指定する
txtObj.paragraphs[0].leading = 16;//行間を16ptにセット
txtObj.paragraphs[0].size = 11;
};
} catch(e){//エラーの場合
alert ( 'メッセージでエラーが起きています');
};
app.executeMenuCommand("deselectall");//選択解除
};
//戦闘文字の作成ここまで
function blindfold(){
var layObj = app.activeDocument.layers['モンスター'];
app.activeDocument.activeLayer = layObj;
layObj.visible = false;
}
//クリティカル攻撃 ここから
function critical(text){
if(text % 3 === 0 && text % 5 === 0){
return (text * 3);//クリティカル
}else{
return text;
};
};
//クリティカル攻撃 ここまで
//win.center();//センター表示
win.show(); //ウインドウパネルの表示
免責事項
・このページで配布しているスクリプトを無断で転送・販売・配布することは禁止です。
・アプリケーションのバージョンアップの内容によって利用できなくなる場合がありますのでご了承ください。
・このスクリプトによって起きるいかなる不具合や損害も、責任を負いません。ご利用の際は自己責任にてお願いいたします。
というわけで、今回は以上です。
<楽しく学ぶ!ターンバトル風スクリプト制作 by Illustrator>を
最後まで読んでいただき有難う御座いました。
Illustratorスクリプトのおすすめ書籍!
また、以下の記事で今回紹介した書籍以外にもスクリプトに関する書籍を紹介しているので参考にしてください。