ローコードエンジニアがインベーダー
昔懐かしのインベーダーゲーム。今年からローコードも担当することになったため、少し触ってみました。ローコードでまずは、インベーダーゲームを作ってみました。
ローコードの世界
今回使ったのは、Microsoft PowerApps。 Microsoft社が出しているローコードツールです。最近、流行っているノーコードとは違い、従来のMicrosoft製品によくある、スクリプト言語を使い、画像やテキストボックス、タイマーなどを使ってそれぞれのプロパティにコードを書いていきます。開発のスタイルは、Excelマクロと同じようなイメージです。
開発の進め方
開発の進め方は、画面をイメージしながら、ひとつづつ動きを作っていきます。たとえば、エイリアンを1秒間に200pxづつ右に動かすとか、右側の壁にぶつかったら左に方向を変えるとか。プレイヤーのミサイルの起動を 50ミリ秒単位で Y座標を増やすことでミサイルを打ち上げる動きを作ったり。
で実際にできたインベーダーゲームはこちらの動画です。
設計イメージ
エイリアンから矢を落とす
ミサイルは50mm秒単位で位置を変化させる
矢の発射時に効果音を出す
プレイヤーから火の玉を飛ばす
ミサイルは20mm秒単位で位置を変化させる
火の玉発射時に効果音を出す
プレイヤーと矢の位置が一致したら、プレイヤーに矢が刺さったこととし、防御失敗(GameOver)とする
エイリアンと火の玉の位置が一致したら、エイリアンに火の球が当たったとし、攻撃成功とする
攻撃が成功したら、エイリアンの透過度を20%下げる
攻撃成功が5回で GemeClear とする
実際のコード
###################################################
#ボタン
###################################################
#######################
STARTボタン
#######################
-----------------------
[OnSelect]
-----------------------
Set(
AlienOneX,
50
);
Set(
AlienOneY,
140
);
Set(
Alien2OneX,
450
);
Set(
Alien2OneY,
240
);
Set(
direct,
0
);
Set(
direct2,
1
);
Set(
AlienSoundCnt,
1
);
Set(
AlienTimerVal,
1000
);
Set(
Alien2TimerVal,
1000
);
Set(
playerX,
300
);
Set(
playerY,
668
);
Set(
AlienTimerStart,
true
);
Set(
Alien2TimerStart,
true
);
Set(
PlayerScore,
0
);
Set(
PlayerShotFired,
false
);
Set(
PlayerShotSnd,
false
);
Set(
PlayerBombSnd,
false
);
Set(
AlienBombSnd,
false
);
Set(
AlienOneTransparency,
0
);
Set(
Alien2OneTransparency,
0
);
Set(
AlienOneHasShot,
false
);
Set(
Alien2OneHasShot,
false
);
Set(
AlienOneShotVisible,
false
);
Set(
Alien2OneShotVisible,
false
);
Set(
AlienOneShotX,
0
);
Set(
Alien2OneShotX,
0
);
Set(
AlienOneShotY,
0
);
Set(
Alien2OneShotY,
0
);
Set(
GameOverVisible,
false
);
Set(
GameClearVisible,
false
);
Set(
AlienShotLoopStart,
true
);
Set(
Alien2ShotLoopStart,
true
)
#######################
左移動ボタン
#######################
-----------------------
[OnSelect]
-----------------------
If (playerX > 50,Set(playerX, playerX - 30))
#######################
右移動ボタン
#######################
-----------------------
[OnSelect]
-----------------------
If(playerX < 500,Set(playerX, playerX + 30))
#######################
PlayerShotボタン
#######################
-----------------------
[OnSelect]
-----------------------
If(
PlayerShotFired = false,
Set(
PlayerShotFired,
true
);
Set(
PlayerShotX,
PlayerOne.X
);
Set(
PlayerShotY,
PlayerOne.Y
);
Set(
PlayerShotSnd,
true
)
)
###################################################
#ラベル
###################################################
#######################
Scoreラベル
#######################
-----------------------
[Text]
-----------------------
"Score: " & PlayerScore
#######################
Alien Lifeラベル
#######################
-----------------------
[Width]
-----------------------
100 - AlienOneTransparency * 100
#######################
GameOverラベル
#######################
-----------------------
[Visible]
-----------------------
GameOverVisible
#######################
GameClearラベル
#######################
-----------------------
[Visible]
-----------------------
GameClearVisible
###################################################
#メディア
###################################################
#######################
PlayerBombSound サウンド
#######################
-----------------------
[AutoStart]
-----------------------
PlayerBombSnd
-----------------------
[Media]
-----------------------
Slice
-----------------------
[OnEnd]
-----------------------
Set(PlayerBombSnd, false)
-----------------------
[Visible]
-----------------------
false
#######################
PlayerShotSound サウンド
#######################
-----------------------
[AutoStart]
-----------------------
PlayerShotSnd
-----------------------
[Media]
-----------------------
Shoot
-----------------------
[OnEnd]
-----------------------
Set(PlayerShotSnd, false)
-----------------------
[Visible]
-----------------------
false
#######################
AlienBombSound サウンド
#######################
-----------------------
[AutoStart]
-----------------------
AlienBombSnd
-----------------------
[Media]
-----------------------
bomb
-----------------------
[OnEnd]
-----------------------
Set(AlienBombSnd, false)
-----------------------
[Visible]
-----------------------
false
#######################
PlayerShot 画像
#######################
-----------------------
[image]
-----------------------
fireball
-----------------------
[Visible]
-----------------------
PlayerShotFired
-----------------------
[X]
-----------------------
PlayerShotX+45
-----------------------
[Y]
-----------------------
PlayerShotY-50
#######################
AlienOneShot 画像
#######################
-----------------------
[image]
-----------------------
AlienShot_1
-----------------------
[Visible]
-----------------------
AlienOneShotVisible
-----------------------
[X]
-----------------------
AlienOneShotX
-----------------------
[Y]
-----------------------
AlienOneShotY
#######################
AlienOne 画像
#######################
-----------------------
[image]
-----------------------
Alien
-----------------------
[X]
-----------------------
AlienOneX
-----------------------
[Y]
-----------------------
AlienOneY
-----------------------
[Transparency]
-----------------------
AlienOneTransparency
#######################
Player 画像
#######################
-----------------------
[image]
-----------------------
Player
-----------------------
[X]
-----------------------
playerX
-----------------------
[Y]
-----------------------
playerY
###################################################
#入力
###################################################
#######################
PlayerShotLoop タイマー
#######################
-----------------------
[AutoStart]
-----------------------
true
-----------------------
[Start]
-----------------------
true
-----------------------
[Duration]
-----------------------
20
-----------------------
[OnTimerEnd]
-----------------------
If (
PlayerShotFired = true,
// Check if player shot hits active Alien One
If(
(PlayerShot.Y >= AlienOne.Y && PlayerShot.Y <= AlienOne.Y + 130) && (PlayerShot.X >= AlienOne.X && PlayerShot.X <= AlienOne.X + 100) && AlienOneTransparency < 1,
Set(
PlayerScore,
PlayerScore + 250
);
Set(
PlayerShotFired,
false
);
Set(
AlienOneTransparency,
AlienOneTransparency + 0.2
);
Set(
AlienBombSnd,
true
);
If (
AlienOneTransparency = 1,
Set(
AlienTimerStart,
false
);
Set(
GameClearVisible,
true
)
)
);
// Animate Player Shot if still on screen
If(
PlayerShotY > 150,
Set(
PlayerShotY,
PlayerShotY - 20
),
Set(
PlayerShotFired,
false
)
)
);
#######################
AlienShotLoop タイマー
#######################
-----------------------
[AutoStart]
-----------------------
true
-----------------------
[Start]
-----------------------
AlienShotLoopStart
-----------------------
[Duration]
-----------------------
50
-----------------------
[OnTimerEnd]
-----------------------
If(
AlienOneHasShot = false,
// Randomise Alien Shot
If(
AlienOneTransparency < 1,
Set(
AlienOneShooting,
Round(
Rand() * 1000,
0
)
);
// Initialise Alien Shot
If(
AlienOneShooting <= 30,
Set(
AlienOneHasShot,
true
);
Set(
AlienOneShotVisible,
true
);
Set(
AlienOneShotX,
AlienOne.X + 35
);
Set(
AlienOneShotY,
AlienOne.Y + 80
)
)
)
);
If(
AlienOneHasShot = true,
//Check if player shot hits active Alien One
If(
(AlienOneShot.Y >= PlayerOne.Y && AlienOneShot.Y <= PlayerOne.Y + 50) && (AlienOneShot.X >= PlayerOne.X && AlienOneShot.X <= PlayerOne.X + 75),
Set(
AlienTimerStart,
false
);
Set(
PlayerBombSnd,
true
);
Set(
GameOverVisible,
true
);
Set(
AlienOneShotVisible,
false
);
Set(
AlienShotLoopStart,
false
)
);
// If Shot in progress animate shot down screen
Set(
AlienOneShotY,
AlienOneShotY + 13
);
If (
AlienOneShotY > 800,
Set(
AlienOneShotVisible,
false
);
Set(
AlienOneHasShot,
false
)
)
);
#######################
AlienLoop タイマー
#######################
-----------------------
[AutoStart]
-----------------------
AlienTimerStart
-----------------------
[Start]
-----------------------
AlienTimerStart
-----------------------
[Duration]
-----------------------
AlienTimerVal
-----------------------
[Repeat]
-----------------------
true
-----------------------
[OnTimerEnd]
-----------------------
If(
AlienSoundCnt = 1,
Set(
AlienSound1,
true
);
Set(
AlienSoundCnt,
AlienSoundCnt + 1
),
AlienSoundCnt = 2,
Set(
AlienSound2,
true
);
Set(
AlienSoundCnt,
AlienSoundCnt + 1
),
AlienSoundCnt = 3,
Set(
AlienSound3,
true
);
Set(
AlienSoundCnt,
AlienSoundCnt + 1
),
AlienSoundCnt = 4,
Set(
AlienSound4,
true
);
Set(
AlienSoundCnt,
1
)
);
If (
direct = 0 && AlienOneX < 450,
Set(
AlienOneX,
AlienOneX + 30
),
direct = 0 && AlienOneX > 450,
Set(
direct,
1
);
Set(
AlienOneY,
AlienOneY + 40
);
Set(
AlienTimerVal,
AlienTimerVal - 70
);
Set(
AlienOneX,
AlienOneX - 30
),
direct = 1 && (AlienOneX < 550 && AlienOneX >= 50),
Set(
AlienOneX,
AlienOneX - 30
),
Set(
direct,
0
);
Set(
AlienOneY,
AlienOneY + 40
);
Set(
AlienTimerVal,
AlienTimerVal - 70
);
Set(
AlienOneX,
AlienOneX + 30
)
);
If(
AlienOneY > 850,
Set(
AlienTimerStart,
false
)
)