スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

妖かし憑狐(あやきつね)攻略講座:訓練内容、大会ランクリファレンス

どうも、みれいゆーです!
今日の内容は訓練内容と大会ランクの詳細について説明をしていきます!!

①訓練内容と効果

訓練には総計して、9種類あります(現在)。それぞれ休み以外は疲労しながら何かの現在能力を鍛える為にあります。一月に4項目を登録して実行させることができます。

では表にして説明しましょう!

訓練内容


↑ が訓練結果上昇、 ↓ が訓練結果減少です!


休みは全ての訓練結果を下げるのでなるべく休みは無い方がいいですね!ほどほどに!
訓練では、センスの伸びが大きいので伸ばしたい時はかなり伸ばすといいです!!!

②大会ランクについて
最初は皆Fランクから始まります。そしてある程度勝つといきなり参加できなくなり、代わりに上の大会に参加できるようになっています。
まずはアルファベットだけに絞って大会のランク説明をしていきましょう!!


F:最低ランク。信仰が少しでも増えると参加不可に
E:成齢にのみ存在。信仰のみの基準で、少し増えると参加不可に
D:中、成、壮齢のみ存在。初級参加者のメインランク
C:全齢に存在。最も参加者が多く、バリエーションも多い
B:中、成、壮齢に存在。ここから上位信仰者参加規制が無くなる。
A:ここから先は「決定戦」といえるランク。1優勝もしくは準優勝者が参加できる。(小齢を除く)、さらに4勝利が必要。
S:個人戦最高ランク。優勝と準優勝の総計が2必要。また8勝利が必要。
PB:優勝もしくは準優勝経験を必要としない簡単な団体戦。
PA:1優勝もしくは1準優勝が必要。また4勝利が必要
PS:最もポイントが高いランクで最高決戦。開かれたら奇跡。


また、アルファベットのランクに加え、今度は齢期の絞りがあります。
小・・・小齢のみが参加可
中・・・中齢のみが参加可
全・・・成齢と壮齢のみ参加可
壮・・・壮齢のみ参加可
総・・・全ての年齢、齢期で参加可


そして最後に形式の絞りがあります。
男・・・男性のみの大会
女・・・女性のみの大会
格・・・格術流派のみを使用できる大会
武・・・武術流派のみを使用できる大会
魔・・・魔術流派のみを使用できる大会


格、武、魔はそれに対応した流派を一つも持っていないと参加できません!!

尚、今期の大会を知りたい場合は、ロビー=>大会表をご覧下さい。

以上で訓練効果、大会ランクについて説明を終わります!
次回は流派についての簡易的な紹介を致します!!またーーー

1.7.0妖かし憑狐のリリース予告

妖かし憑狐
バージョン1.7.0がリリースされます!!

1.7.0時点で、1回妖かし憑狐の更新ラッシュを終了させていただきます。
・各種文字の色付け
・おはなしの正規化
・他細かいバグ修正
・ウィンドウが強制終了しないよう×ボタンを封じた

<既存のバグ>
・チーム戦でのグラフィックの挙動、ターゲット。
・仮想試合でデータを二個以上コンバートした場合、最上部のキャラになると落ちることがある

◇ これからのアップデート
・戦闘でのキャラグラフィック製作
・おはなしのセリフの追加
・立ち絵の修正、追加
・戦闘エフェクトの追加
・洋服美容の実装
・潜在開眼、若返り、秘密の実装
・個人評価調査の実装
・巫女、門家転籍の実装
・新聞の実装

これらは、時期を見ながら、追加していきます。まずは1.7.0時点で一作目の更新ラッシュは終了となります。
治せる未知のバグはすぐ修正していきます。

以上。他の機能の要望も受け付けています。


次作品もDxruby で作ろうかと考えておりますのでご期待を!!

Dxruby談:サイドビュー自動戦闘システムの紹介その弐(オブジェクト使用版) + 小物 #Advent Calender 用記事

前回の続きです。前回はオブジェクト指向なしに、動きだけをっ再現してみました。
それはいいのですが、やはりコードとして見ると、見づらすぎるという方がいらっしゃいます。
Ruby を初めて4ヶ月なのですが、ここに来て自分のコーティングを完璧に改めることになりそうです・・・!


今回の記事はDxruby #Advent Calender 用記事となっております。
前回はそう、DXRuby開発者、 mirichiさんの「DXRuby機能リクエストにお答えする」でした!!
特に私にはマイナーすぎてまずちんぷんかんぷんです!でもいずれそんな機能達にもうまくふれあいたいですね・・・

前回の記事もあります! http://mirenoteu.blog.fc2.com/blog-entry-40.html

上を見て、そして今回を見るとまず「成長したなー」と感じる人と「低レベルだなー」と思う方といらっしゃるかも知れませんw

ではでは、オブジェクト指向ばりのコードを用いたやり方で記述しましょう。
まずは結果論として、コードを載せました。




