見出し画像

ローコードエンジニアがインベーダー

昔懐かしのインベーダーゲーム。今年からローコードも担当することになったため、少し触ってみました。ローコードでまずは、インベーダーゲームを作ってみました。

ローコードの世界

今回使ったのは、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
   )
)

いいなと思ったら応援しよう!