コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
たらこ ◆PWy.X.JqENU2
2018/12/24 20:37
質問
タッチ
GPAINT で色をぬって、touchで色を判断して、その色だったら、音を鳴らす
というやつを作っています
間違ってたら、訂正お願いします

コメント

アバター
はる 2018/12/25 15:53 ◆75Vh4SY8TdKS
>出されたものは平らげるのが礼儀ってもんですよ?

無理に礼儀正しくする必要は無いと思います。
アバター
こういち 2018/12/25 16:13 ◆ou0jbJnEJ0Kb
代わりに説明します。
人間の目は赤、青、緑で明るさの感じ方に違いが出るので、GRAY関数はそれを利用して、滑らかに色の明るさが変化してるように見せてます。(雑)
アバター
takumi 2018/12/25 17:04 ◆Ce3Q40uXWJjn
おちゃめさん、GLAY表示のグラフィック作成プログラムの作り方教えてー
アバター
はる 2018/12/25 17:39 ◆75Vh4SY8TdKS
GRAYでは?
アバター
おちゃめ 2018/12/25 22:26 ◆jH1opV6FnGyx
プチコン3号が発売当初、私もたらこさんと同じように表示の色コードとGSPOITで取得した色コードの不一致でハマった覚えがあります。
その後で試行錯誤の上「R、G、Bの値が8の倍数値で丸められる」と気づいて解決することができました。

しかし、この8の倍数値で丸められるためグラデーション表示を行った場合にはどうしても縞模様が見えてしまいます。
せめてグレー(白黒)だけでもきれいなグラデーションで表示してみたいという思いから作ったのがこのGRAY関数なのです。
ちなみにこのGRAY関数は私が初めて作った自作関数でもあります。

DEF GRAY(GR)
 RETURN RGB(GR+(GR MOD 4>1)*8,GR+(GR MOD 8>3)*8,GR+(GR MOD 2)*8)
END

※初出時はもっと長かったけどそれを短縮したver.2.0のプログラムリストです。

このGRAY関数は0〜255の範囲で輝度を引数で記述することでその輝度のグレーの色コードを返します。この色コードを使って表示を行えば擬似的な256階調を実現できます。

このGRAY関数の動作の仕組みについては大ざっぱに言えばこういちさんが書いた通りです。
もう少し詳しく書くと赤と緑と青は同じ強さでも輝度が異なるのです。
RGB均等なグレーだと8の倍数で丸められるため32段階でしか表示できないのですが、ちょっと赤味のあるグレー、ちょっと緑味のあるグレー、ちょっと青味のあるグレーなどの「わずかに色がついたグレー」を間に7種類挟みそれを輝度順になるよう計算して行えば擬似的に256階調の表示が可能になるというわけです。
誤差拡散やタイルパターンを使用した擬似階調とは異なり、この方法であれば1ドット単位で擬似256階調が表現できるためプチコン3号で階調の優れたモノクロ表示を行いたいのであればぜひ使ってみてください。

ちなみにGRAY関数は、私が作ったプチコン3号本「プチコン3号自作関数完全マニュアル」でさらに詳しい解説を行っています。
http://petitverse.hosiken.jp/community/petitcom/topic/?read=897
アバター
たんじぇ 2018/12/27 11:36 ◆WDmFkVwZ4yMl
解決しているようで解決してないのでまとめ。

今回のようにGPAINTした値とGSPOITした値を比較して一致するかを判定したい場合のやりかとして、GPAINT した値と GSPOITした値を直接比較するのではなく、GPAINTした値を16bit精度の色に変換して比較するか、GPAINTする値をそもそも16bit精度の色にしてしまうかとなります。

32bit精度の色を16bit精度の色に変換するには、おちゃめさんのDEF RGB16を使うのが楽です。


※中身の細かいお話※

GPAINTは32bit精度の色で指定できるけど、GSPOITで取得したのは16bit精度の色になるので、GPAINTに指定した色の値とGSPOITで取得した色の値を比較すると一致しません。

※32bit精度の色は透明8bit,赤8bit,緑8bit,青8bitで合計32bit (8bitは0〜255)
※16bit精度の色は透明1bit,赤5bit,緑5bit,青5bitで合計16bit (5bitは0〜31)

GSPOITのヘルプに「内部で色変換を経由するため描画時と同じ数値が返らない可能性があります」としか書いてないので分かりづらいですが、実際はみなさんが書いているとおり、GPAINTなどで32bit精度の色を指定しても、GSPOITのときに16bit精度の色になります。

赤緑青を0〜255の8bit精度で指定したのに 5bit精度ぶんしかない0〜255の値になって、255(2進数で11111111)を指定したのに240(2進数で11111000)が返ってきます。
赤を123(2進数で01111011)で指定しても赤が120(2進数で01111000)で取得できるので、GPAINTで指定した色とGSPOITで指定した値を比較しても一致しなくなります。

