ユーザ用ツール

サイト用ツール

wiki:defold2:tips:003

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
wiki:defold2:tips:003 [2017/10/23 11:37]
step
wiki:defold2:tips:003 [2018/04/04 22:56] (現在)
step
ライン 1: ライン 1:
-====== 公式チュートリアル War battles で学習する ======+====== ​003 公式チュートリアル War battles で学習する ======
  
 ===== 概要 ===== ===== 概要 =====
ライン 128: ライン 128:
   * Scriptには雛形となるコードが記述されているので、これを改造して実装する。   * Scriptには雛形となるコードが記述されているので、これを改造して実装する。
  
-<sxh cpp; title: player.script>+<code>
 function init(self) function init(self)
  msg.post("​.", ​ "​acquire_input_focus"​)  msg.post("​.", ​ "​acquire_input_focus"​)
ライン 176: ライン 176:
 function on_reload(self) function on_reload(self)
 end end
-</sxh>+</code>
   * init で変数の初期化。on_input で入力処理を、update で移動処理を実装している。   * init で変数の初期化。on_input で入力処理を、update で移動処理を実装している。
   * このスクリプトをplayerのGameObjectにAdd Component File から追加します。   * このスクリプトをplayerのGameObjectにAdd Component File から追加します。
ライン 199: ライン 199:
  
  
-<sxh cpp; title: player.script>+<code>
 function init(self) function init(self)
  msg.post("​.", ​ "​acquire_input_focus"​)  msg.post("​.", ​ "​acquire_input_focus"​)
ライン 250: ライン 250:
     end      end
 end  end
-</sxh>+</code>
 add と書かれた部分のコードを追加します。 add と書かれた部分のコードを追加します。
 fire キーが押された時に、rocketfactory を生成するスクリプトになっています。 fire キーが押された時に、rocketfactory を生成するスクリプトになっています。
ライン 261: ライン 261:
   * scripts 右クリック -> New -> Script からスクリプトを追加。名前は rocket.script としました。   * scripts 右クリック -> New -> Script からスクリプトを追加。名前は rocket.script としました。
  
-<sxh cpp; title: rocket.script>+<code>
 go.property("​dir",​ vmath.vector3()) ​ go.property("​dir",​ vmath.vector3()) ​
  
ライン 286: ライン 286:
 end end
  
-</sxh>+</code>
 dir プロパティを追加。initでロケットの速度を初期化し、updateで移動処理を実装しています。 dir プロパティを追加。initでロケットの速度を初期化し、updateで移動処理を実装しています。
  
ライン 309: ライン 309:
 \\ \\
 \\ \\