#クラスをよく理解していない例。module Flamework に playerが管理しきれて
#ダメージモーションが変な人にある。つまりターゲットにキャラが向かわない。

#! ruby -Ku
require 'dxruby'

#グローバル変数の定義
$turn = 0

#メンバー変数の為のクラス定義
class Person
def initialize(side,mem)
@side = side
@mem = mem
end

def side
@side
end

def mem
@mem
end

end

#インクルード用モジュールの定義
module Flamework

def self.description # モジュールメソッドの定義
"戦闘フレームワーク"
end

#initは初回動作用
def init
#変数群

@@font3 = Font.new( 15,'HGP行書体') #フォントの定義

@@b_x = [[100,100,100,100],[540,540,540,540]] #表示X始点座標 を、4*2箱作る。
@@b_y = [[100,160,220,280],[100,160,220,280]] #表示Y始点座標 を、4*2箱作る。

@@b_sx = [[100,100,100,100],[540,540,540,540]] #表示X始点座標 を、4*2箱作る。
@@b_sy = [[100,160,220,280],[100,160,220,280]] #表示Y始点座標 を、4*2箱作る。


@@image = Image.loadTiles('mireiyu.png', 3,10) #画像のリンク。ここでは横が3個分、縦が10個分と認識する。
@@b_motion = [[0,0,0,0],[0,0,0,0]]
@@b_motioned = [[0,0,0,0],[0,0,0,0]]

@@b_wtime = [[0,0,0,0],[0,0,0,0]]
@@b_doskill = [[0,0,0,0],[0,0,0,0]]

@@b_time = [[0,0,0,0],[0,0,0,0]] #コマ送りの時間 を、4*2箱作る。
@@b_stats = [[0,0,0,0],[0,0,0,0]]
@@b_speed = [[5,10,15,20],[25,30,35,40]]

@@b_attack = [[10,20,30,40],[10,20,30,40]]
@@b_hp = [[300,200,400,100],[300,200,400,100]]
@@b_shp = [[300,200,400,100],[300,200,400,100]]
@@b_target = [[0,0,0,0],[0,0,0,0]]
@@b_id = [[0,1,2,3],[0,1,2,3]]

end
#変数群

#アクションインスタンスを定義
#ターン処理をするもの

def action

if @@b_doskill[self.side].all?{|a| a == 0 } && @@b_doskill[1 - self.side].all?{|b| b == 0 } #誰もが移動行動を取らなければ実行する条件
@@b_stats[self.side][self.mem] += @@b_speed[self.side][self.mem]
@@b_stats[self.side][self.mem] = @@b_stats[self.side][self.mem].floor
end

ok = 0
ok = 1 if @@b_stats[self.side][self.mem] >= 400
if ok != 1
@@b_motion[self.side][self.mem] = 0

elsif ok == 1

case @@b_wtime[self.side][self.mem]
when 0

@@b_doskill[self.side][self.mem] = 2
@@b_target[self.side][self.mem] = @@b_hp[1 - self.side].index(@@b_hp[1 - self.side].select{|c| c > 0}.sample)
@@b_wtime[self.side][self.mem] = 79 if @@b_target[self.side][self.mem] == nil

when 20..39

@@b_x[self.side][self.mem] += 20 if self.side == 0 && @@b_x[self.side][self.mem] <= @@b_x[1 - self.side][self.mem]
@@b_x[self.side][self.mem] -= 20 if self.side == 1 && @@b_x[self.side][self.mem] >= @@b_x[1 - self.side][self.mem]

@@b_y[self.side][self.mem] += 20 if @@b_y[self.side][self.mem] <= @@b_y[1 - self.side][@@b_target[self.side][self.mem]]
@@b_y[self.side][self.mem] -= 20 if @@b_y[self.side][self.mem] <= @@b_y[1 - self.side][@@b_target[self.side][self.mem]]


@@b_motion[self.side][self.mem] = 1

when 40..58

@@b_x[self.side][self.mem] += 20 if self.side == 0 && @@b_x[self.side][self.mem] <= @@b_x[1 - self.side][self.mem]
@@b_x[self.side][self.mem] -= 20 if self.side == 1 && @@b_x[self.side][self.mem] >= @@b_x[1 - self.side][self.mem]

@@b_y[self.side][self.mem] += 20 if @@b_y[self.side][self.mem] <= @@b_y[1 - self.side][@@b_target[self.side][self.mem]]
@@b_y[self.side][self.mem] -= 20 if @@b_y[self.side][self.mem] <= @@b_y[1 - self.side][@@b_target[self.side][self.mem]]

@@b_motion[self.side][self.mem] = 1

when 59

@@b_hp[1 - self.side][@@b_target[self.side][self.mem]] -= @@b_attack[self.side][self.mem]
@@b_motion[1 - self.side][@@b_target[self.side][self.mem]] = 2

