HSP3 Tips

気が向いたらこちらのページに追記していくつもりです。



ナビゲーションのバックキーを検出したいと思ったことはありませんか? もっぱら終了時の処理を行うためです。onexit が使えればいいのですが、Android版では無視されます。

そこで、ちょっと改造します。
プロジェクトの HspActivity.java に以下を追加します。

import android.view.KeyEvent;

更に、いちばん下のほうに以下を追加します。(末尾の } の1つ手前)

	// 戻るキーを判定
	@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {	// バックキー
			if (event.getAction() == KeyEvent.ACTION_UP) {
				nativepoke( 0, -0x100 );		// stat に送るコード
				return true;
			}
		}
		return super.dispatchKeyEvent(event);
	}
}

これで、バックキーを押すと await 直後の stat に -0x100 が返るようになります。 -0x100 は何でもいいのですが、他とかぶらない値にします。 HSPのコードは以下のようにします。

// バックキーのテスト
// by 窓月らら

#include "hsp3dish.as"

	setcls 1,$000000	// redraw 0 でクリアする, 黒
	;devcontrol "AdMob",0	// AdMod 表示

*main
	redraw 0
	color 0,255,255
	pos 8,8: mes "バックキーのテストです。"
	redraw 1
	c++
	await 17-(c\3=0)	// 60FPS
	if stat=-0x100 { gosub *exit }	// 判定
	goto *main

*exit
	dialog "アプリを終了しますか?",2
	if stat!6 { return }   // Yes以外なら戻る

	; ここに設定の保存などの終了処理を書く

	;devcontrol "AdMob",-1 // AdMob 非表示(これが無いとエラーが出ることがある)
	;await 100             // ウエイトを入れないとエラーになることがある
	end                    // アプリ終了

この処理は「いろぷち」で使っています。
これは「Coin FZ for Android」でやっている改造ですが、 Yes/NoダイアログやOKダイアログでもやり方は同様です。 プロジェクトの HspActivity.java を以下のように改造します。

    public int ui_dispDialogYN( String msg1, String msg2, int type ) {

	// 独自追加
	String[] msg2s = msg2.split(",", 0);	// ボタンの文字列を分割

	// YES/NOダイアログ
	final int addtype;
	final String s_msg1;
	final String s_msg2;
	final String s_btn1;	// 独自追加
	final String s_btn2;	// 独自追加
	final String s_btn3;	// 独自追加
	final HspActivity myActivity;

	addtype = type;
	myActivity = this;
	s_msg1 = msg1;
	s_msg2 = msg2s[0];	// 独自追加
	s_btn1 = msg2s[1];	// 独自追加
	s_btn2 = msg2s[2];	// 独自追加
	s_btn3 = msg2s[3];	// 独自追加

	this.runOnUiThread( new Runnable()
		{
	        @Override
	        public void run()
	        {
			AlertDialog.Builder alert = new AlertDialog.Builder(myActivity);
			// ダイアログ外で閉じた場合
			alert.setOnCancelListener(new DialogInterface.OnCancelListener()
			{
			@Override
			public void onCancel(DialogInterface dialog)
			{
				nativepoke( 0, 0 );
			}
			});

			alert.setMessage( s_msg1 );
			alert.setTitle( s_msg2 );
			if (( addtype & 1 ) > 0 ) {
				alert.setIcon(android.R.drawable.ic_dialog_alert);
			} else {
				alert.setIcon(android.R.drawable.ic_dialog_info);
			}
	        	alert.setPositiveButton( s_btn1, new DialogInterface.OnClickListener()
	        	{
			@Override
			public void onClick(DialogInterface dialog, int which)
			{
				nativepoke( 0, 6 );
			}
		    });
	        	alert.setNegativeButton( s_btn2, new DialogInterface.OnClickListener()
	        	{
	                @Override
	                public void onClick(DialogInterface dialog, int which)
	                {
	                	nativepoke( 0, 7 );
	                }
	            });

			// 独自追加
	        	alert.setNeutralButton( s_btn3, new DialogInterface.OnClickListener()
	        	{
	                @Override
	                public void onClick(DialogInterface dialog, int which)
	                {
	                	nativepoke( 0, 255 );
	                }
	            });

	        	alert.create().show();
	        }
	    } );

   	return 0;
    }