-執筆中...+===== 爆発エフェクトのスクリプトを記述 ===== 
 +  * rocket.script を編集します。
  
 +<​code>​
 +function init(self)
 + self.speed = 200
 + self.life = 1 -- 追加。
 +end
 +
 +function update(self,​ dt)
 +    local pos = go.get_position()
 +    pos = pos + self.dir * self.speed * dt
 +    go.set_position(pos)
 +
 +    self.life = self.life - dt
 +    ​
 +    -- 追加
 +    if self.life < 0 then
 +        self.life = 1000
 +        go.set_rotation(vmath.quat())
 +        self.speed = 0
 +        msg.post("#​sprite",​ "​play_animation",​ { id = hash("​explosion"​) })
 +    end
 +end
 +
 +</​code>​
 +実行するとロケットが飛んで1秒後に爆発エフェクトが再生されます。
 +しかしこのままでは爆発エフェクトのゴミが残ってしまいます。エフェクトのゲームオブジェクトが削除される様に修正します。
 +
 +<​code>​
 +function on_message(self,​ message_id, message, sender)
 +    if message_id == hash("​animation_done"​) then
 +        go.delete()
 +    end
 +end
 +</​code>​
 +on_message にスクリプトを追加します。hash値でチェックしている“animation_done” は“play_animation”が呼ばれたたあと送られてくるゲームエンジンのに内包されているメッセージです。この場合、“play_animation”でのSpriteアニメーションの再生が完了時に“animation_done”が呼ばれる形になっています。その時go.delete()関数でゲームオブジェクトを削除します。こうすることで、爆発アニメーションが終了したあと、rocketゲームオブジェクトが削除されます。
 +\\
 +\\
 +\\
 +
 +===== 敵となる戦車の作成 =====
 +  - Assts にtank.go ゲームオブジェクトを作成します。
 +  - player.atlasを開いて新たにAnimationGroupを作成します。名前はtank-downとします。
 +  - Add Imageからimageを選択します。「tank/​down/​1.png」「tank/​down/​2.png」です。
 +  - FPSは8を設定しました。
 +  - tank.goを開いてAdd Component ー> Sprite を追加。Atlasを選択してDefault Animationを「tank-down」としました。
 +  - main.collectionを開いて戦車を配置します。
 +  - Outlineを右クリック Add GameObject File.よりtank.goを選択します。フィールドの適当な位置に配置します。
 +  - Z座標は1.0に設定して、フィールドとなる地面より手前に表示される様にします。
 +  - 3体くらい配置してみましょう。[Cmd(Ctrl) + C]-> [Cmd(Ctrl) + V]複製できます。
 +
 +{{:​wiki:​defold2:​tips:​2017-10-23_22.18.24.png|}}
 +\\
 +\\
 +\\
 +
 +
 +===== ゲームオブジェクトに当たり判定をつける =====
 +
 +====== 戦車に当たり判定をつける ======
 +  - tank.go を右クリック -> Add Component -> Collision Object を追加。
 +  - Type は“Kinematic”。
 +  - Group を"​tanks"​ に設定。
 +  - Mask を"​rockets"​ に設定。
 +  - “collisionobject” を右クリック -> Add Shape -> Box の当たり判定を付けます。
 +  - Boxのサイズを戦車の見た目に合わせます。 ​ - 
 +{{:​wiki:​defold2:​tips:​2017-10-23_23.22.12.png|}}
 +\\
 +\\
 +\\
 +
 +
 +====== ロケットに当たり判定をつける ======
 +  - rocket.go を右クリック -> Add Component -> Collision Object を追加。
 +  - Type は“Kinematic”。
 +  - Group を"​rockets"​ に設定。
 +  - Mask を "​tanks"​に設定。
 +  - “collisionobject” を右クリック -> Add Shape -> Box の当たり判定を付けます。
 +  - Boxのサイズをロケットの見た目に合わせます。
 +{{:​wiki:​defold2:​tips:​2017-10-23_23.27.09.png|}}
 +\\
 +\\
 +\\
 +===== 当たり判定に対するリアクションの実装 =====
 +  - テスト。
 +  - rocket.scriptを編集します。
 +
 +-- 関数化。爆発アニメーションの再生。
 +
 +<​code>​
 +local function explode(self)
 +    self.life = 1000
 +    go.set_rotation(vmath.quat())
 +    self.speed = 0
 +    msg.post("#​sprite",​ "​play_animation",​ { id = hash("​explosion"​) })
 +end
 +
 +function update(self,​ dt)
 +    local pos = go.get_position()
 +    pos = pos + self.dir * self.speed * dt
 +    go.set_position(pos)
 +
 +    self.life = self.life - dt
 +
 +    if self.life < 0 then
 +        explode(self)
 +    end
 +end
 +
 +function on_message(self,​ message_id, message, sender)
 +    if message_id == hash("​animation_done"​) then
 +        go.delete()
 +    -- Add
 +    elseif message_id == hash("​collision_response"​) then
 +        explode(self)
 +        go.delete(message.other_id)
 +    end
 +end
 +</​code>​
 +爆発アニメーションをexplode 関数にまとめました。on_message 関数で"​collision_response"​が送られてきた時に、explode で爆発アニメーションを再生し、対象のGameObjectを削除しています。実行するとロケットが戦車に当たると爆発アニメーションと共に消える様になっています。
 +\\
 +\\
 +\\
 +===== UIの実装 =====
 +スコアの表示や、クリア用のUIを作ります。
 +  - Assets/​mainフォルダを右クリック -> New -> Font からフォントを追加。名前は[text.font]とします。
 +  - text.font を開いて[04font.ttf]を選択します。
 +  - Assets/​mainフォルダを右クリック -> New -> Guiを選択。名前は[ui.Gui]とします。
 +  - ui.Guiを開いてOutLineからFonts を選択し右クリック -> Add ー> text.font を選択します。
 +  - Nodesを選択し右クリック -> Add -> Text を追加。名前は[score]とします。テキスト内容は“SCORE:​ 0”を設定しておきます。
 +  - Textを画面の左上に配置しておきます。
 +
 +{{:​wiki:​defold2:​tips:​2017-10-24_7.57.59.png|}}
 +\\
 +\\
 +  - Assets/​mainフォルダを右クリック -> New -> Gui Scriptを追加。名前は[ui.gui_script]
 +  - ui.gui ファイルを開いて、Outlineの"​Guiを選択した状態で表示されるプロパティのScriptに先程作成した[ui.gui_script]を設定します。
 +  - main.collection.を開いて、Outlineから右クリック -> Add Game Object ー> ゲームオブジェクトの名前は"​gui"​とします。
 +  - "​gui"​ゲームオブジェクトを右クリック -> Add Component File から"​ui.gui"​を選択します。
 +
 +{{:​wiki:​defold2:​tips:​2017-10-29_21.26.11.png|}}
 +
 +画面にスコアが表示されました。次はスコアを加算していくためのスクリプトを書いていきます。
 +\\
 +\\
 +
 +
 +===== スコアの更新 =====
 +  - ui.gui_scriptを開きます。
 +
 +<​code>​
 +function init(self)
 +    -- score の変数を定義し0で初期化します。
 +    self.score = 0
 +end
 +
 +function on_message(self,​ message_id, message, sender)
 +
 +    -- "​add_score"​メッセージが返された時に
 +    if message_id == hash("​add_score"​) then 
 +        -- scoreを加算する。
 +        self.score = self.score + message.score ​
 +        -- score ノードを取得して、テキストを更新します。
 +        local scorenode = gui.get_node("​score"​) ​
 +        gui.set_text(scorenode,​ "​SCORE:​ " .. self.score) ​
 +    end
 +end
 +</​code>​
 +
 +  - add_score メッセージを発火するためのスクリプトをrocket.gui_scriptに書きます。
 +<​code>​
 +function on_message(self,​ message_id, message, sender)
 +    if message_id == hash("​animation_done"​) then
 +        go.delete()
 +    -- Add
 +    elseif message_id == hash("​collision_response"​) then
 +        explode(self)
 +        go.delete(message.other_id)
 +        -- スコアを100点追加。
 +        msg.post("/​gui#​ui",​ "​add_score",​ {score = 100})        ​
 +    end
 +end
 +</​code>​
 +これでロケットで戦車を倒すとスコアが100点加算される様になります。
  
  
 +===== 終わり =====
 +  - 公式チュートリアルはここで終了しています。
 +  - なんどもトライ&エラーを繰り返してコツを掴むことが大切です。
Permalink wiki/defold2/tips/003.1508758674.txt.gz · 最終更新: 2017/10/23 11:37 by step

oeffentlich