4. 壁を作ろう

背景を表示しよう

背景が黒では寂しいので、以下のコードで背景を描画しましょう。

-- 背景黒では寂しいので、背景を追加しましょう
background = display.newImageRect(displayGroup, "bg_space.png", width, height)
background.x = width/2
background.y = height/2

参考:CoronaSDK Reference [newImageRect]

https://docs.coronalabs.com/api/library/display/newImageRect


壁を表示しよう

ボールが動いた時に跳ね返るように壁を作っておきましょう。
壁は四角形を四隅に配置して作ろうと思うので、 display.newLine(LeftTopのX座標, LeftTopのY座標, RightBottomのX座標, RightBottomのY座標) という機能を使って壁を作りたいと思います。
しかし、4つ作るからといって
walls1 = display.newLine(displayGroup, 0, 0, width, 0)
walls2 = display.newLine(displayGroup, 0, 0, 0, height)
...
とするのはあまり格好良くありません。
そこで、テーブルを使ってみましょう。
テーブルは walls = {} で宣言でき、 walls[1], walls[2] のような形でアクセスできます。
また、変数の内容を識別しやすいように tag にどこの壁なのかを入れておきましょう。

以下のコードを書き、壁を描画してみましょう。

-- 壁の連想配列を作ろう
walls = {}
walls[1] = display.newLine(displayGroup, 0, 0, width, 0)
walls[1].tag = "topWall"

walls[2] = display.newLine(displayGroup, 0, 0, 0, height)
walls[2].tag = "leftWall"

walls[3] = display.newLine(displayGroup, width, 0, width, height)
walls[3].tag = "rightWall"

walls[4] = display.newLine(displayGroup, 0, height, width, height)
walls[4].tag = "bottomWall"

参考 CoronaSDK Reference [newLine]

https://docs.coronalabs.com/api/library/display/newLine


for文で壁を一括で設定してみよう

配列にするとfor文で一括処理をすることができます。 for文とは、 for i = 最初の値, 最後の値(含む), 幾つづつiをプラスするか do ~ end の構文で最初の値から最後の値になるまで do ~ end の内容を実行します。 for文で壁の厚さを変更、物理演算に登録を一括でやってみましょう。
physics.addBody(登録する物, 種類, オプション) で物理演算に登録できます。種類は"static"で移動しないオブジェクト、"dynamic"で移動するオブジェクトです。 "kinematic"は"dynamic"と同じようにオブジェクトが動きますが、重力に沿って動く"dynamic"とは違い、"kinematic"は重力とは関係なしに移動します。 以下のコードを入力してみましょう。

-- for i = 最初の値, 最後の値(含む), 幾つづつiをプラスするか do ~ end
-- `#` は要素数
for i = 1, #walls, 1 do
    -- 壁の厚さを変更
    walls[i].strokeWidth = 50
    -- `physics.addBody(登録する物, 種類, オプション)` 物理演算に登録
    physics.addBody(walls[i], "static", {density = 0.0, friction = 0.0, bounce = 1.0})
end

参考 CoronaSDK Reference[addBody]

https://docs.coronalabs.com/api/library/physics/addBody


セクション中の全文

このセクションで書いたコードの全文は以下になります。

-----------------------------------------------------------------------------------------
--
-- ピンボールゲームを作ってみよう
-- main.lua
--
-----------------------------------------------------------------------------------------



-- ############################## 変数とは? ##############################

-- `width` は画面の横幅(1080)が入っている
width = display.contentWidth
-- `height` は画面の縦幅(1920)が入っている
height = display.contentHeight

-- 描画グループ
displayGroup = display.newGroup()

-- ############################## 変数とは? ##############################



-- ############################## 物理演算とは? ##############################

-- 物理演算をするための機能を読み込んで `physics` に入れておく
physics = require("physics")
-- 物理演算を起動する
physics.start(true)
physics.setGravity(0, 0)

-- ############################## 物理演算とは? ##############################



-- ############################## 壁を作ろう ##############################

-- 背景黒では寂しいので、背景を追加しましょう
background = display.newImageRect(displayGroup, "bg_space.png", width, height)
background.x = width/2
background.y = height/2

-- 壁の連想配列を作ろう
walls = {}
walls[1] = display.newLine(displayGroup, 0, 0, width, 0)
walls[1].tag = "topWall"

walls[2] = display.newLine(displayGroup, 0, 0, 0, height)
walls[2].tag = "leftWall"

walls[3] = display.newLine(displayGroup, width, 0, width, height)
walls[3].tag = "rightWall"

walls[4] = display.newLine(displayGroup, 0, height, width, height)
walls[4].tag = "bottomWall"

-- for i = 最初の値, 最後の値(含む), 幾つづつiをプラスするか do ~ end
-- `#` は要素数
for i = 1, #walls, 1 do
    -- 壁の厚さを変更
    walls[i].strokeWidth = 50
    -- `physics.addBody(登録する物, 種類, オプション)` 物理演算に登録
    physics.addBody(walls[i], "static", {density = 0.0, friction = 0.0, bounce = 1.0})
end

-- ############################## 壁を作ろう ##############################

画面は以下のようになっていれば成功です。

results matching ""

    No results matching ""