when 60..79

@@b_x[self.side][self.mem] += -40 if self.side == 0 && @@b_x[self.side][self.mem] >= @@b_sx[self.side][self.mem]
@@b_x[self.side][self.mem] -= -40 if self.side == 1 && @@b_x[self.side][self.mem] <= @@b_sx[self.side][self.mem]

@@b_y[self.side][self.mem] += 20 if @@b_y[self.side][self.mem] <= @@b_sy[self.side][self.mem]
@@b_y[self.side][self.mem] -= 20 if @@b_y[self.side][self.mem] <= @@b_sy[self.side][self.mem]

@@b_motion[self.side][self.mem] = 1

when 80

@@b_doskill[self.side][self.mem] = 0
@@b_motion[self.side][self.mem] = 0
@@b_motion[1 - self.side][@@b_target[self.side][self.mem]] = 0 #敵のモーションも戻してあげる
@@b_wtime[self.side][self.mem] = -1
@@b_stats[self.side][self.mem] = -100
end
@@b_wtime[self.side][self.mem] += 1
end

$turn += 1 if @@b_doskill[self.side][self.mem] == 0 #ターンは、プレイヤーの行動順番を決める。
$turn = 0 if $turn == @@b_time.flatten.length #一周して戻す
end

#描写。action とわけないと何者かの移動発生中に描写が起こらない。
def render

#画面外対策
@@b_time[self.side][self.mem] = 0 if @@b_motioned[self.side][self.mem] != @@b_motion[self.side][self.mem]
@@b_x[self.side][self.mem] = 0 if @@b_x[self.side][self.mem] < 0
@@b_x[self.side][self.mem] = 640 if @@b_x[self.side][self.mem] > 640

#モーションタイムリセット
@@b_time[self.side][self.mem] = 0 if @@b_motion[self.side][self.mem] != @@b_motioned[self.side][self.mem]
#死亡画像を起こすために常にモーション画像固定
@@b_motion[self.side][self.mem] = 3 if @@b_hp[self.side][self.mem] <= 0
#モーション画像の設定
imagenum = 0
imagenum = 0 if @@b_motion[self.side][self.mem] >= 0 && @@b_motion[self.side][self.mem] <= 0
imagenum = 3 if @@b_motion[self.side][self.mem] >= 1 && @@b_motion[self.side][self.mem] <= 1
imagenum = 6 if @@b_motion[self.side][self.mem] >= 2 && @@b_motion[self.side][self.mem] <= 2
imagenum = 9 if @@b_motion[self.side][self.mem] >= 3 && @@b_motion[self.side][self.mem] <= 3

case @@b_time[self.side][self.mem]
when 120..999
@@b_time[self.side][self.mem] = 0
Window.draw_scale(self.side == 0 ? @@b_x[self.side][self.mem] - 32 : @@b_x[self.side][self.mem], @@b_y[self.side][self.mem], @@image[imagenum] ,self.side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
when 90..119
Window.draw_scale(self.side == 0 ? @@b_x[self.side][self.mem] - 32 : @@b_x[self.side][self.mem], @@b_y[self.side][self.mem], @@image[imagenum] ,self.side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@@b_time[self.side][self.mem] += 2

when 60..89
Window.draw_scale(self.side == 0 ? @@b_x[self.side][self.mem] - 32 : @@b_x[self.side][self.mem], @@b_y[self.side][self.mem], @@image[imagenum + 1] ,self.side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@@b_time[self.side][self.mem] += 2

when 30..59
Window.draw_scale(self.side == 0 ? @@b_x[self.side][self.mem] - 32 : @@b_x[self.side][self.mem], @@b_y[self.side][self.mem], @@image[imagenum + 2] ,self.side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@@b_time[self.side][self.mem] += 2

when 0..29
Window.draw_scale(self.side == 0 ? @@b_x[self.side][self.mem] - 32 : @@b_x[self.side][self.mem], @@b_y[self.side][self.mem], @@image[imagenum + 1] ,self.side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@@b_time[self.side][self.mem] += 2
end

@@b_time[self.side][self.mem] += 1
Window.draw_font(self.side * 200 + 20 , self.mem * 20 + 400 ,"400:" + @@b_stats[self.side][self.mem].to_s + "/" + @@b_speed[self.side][self.mem].to_s , @@font3, hash={color: [122,255,122]})

Window.draw_font(self.side * 200 + 100 , self.mem * 20 + 400 ,"400:" + @@b_hp[self.side][self.mem].to_s + "/" + @@b_shp[self.side][self.mem].to_s , @@font3, hash={color: [255,122,122]})
end
end

#チーム所属とエントリー番号を持つ人のクラス定義
class PersonInBattle < Person #Personで定義したものの継承
include Flamework # Flameworkモジュールを読み込む
def initialize(side,mem)
super(side,mem) #Personで定義したものの継承
end
end

#今回は4対4を再現する。新しいプレイヤーの定義
#()内の意味=>チーム所属:エントリー

player1 = PersonInBattle.new(0,0)
player2 = PersonInBattle.new(0,1)
player3 = PersonInBattle.new(0,2)
player4 = PersonInBattle.new(0,3)

player9 = PersonInBattle.new(1,0)
player10 = PersonInBattle.new(1,1)
player11 = PersonInBattle.new(1,2)
player12 = PersonInBattle.new(1,3)

#初回定義
player1.init
player2.init
player3.init
player4.init
player9.init
player10.init
player11.init
player12.init

Window.loop do #ループを起こす為の記述
#タイムラインシステム
#行動システム
#ミスクシステム
case $turn #順番ごとに実行する。直列動作を起こせる。
when 0 then player1.action
when 1 then player2.action
when 2 then player3.action
when 3 then player4.action
when 4 then player9.action
when 5 then player10.action
when 6 then player11.action
when 7 then player12.action
end
#表示システムは並列。
player1.render
player2.render
player3.render
player4.render
player9.render
player10.render
player11.render
player12.render

end

#さあ、実行!!


team_sample.png

http://pastebin.com/wDUEb05x

これは、クラスオブジェクト初心者のみれいゆーが、なんとかかんとかで使った場合のコードとなります。
できることは、起動すればまた分かるのですが
・4対4の擬似対戦
・体力を削り合う対戦をランダムターゲットで行う
・体力を失った敵は倒れ、ターゲットにされなくなる


ここまで出来ることが出来ました。

(かわいそうなことに)このコードを書く上で初めてクラス変数 @@ の意義を知りました・・・wインスタンス変数@ とも使い分けが重要なのですね!

今回、冗長な事に 各player の action だけを直列処理で実行したくて、 $turn なる変数を使ったりもしました。

また、コードにはあるのに
・敵のダメージモーションが変な人にある
・つまりターゲットの方向に動いていない
等の問題がまだあります。


こう作っていくと、上級者のコードはものすごくエレガントで、奥が深いと改めて感じます。
このチーム戦サイドビューはすでに私の処女作にも使われていて、そこではしっかりターゲットを狙うよう機能しております!!

今回題目にしたサイドビュー自動戦闘システムの他にも私は二個作品を作ってみました。いずれもDXRubyの勉強がてら作ったものです。

①:DXRuby 1.5devより追加されたIME機能とSpriteの組み合わせ
http://pastebin.com/kdq6fb5V
imput_sample.png
②:3つのクラスをそれぞれ操作して拡張、色変更、移動する。(本当は一部同期をしたかった)
http://pastebin.com/XTf9ex9y
class_sample.png

では、次回は、wannabe53 さんの DXRuby を Wine から使う ですーー
私の記事の前も後ろもすごい人ばかり!頑張らなくちゃ!!ではまたーー

Dxruby談:サイドビュー自動戦闘システムの紹介その壱(オブジェクト未使用版)

今日は珍しく、プログラミングの内容となりますっ・・・
なぜこれを起稿したかと言うと、そもそも私の使っているゲーム製作言語がRuby、ましてや Dxruby を使っていて、それが全くちんぷんかんぷんな方が多く、敷居が高すぎるからです。

そこで今日は一例として、「Dxruby でこんななことできるよー」的に話を進めていきます。

※コードを利用される方へ、残念ならがコードは全てのインデントが外れているかと思います。
ですので整形してからお使い下さい。

最後のものだけPastebinでのリンクを貼りましたのでお使い下さい。

①まず1対1を作ろう。

A:用意するもの

・一枚のテキストファイル
・簡単なコマ送りする画像

・一枚のテキストファイルの名前は main.rbとでもします。(.rbが拡張子)

B:まずは一人のコマ送りの画像を表示させよう

用意される画像は、このようなものです。
base1.png
この画像の、一番から三番までのキャラクタをコマ送りで表示させるとします。
まず考える事は
 ・1回に描写する大きさは 32*32 (正方形) にする
 ・一番目、二番目、三番目と順に画像を表示する為に表示範囲をずらす
 ・繰り返し処理をつけて常に画像を循環させる。
以下をまとめたコードは次のように書けます。


#! ruby -Ku
require "kconv"
require_relative "dxruby"
#これを実行でゲームスタート

@b_time = 0 #コマ送りの時間
@b_x = 100 #表示X始点座標
@b_y = 100 #表示y始点座標
@image = Image.loadTiles('chara/battle/base/base1.png', 3,10) #画像のリンク。ここでは横が3個分、縦が10個分と認識する。

Window.loop do #ループを起こす為の記述

if @b_time >= 120
@b_time = 0 #最初に戻る
Window.draw(@b_x, @b_y, @image[0] ) #一番左上の画像表示
elsif @b_time <= 119 and @b_time >= 90
Window.draw(@b_x, @b_y, @image[0] ) #一番左上の画像表示
@b_time += 2

elsif @b_time <= 89 and @b_time >= 60
Window.draw(@b_x, @b_y, @image[1] ) #一番左上から横に一個分ずれたの画像表示
@b_time += 2

elsif @b_time <= 59 and @b_time >= 30
Window.draw(@b_x, @b_y, @image[2] ) #一番左上から横に二個分ずれたの画像表示
@b_time += 2

elsif @b_time <= 29
Window.draw(@b_x, @b_y, @image[1] ) #一番左上から横に一個分ずれたの画像表示
@b_time += 2 #一フレームに+2画像時間を足す。
end
end
#さあ、実行!!



実際、これを起動するとこうなります。

motion1.png

人のようなものが手足をぶらぶらさせているとおもいます。
これが最も標準な、コマ送り表示の仕方だと思います。

ではもうひとり加えて、それぞれが違う動作で動くようにしたいですね。
次のようにします。



#! ruby -Ku
require "kconv"
require_relative "dxruby"
#これを実行でゲームスタート

@b_time = [0,0] #コマ送りの時間 を、二人分の箱を作る。
@b_x = [100,100] #表示X始点座標 を、二人分の箱を作る。
@b_y = [100,300] #表示y始点座標 を、二人分の箱を作る。
@image = Image.loadTiles('chara/battle/base/base1.png', 3,10) #画像のリンク。ここでは横が3個分、縦が10個分と認識する。
@motion = [0,1] どのモーションを行うか を、二人分の箱を作る。


Window.loop do #ループを起こす為の記述

@how_many_humans = 0

until @how_many_humans == 2
case @motion[@how_many_humans]
when 0 #待機
if @b_time[@how_many_humans] >= 120
@b_time[@how_many_humans] = 0 #最初に戻る
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[0] ) #Aさん一番左上の画像表示
elsif @b_time[@how_many_humans] <= 119 and @b_time[@how_many_humans] >= 90
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[0] ) #一番左上の画像表示
@b_time[@how_many_humans] += 2

elsif @b_time[@how_many_humans] <= 89 and @b_time[@how_many_humans] >= 60
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[1] ) #一番左上から横に一個分ずれたの画像表示
@b_time[@how_many_humans] += 2

elsif @b_time[@how_many_humans] <= 59 and @b_time[@how_many_humans] >= 30
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[2] ) #一番左上から横に二個分ずれたの画像表示
@b_time[@how_many_humans] += 2

elsif @b_time[@how_many_humans] <= 29
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[1] ) #一番左上から横に一個分ずれたの画像表示
@b_time[@how_many_humans] += 2 #一フレームに+2画像時間を足す。
end
when 1 #移動
if @b_time[@how_many_humans] >= 120
@b_time[@how_many_humans] = 0
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[3] )
elsif @b_time[@how_many_humans] <= 119 and @b_time[@how_many_humans] >= 90
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[3] )
@b_time[@how_many_humans] += 2

elsif @b_time[@how_many_humans] <= 89 and @b_time[@how_many_humans] >= 60
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[4] )
@b_time[@how_many_humans] += 2

elsif @b_time[@how_many_humans] <= 59 and @b_time[@how_many_humans] >= 30
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[5] )
@b_time[@how_many_humans] += 2

elsif @b_time[@how_many_humans] <= 29
Window.draw(@b_x[@how_many_humans], @b_y[@how_many_humans], @image[4] )
@b_time[@how_many_humans] += 2
end
end
@how_many_humans += 1
end
end
#さあ、実行!!




@b_time = [0,0] <=箱のような記述が出てきました。これを配列と言います。
平たくいえば、二つの箱があってそのそれぞれに値を入れているといったものです。

@how_many_humans <=今回はこの変数が鍵になります。すなわち、通称「俺のターン!」です。

until @how_many_humans == 2 <=繰り返し文です。ここでは二人を表示するので2となります。
end 前に インクリメントは忘れずに・・・

結果、こうなりました。

motion2.png

二人が違う行動をしながらコマ送りで表示されています。

上記を応用すれば下のような事ができます。定義のところ(init)と繰り返し文も
@b_time = [0,10,20,40,60,80,100,110]
@b_x = [100,150,200,250,300,350,400,450]
@b_y = [100,150,200,250,300,350,400,450]
@motion = [0,1,0,1,0,1,0,1]
until @how_many_humans == @motion.length
としてと変えます。すると・・・

motion3.png