32bit精度の色で指定して16bit精度の色となる場合、見た目としては おちゃめさんのコードの通りで、GPAINTやGLINEで色を指定しても8で割り切れる値の色しか表示されません。
画面に表示できる色は5bitぶんしかないので8bitで指定しても3bitは無視されるので3bit=8 で割り切れるぶんだけの色しか表示されないことになります。
アバター
たんじぇ 2018/12/27 11:46 ◆WDmFkVwZ4yMl
なお、32bit精度で色を指定して16bit精度でしか描画されないので、色がカクカクしてみえること(GRAY関数の流れ)については、本流の話題とは関係ないですが、そういうカクカクしているのをなめらかに見せるやり方を ディザリング いいます。

いろんな方法がありますが、ひとまずwikipediaの「ディザ」の内容を見るとどんな事なのかとかどんな手法があるのかとか分かるので、気になる場合は見てみるといいかもしれません。

https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%82%B6
(後半の「デジタル画像とイメージ処理」の部分)
アバター
たらこ 2018/12/31 18:47 ◆PWy.X.JqENU2
すみません
gray関数ってプログラムのなかで
こうするよーって定義して、
それを書いたら、その指示に沿って動くということですか
アバター
はる 2018/12/31 18:52 ◆75Vh4SY8TdKS
そうです。
DEF文で定義できます。
アバター
たらこ 2018/12/31 23:01 ◆PWy.X.JqENU2
それって何でも出来るんですか?
たとえば、COINっていう関数作ったり
アバター
おちゃめ 2018/12/31 23:05 ◆jH1opV6FnGyx
GRAY関数のDEF〜ENDの部分をあらかじめ入力しておけばプチコン3号に最初から入っている関数と同じように簡単に使うことができます。

ACLS
FOR I=0 TO 255
 GLINE I,0,I,239,GRAY(I)
NEXT

これで、なめらかなモノクロのグラデーション表示ができます。

よく使う処理はこんな感じで自作関数を用意しておくとプログラミングが楽になりますよ。
アバター
たらこ 2018/12/31 23:08 ◆PWy.X.JqENU2
なるほど
いまやってみましたが
便利ですね…
spfunkみたいな感じでしょうか
アバター
たらこ 2018/12/31 23:24 ◆PWy.X.JqENU2
おちゃめさんのgray関数ってDEF説明(プチコン三号)のやつですよね
引数とか戻り値ってどういうものなんですか?
GSPOIT使ってたのでなんとなくは分かるんですが(戻り値)
アバター
はる 2018/12/31 23:34 ◆75Vh4SY8TdKS
SPFUNCでは?
アバター
おちゃめ 2018/12/31 23:41 ◆jH1opV6FnGyx
BUTTON関数で言えばBUTTON(2)のようにカッコの中に入れるのが引数となります。(関数ではなく命令だとカッコはなくGLINE命令のように命令の後に記述)
GRAY関数では0〜255の輝度が引数になります。

戻り値はBUTTON関数であればAボタンを押した場合には16になります。
GRAY関数では指定した輝度を色コードに変換したものが戻り値になります。

自作関数では引数も戻り値も自分の好きなように設定することが可能です。(引数が10個とか戻り値が10個とかも可能)
アバター
たらこ 2019/1/1 0:35 ◆PWy.X.JqENU2
はるさん
そうでした
よく間違えます…
アバター
たらこ 2019/1/1 0:39 ◆PWy.X.JqENU2
glineの引数ってxとかyとかですか?
それとも色コードですか?
引数がまだいまいち分かりません
引数ってその単語?の設定みたいなものだと思っていたのですが…
アバター
はる 2019/1/1 0:39 ◆75Vh4SY8TdKS
GLINE X,Y,X,Y,色コード
です。
アバター
たんじぇ 2019/1/1 15:21 ◆WDmFkVwZ4yMl
関数は、何かの値を渡して計算結果を返すものです。
数学と同じで、z=2x+3y+4 という関数は xとy に何か値を入れたら z が求まります。
これを DEFで書くと xとyが引数 で zが戻り値になります。(引数は1つだけではなくて複数指定することができます)

DEF CALC(X,Y)
RETURN 2*X+3*Y+4
END

となり、使い方は

X=123: Y=456
Z=CALC(X,Y)

みたいな使い方になります。

おちゃめさんが作ったGRAY関数は、引数に明るさ(輝度)を渡して、プチコンでなめらかな灰色を再現できる色を計算して戻り値で返してくれる自作の関数です。

COINという関数を自作して、COINという計算をするDEFを自作もできます。
(ここは処理と名前の付け方でわかりやすい名前かどうかなので人それぞれです)

プチコンの関数は、数学みたいに計算だけではなくて処理も書けます。
GLINE は始点X,始点Y, 終点X,終点Y と、省略可能な色コード を引数に渡すことで、GPAGEで指定したGRPに線を書く動作をします。

プチコンでは戻り値が無い処理や、計算以外のことをする処理の場合、「関数」とは呼ばずに「命令」と呼びますが、自作でDEFを書く場合はこのへんはあいまいでも今はかまわないと思います。
(DEFのヘルプをみるとちゃんと関数と命令を分けて使っていますし、GLINEも実は関数ではなく命令です)
アバター
たらこ 2019/1/1 21:23 ◆PWy.X.JqENU2
はるさん
たんじぇさん
ありがとうございます
関数、引数、戻り値について理解しました

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -