[無駄アプリ]連打でアリーヴェデルチやってみた


この記事は[プロトアウトスタジオのカレンダー | Advent Calendar 2021 - Qiita](https://qiita.com/advent-calendar/2021/protoout)の2日目の記事です。

## はじめに

ゲームコントローラーのボタン連打で`アリーヴェデルチ`をするだけのアプリ作りました。
完成品はこちら

<iframe width="560" height="315" src="https://www.youtube.com/embed/6epU3pJSQI8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



## アリーヴェデルチとは

アリーヴェデルチの意味がわからんという方のためにリンク置いときます。

https://dic.nicovideo.jp/a/%E3%82%A2%E3%83%AA%E3%83%BC%E3%83%B4%E3%82%A7%E3%83%87%E3%83%AB%E3%83%81

>「アリアリアリアリアリ、アリーヴェデルチ！」と言い、アリアリの間はずーっと殴りっぱなしで、止めめに強い一撃を相手にくらわせる。

↑ ここをアプリにしました。

## スクリプト

Python3 スクリプトです。実行環境は `Python 3.9.5` です。

```python:連打でアリーヴェデルチ.py
import pygame
from pygame.locals import *
import random

screenWidth  = 1200
screenHeight = 800

def setString(screen,dispStr,sFlg):
    col1 = 255
    col2 = 255
    col3 = 255
    fSize = 100
    posX = 250
    posY = screenHeight / 2 -50
    if sFlg == 0:
        col1 = random.randrange(255)
        col2 = random.randrange(255)
        col3 = random.randrange(255)
        fSize = random.randrange(20) * 10
        posX = random.randrange(screenWidth)
        posY = random.randrange(screenHeight)
    else:
        screen.fill((0,0,0))
    font = pygame.font.Font("meiryo.ttc", fSize)        # フォントの設定(55px)
    text = font.render(dispStr, True, (col1,col2,col3)) # 描画する文字列の設定
    screen.blit(text, [posX, posY])                     # 文字列の表示位置
    pygame.display.update()                             # 画面を更新

def clearScreen(screen):
    screen.fill((0,0,0))    # 画面を黒色に塗りつぶし
    pygame.display.update() # 画面を更新

pygame.init() # pygameの初期化
pygame.joystick.init()

try:
   joystick = pygame.joystick.Joystick(0)
   joystick.init()
   print('ジョイスティックの名前:', joystick.get_name())
   print('ボタン数 :', joystick.get_numbuttons())
except pygame.error:
   print('ジョイスティックが接続されていません')

screen = pygame.display.set_mode((screenWidth, screenHeight)) # 画面の生成

# ループ
active = True
while active:
   # イベントの取得
   for e in pygame.event.get():
       # 終了ボタン
        if e.type == QUIT:
            active = False

        print('|'+str(e))
        # ジョイスティックのボタンの入力
        if e.type == pygame.locals.JOYAXISMOTION:
            print('十時キー:', joystick.get_axis(0), joystick.get_axis(1))
        elif e.type == pygame.locals.JOYBUTTONDOWN:
            print('ボタン'+str(e.button)+'を押した')
            if e.button == 3:
                setString(screen,"アリ",0)
            elif e.button == 2:
                clearScreen(screen)
            elif e.button == 1:
                setString(screen,"アリーヴェデルチ",1)
        elif e.type == pygame.locals.JOYBUTTONUP:
            print('ボタン'+str(e.button)+'を離した')
```

## 補足

### 操作について

ゲームコントローラの3つのボタンを使います。

<img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F274270%2F6dd9ef57-f1eb-dada-e28d-cc680aeb6dd8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=54f9322d158915bf9fb187ce9c082e9b" width="450">

- **ボタン2** : 画面に `アリ` を描画。文字サイズ、座標、色はランダム
- **ボタン3** : 画面クリア(画面全体を黒で塗る)
- **ボタン4** : 画面クリアの後、`アリーヴェデルチ` を描画

該当するスクリプトはこちらです。

```python
if e.button == 3:
    setString(screen,"アリ",0)
elif e.button == 2:
    clearScreen(screen)
elif e.button == 1:
    setString(screen,"アリーヴェデルチ",1)
```

関数 `setString` は、第3引数により、画面クリアの有無や、文字設定の処理が変わります。

### ゲームコントローラの制御について

ゲームコントローラの制御スクリプトについてはこちらに記載しました。

https://qiita.com/suo-takefumi/items/c9c4b23ea74a56d7e901

### pygame 日本語文字列の描画について

Pythonモジュール `pygame` でスクリーン上に日本語の文字列を描画するには以下のように**日本語に対応したフォントの設定**が必要です。

```python
font = pygame.font.Font("meiryo.ttc", fSize)
```

無料フォントを取得するなどで用意してください。

## おわりに

ゲームコントローラーを使った何かを作りたくて簡単なアプリを作ってみました。今後はラジコンのコントローラーとして使ってみたいと思います。