④チーム戦ぽく配置する
ただ、上の画像ではまだ戦闘に活かせそうにありません。そもそも、対戦の時はお互い向い合って、並んでいるものですから。なので変える所があります。
そしてチーム戦という事を考慮したいので、結果こうします。
A:二次配列で定義
@b_time = [[0,10,20,40,60,80,100,110],[0,10,20,40,60,80,100,110]]
@b_x = [[100,150,200,250,300,350,400,450],[450,400,350,300,250,200,150,100]]
@b_y = [[100,150,200,250,300,350,400,450],[100,150,200,250,300,350,400,450]]
@motion = [[0,1,0,1,0,1,0,1],[1,0,1,0,1,0,1,0]]
2つ箱の中それぞれにに5箱を入れた感じです。
B: @side = 0 <=通称「ダークサイドorホワイトサイド」 です。
C: until の中に until を。気をつけなければならないのはここでして、

@side = 0
@how_many_humans = 0
until @side == 2
@how_many_humans = 0
until @how_many_humans == @motion[0].length
#some coard
@how_many_humans += 1
end
@side += 1
end



抜けがあるともれなく固まるor 誰か表示されない となります。

C:
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[1] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
非常に長くなりました。これはなにかというと、Window.draw_scale は画像の反転、拡張縮小処理のできる表示メソッドです。つまり、それぞれ意味を見ると、
1.x座標
2.y座標
3.表示する画像
4.画像の拡張向きの処理。これを 1 から -1 にすると反転とみなされます。
5と6,画像の中央点を決めます。
7.z座標。特に理由がなければ1でよし。
これらも全て2次元配列を呼び出すよう、 [][] という表記をします。

結果、こうなりました。



#! ruby -Ku
require "kconv"
require_relative "dxruby"
#これを実行でゲームスタート

@b_time = [[0,10,20,40,60,80,100,110],[0,10,20,40,60,80,100,110]] #コマ送りの時間 を、10人分の箱を作る。
@b_x = [[100,150,200,250,300,350,400,450],[450,400,350,300,250,200,150,100]] #表示X始点座標 を、10人分の箱を作る。
@b_y = [[100,150,200,250,300,350,400,450],[100,150,200,250,300,350,400,450]] #表示Y始点座標 を、10人分の箱を作る。

@image = Image.loadTiles('chara/battle/base/base1.png', 3,10) #画像のリンク。ここでは横が3個分、縦が10個分と認識する。
@motion = [[0,1,0,1,0,1,0,1],[1,0,1,0,1,0,1,0]] #どのモーションを行うか を、10人分の箱を作る。


Window.loop do #ループを起こす為の記述

@side = 0
@how_many_humans = 0

until @side == 2
@how_many_humans = 0
until @how_many_humans == @motion[0].length
case @motion[@side][@how_many_humans]
when 0 #待機
if @b_time[@side][@how_many_humans] >= 120
@b_time[@side][@how_many_humans] = 0 #最初に戻る
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[0] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上の画像表示
elsif @b_time[@side][@how_many_humans] <= 119 and @b_time[@side][@how_many_humans] >= 90
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[0] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上の画像表示
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 89 and @b_time[@side][@how_many_humans] >= 60
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[1] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上から横に一個分ずれたの画像表示
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 59 and @b_time[@side][@how_many_humans] >= 30
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[2] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上から横に二個分ずれたの画像表示
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 29
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[1] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上から横に一個分ずれたの画像表示
@b_time[@side][@how_many_humans] += 2 #一フレームに+2画像時間を足す。
end
when 1 #移動
if @b_time[@side][@how_many_humans] >= 120
@b_time[@side][@how_many_humans] = 0
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[3] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
elsif @b_time[@side][@how_many_humans] <= 119 and @b_time[@side][@how_many_humans] >= 90
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[3] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 89 and @b_time[@side][@how_many_humans] >= 60
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[4] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 59 and @b_time[@side][@how_many_humans] >= 30
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[5] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 29
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[4] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2
end
end
@how_many_humans += 1
end
@side += 1
end
end
#さあ、実行!!




画像がこちらです。
motion4.png

もはやカオスですね。


ここまでできて、まず表示の部が終わりとなります。これを、実際に一人が何かの為に飛び出して行動をするシステムを最後に作っていきます。


とはいってもコードだけですが・・・・まずはコピペで再現していただければと思います。



#! ruby -Ku
require "kconv"
require_relative "dxruby"
#これを実行でゲームスタート

@b_time = [[0,10,20,40,60,80,100,110],[0,10,20,40,60,80,100,110]] #コマ送りの時間 を、10人分の箱を作る。
@b_x = [[100,100,100,100,100,100,100,100],[540,540,540,540,540,540,540,540]] #表示X始点座標 を、10人分の箱を作る。
@b_y = [[100,150,200,250,300,350,400,450],[100,150,200,250,300,350,400,450]] #表示Y始点座標 を、10人分の箱を作る。

@b_sx = [[100,100,100,100,100,100,100,100],[540,540,540,540,540,540,540,540]] #表示X始点座標 を、10人分の箱を作る。
@b_sy = [[100,150,200,250,300,350,400,450],[100,150,200,250,300,350,400,450]] #表示Y始点座標 を、10人分の箱を作る。


@image = Image.loadTiles('chara/battle/base/base1.png', 3,10) #画像のリンク。ここでは横が3個分、縦が10個分と認識する。
@b_motion = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
@b_motioned = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]

@b_wtime = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
@b_doskill = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]

@b_time = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
@b_stats = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
@b_speed = [[5,10,15,20,25,30,35,40],[2,6,12,24,26,33,38,45]]

@side = 0
@how_many_humans = 0

Window.loop do #ループを起こす為の記述

#タイムラインシステム
if @b_doskill.all?{|a| a == [0,0,0,0,0,0,0,0] }
@how_many_humans = 0
until @how_many_humans == @b_motion[0].length
@b_stats[0][@how_many_humans] += @b_speed[0][@how_many_humans]
@b_stats[0][@how_many_humans].floor
@how_many_humans += 1
end

@how_many_humans = 0

until @how_many_humans == @b_motion[0].length
@b_stats[1][@how_many_humans] += @b_speed[1][@how_many_humans]
@b_stats[1][@how_many_humans].floor
@how_many_humans += 1
end
end


#行動システム
@side , @how_many_humans = 0 , 0
until @side == 2
@how_many_humans = 0
until @how_many_humans == @b_motion[0].length
ok = 0
ok = 1 if @b_stats[@side][@how_many_humans] >= 400
if ok != 1
@b_motion[@side][@how_many_humans] = 0

elsif ok == 1

if @b_wtime[@side][@how_many_humans] == 0
@b_doskill[@side][@how_many_humans] = 2

elsif @b_wtime[@side][@how_many_humans] > 20 and @b_wtime[@side][@how_many_humans] <= 40

@b_x[@side][@how_many_humans] += 25 if @side == 0 and @b_x[@side][@how_many_humans] <= @b_x[@side - 1][@how_many_humans]
@b_x[@side][@how_many_humans] -= 25 if @side == 1 and @b_x[@side][@how_many_humans] >= @b_x[@side - 1][@how_many_humans]

@b_motion[@side][@how_many_humans] = 1

elsif @b_wtime[@side][@how_many_humans] > 40 and @b_wtime[@side][@how_many_humans] <= 60

@b_x[@side][@how_many_humans] += -20 if @side == 0 and @b_x[@side][@how_many_humans] <= @b_x[@side - 1][@how_many_humans]
@b_x[@side][@how_many_humans] -= -20 if @side == 1 and @b_x[@side][@how_many_humans] >= @b_x[@side - 1][@how_many_humans]

@b_motion[@side][@how_many_humans] = 1

elsif @b_wtime[@side][@how_many_humans] > 60 and @b_wtime[@side][@how_many_humans] <= 80

@b_x[@side][@how_many_humans] += -40 if @side == 0 and @b_x[@side][@how_many_humans] >= @b_sx[@side][@how_many_humans]
@b_x[@side][@how_many_humans] -= -40 if @side == 1 and @b_x[@side][@how_many_humans] <= @b_sx[@side][@how_many_humans]

@b_motion[@side][@how_many_humans] = 1

elsif @b_wtime[@side][@how_many_humans] >= 80
@b_doskill[@side][@how_many_humans] = 0
@b_motion[@side][@how_many_humans] = 0
@b_wtime[@side][@how_many_humans] = -1
@b_stats[@side][@how_many_humans] = -100
end
@b_wtime[@side][@how_many_humans] += 1
end
@how_many_humans += 1
end
@side += 1
end

#ミスク
@side = 0
@how_many_humans = 0

until @side == 2
@how_many_humans = 0
until @how_many_humans == @b_motion[0].length
#もーしょん時間リセット
@b_time[@side][@how_many_humans] = 0 if @b_motioned[@side][@how_many_humans] != @b_motion[@side][@how_many_humans]
# 画面外対策
@b_x[@side][@how_many_humans] = 0 if @b_x[@side][@how_many_humans] < 0
@b_x[@side][@how_many_humans] = 640 if @b_x[@side][@how_many_humans] > 640
@how_many_humans += 1
end
@side += 1
end

#表示システム
@side = 0
@how_many_humans = 0