HSP側は以下のように書きます。

#include "hsp3dish.as"

	dialog "テストメッセージです。",2,"タイトル,左ボタン,右ボタン,真ん中ボタン"
	p=stat
	if p=6   { dialog "左ボタンが押されました。" }
	if p=7   { dialog "右ボタンが押されました。" }
	if p=255 { dialog "真ん中ボタンが押されました。" }
	dialog "stat="+p+"\nアプリを終了します。",0
	end
もはや古いですが TM75A というタブレットについて。他の機種でも同様の現象があった場合は使えるかもしれません。 TM75A は独特の挙動があるのでいろいろ厄介なのですが、音声を連続再生したり、激しいタッチ操作(連打など)をすると遅延が発生します。 この問題については、とりあえずループ中に以下のように書いておくと改善が見られます。

// 遅延がある端末(TM75A等)への対策
repeat 50: wait 0: loop

上記を await の直後などに入れておきます。 Windows も含めて他の機種でも害はないので、うちでは必ずこれを入れておくことにしています。
AndroidManifest.xml については最新の状況がよく変わるため、 とりあえず 2022年8月現在の「いろぷち」で使っているものを元に置いておきます。 細かい意味はググって調べてください(丸投げ)。 uses-permission のところは、自分のアプリで使わない部分は削除しておいたほうが良いです。 また、最新 HSP3.7β版だとまた違ってくると思われます。ややこしいですが、最新に対応していかないと Google Play で配信できないという事情があるので頑張って対応していくしかないです。(最近これが理由で少しウンザリしてきています)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.xxx.xxx"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="14"
              android:targetSdkVersion="31" />
    <supports-screens android:smallScreens="true"  
                      android:normalScreens="true"  
                      android:largeScreens="true"  
                      android:xlargeScreens="true"
                      android:anyDensity="true" />
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <uses-library android:name="org.apache.http.legacy" android:required="false"/>
        <meta-data
            android:name= "com.google.android.gms.ads.APPLICATION_ID"
            android:value= "ca-app-pub-xxx~xxx"/>
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version"/>
        <activity android:name="com.google.android.gms.ads.AdActivity"
            android:theme="@android:style/Theme.Translucent"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
        <activity android:name="tv.hsp.HspActivity"
                  android:exported="true"
                  android:screenOrientation="portrait"
                  android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
                  android:label="@string/app_name">
            <meta-data android:name="android.app.lib_name"
                    android:value="test1" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
	<uses-feature android:name="android.hardware.vibrate" android:required="false" />
	<uses-permission android:name="android.permission.VIBRATE"/>
	<uses-permission android:name="android.permission.INTERNET"/>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
	<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
</manifest>
color 255,255,255 と書くところを color2 $FFFFFF と書けます。メリットは、カラー情報を変数1個で管理できる点です。

// カラーセット($rrggbb)
#deffunc color2 int _p1
	color _p1>>16 & $FF,_p1>>8 & $FF,_p1 & $FF
	return

以下のように書いて使います(この例だとシアン色)。

color2 $FFFF00
color2 0xFFF00

公式掲示板のスレにも色々書いておきました。
[HSP3Dish] 問題・要望・解決策などの共有スレ(外部サイト)

<< HSP3 トップに戻る



新しいバージョンで Fix されたり古くなった情報は削除しました。 色々バグ報告しました…。皆様もバグを見つけたら積極的にご報告ください。 報告先は ⇒ 公式掲示板(外部サイト)

[HSP3Dish] [Android] ダイアログで OKボタンの戻り値が正しくない件(Fix)
[HSP3Dish] [Android] ダイアログ外をタッチすると停止する不具合について(Fix)
[HSP3Dish] [Android] 起動時に画面が乱れる不具合について(Fix)
[HSP3Dish] [Fire OS(Android互換)] ダイアログの改行がおかしい件(Fix)
[HSP3Dish] [Android] [GooglePlay] 「携帯電話向けに設計」の表示を消す方法