until @side == 2
@how_many_humans = 0
until @how_many_humans == @b_motion[0].length
case @b_motion[@side][@how_many_humans]
when 0 #待機
@b_motioned[@side][@how_many_humans] = @b_motion[@side][@how_many_humans]
if @b_time[@side][@how_many_humans] >= 120
@b_time[@side][@how_many_humans] = 0 #最初に戻る
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[0] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上の画像表示
elsif @b_time[@side][@how_many_humans] <= 119 and @b_time[@side][@how_many_humans] >= 90
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[0] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上の画像表示
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 89 and @b_time[@side][@how_many_humans] >= 60
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[1] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上から横に一個分ずれたの画像表示
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 59 and @b_time[@side][@how_many_humans] >= 30
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[2] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上から横に二個分ずれたの画像表示
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 29
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[1] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1) #一番左上から横に一個分ずれたの画像表示
@b_time[@side][@how_many_humans] += 2 #一フレームに+2画像時間を足す。
end
when 1 #移動
@b_motioned[@side][@how_many_humans] = @b_motion[@side][@how_many_humans]
if @b_time[@side][@how_many_humans] >= 120
@b_time[@side][@how_many_humans] = 0
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[3] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
elsif @b_time[@side][@how_many_humans] <= 119 and @b_time[@side][@how_many_humans] >= 90
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[3] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 89 and @b_time[@side][@how_many_humans] >= 60
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[4] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 59 and @b_time[@side][@how_many_humans] >= 30
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[5] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2

elsif @b_time[@side][@how_many_humans] <= 29
Window.draw_scale(@side == 0 ? @b_x[@side][@how_many_humans] - 32 : @b_x[@side][@how_many_humans], @b_y[@side][@how_many_humans], @image[4] ,@side == 0 ? 1 : -1 ,1 , 16 ,16 , 1)
@b_time[@side][@how_many_humans] += 2
end
end
@how_many_humans += 1
end
@side += 1
end
end
#さあ、実行!!



動画があればより説明しやすいのですが。つまりは一人もしくは時間帯のあった同士が前にでては戻るの繰り返しを行っていきます。永遠とそれです。

以上で簡単ですが、今回のサイドビュー自動戦闘システムの紹介について1回終わります。これにちゃんと各キャラに体力と攻撃力を設け、ランダム性を付けるだけでも一つ見て楽しめるものとはなるでしょう。

お約束。最後にコードリンクです。
http://pastebin.com/ww5BMtVQ

ご視聴、ありがとうございました!

ここまで書いて思ったこと、指摘を受けたこと

「オブジェクト指向で書いた方がいい」
「もっとエレガントに!!」


そこで、次回は、オブジェクト指向を使い、かつわかりやすく改造されたコードを紹介しますー!

成長を分けるパロメータと成長曲線の図

どうも、みれいゆーです!
今日は日頃の訓練をより豊かにする、成長に関わる要素の紹介をします!!

①自然成長と訓練成長

妖かし達は毎日、主の指示の元訓練をし、自身を強くしていきます。そのタイミングは毎月の試合前までに効果を出します。
では、成長の種類には二つあります。それを紹介すると

壱:自然成長。
こちらは、訓練内容にかかわらず毎月効果のある成長です。つまり、これが高いと、休みばっかりでも成長します!!w
しかし、上がる内容は主に筋力、体力等体自身に関するものが中心なので、センスは強くなりません。

弐:訓練成長。
こちらは、訓練の効果を反映する成長です。特に訓練内容を一種類に絞って、行うと明らかな違いが出るでしょう。
センス系についてはこの訓練成長が鍵になります。

それぞれ、内部的には25~275の数値幅を持っており、 自然成長 + 訓練成長 = 300 となっています。

②成長頂点歳と成長幅
よく人間にも、成長期なるものが存在するとおもいます。あるいは全年を通してゆるやかに成長する人間もいたりするでしょう。これも、妖かし憑狐では再現しました。

参:成長頂点歳。

この数値が、最も成長する歳を決めます。例えば15ならば、15歳の時に最高の成長力を持つようになっています。
当然ながらこの数値が高い歳でも訓練行動できなければ意味ありません。

四:成長幅。
この数値は、成長頂点歳までの傾斜(上がり、下がり幅)と頂点の高さを同時に変動させます。
つまり、極端に少ないと急成長期が一瞬だったり、まるで成長期がいつでものような状況にもなりうります。

③年齢と死去歳(審判歳)
しかし、妖かしにも寿命があります。そしてこの寿命が近づくといかなる妖かしも、成長の勢いは激減します。
つまり、成長頂点歳が40歳の妖かしの死去歳が30歳の場合、恐らく彼は成長期を迎えられず死にます。
寿命を延ばすということは、晩成強の妖かしを産む事に最重要不可欠なのです。

④グラフにしたったーー

結局、以上の要素をグラフにすると非常にわかりやすくなります。

グラフ1

⑤一番成長する歳を把握したい

把握の方法には様々ありますが、いkつか例を上げます。
①・能力評価の上がるタイミングを測る
②・流派技をおぼえるタイミングを測る
③・霊力鑑定

また、おはなしによって成長における様々なヒントが得られるかもしれません。

⑥まとめ
今育成ゲームには、「晩成だから強い」「早熟は落ちぶれる」という法則はありません。
だから、どんな成長曲線を持つ妖かしにも、それぞれの成長の仕方があり、大会に出して勝つタイミングも違うのです。
より一歩進んだ育成者となるために、成長する歳は大会を控えて訓練に集中するのもいいでしょう。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。