トピック
【[ユウキ]】 hanabusa0908

8ビットって??

上画面に表示したものを白黒にしたいのですが、画像のヘルプの戻りのところにある、8ビットってどういうことですか?また、ここからR,G,Bをだせますか? わかる方おねがいします!
2そうだね
プレイ済み
返信[1]
親投稿
0と1の数字を8個並べて表わせる値の範囲のこと 1→1 10→2 11→3 100→4 ... 11111111→255
5そうだね
プレイ済み
返信[2]
親投稿
なんでそうなるかは2を累乗すれば分かるよ
0そうだね
プレイ済み
返信[3]
親投稿
RGBREADで出せますよ。 8ビットというのは&HAARRGGBBってことです。 (たしかこれで合ってる筈)
3そうだね
プレイ済み
返信[4]
親投稿
だにえる haru2016nen
RGBREAD GSPOIT(X,Y) OUT A,R,G,B
4そうだね
プレイ済み
返信[5]
親投稿
あまさとs≫ビットッてそういうことやったんか! 今知った((
2そうだね
プレイ済み
返信[6]
親投稿
&HAARRGGBB &HAAは16進数でこの部分だけで8ビットですよ 4ビットごとに16進数の数値に割り当てられます &B1111==&HF
2そうだね
プレイ済み
返信[7]
親投稿
10進数の数字でだすとわけわからなくなるので、HEX$(C) で16進数で表示するとちょっとわかりやすくなるかもです。 C=GSPOIT(X,Y) して、? HEX$(C) が たとえば FF0078A8 となったら FFが透明・不透明情報で 00が赤色で 78が緑色で A8が青色の値です 16進数の数字が2桁で8ビット(2進数で8桁)を表現しています。 プチコンでは基本的に色の情報は各8ビットとした32ビットの数値(ARGB 各8ビットの色コード)で管理してるけど、RGBREAD を使えばあんまり意識しなくても大丈夫かもです。(RGBREAD命令があるので公式ではそっちを推奨してるはず) ちなみにカラーを白黒変換するのは「白黒変換 アルゴリズム」あたりで検索するといろいろ方法があります(プチコンの命令1つで簡単にはできない)
1そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
注意しなくてはならないのは色コード自体はRGB各8bit(256階調)ですが、実際の表示色はRGB各5bit(32階調)になるということです。 まぁこれはグラデーション表示をしたりGSPOITを使った判定の時に注意する程度ですが。 これは例えばR、G、Bの値が123、45、67のような場合には120、40、64のように「8の倍数の数値に丸められる」という意味です。
1そうだね
プレイ済み
返信[9]
親投稿
【[ユウキ]】 hanabusa0908
みなさん返信ありがとうございます! RGBREADを使ってやってみたらできました! 少しずつわかってきたような気がしますが、まだまだです、、やっぱむずかしいですね~~ C=GSPOIT(X,Y)で自分でその数から0~255の数を計算したい時は、どうすれば良いのでしょうか?(画像はCの部分をプリントしたものです。) また、2しんきょうを16しんきょうにかえたとしてそこから0~255 をもとめられますか?長々とすみません、よろしくお願いします。
1そうだね
プレイ済み
返信[10]
親投稿
だにえる haru2016nen
進数←「しんすう」とよみます。 R,G,Bの値それぞれは0~31を8倍した ものと考えるといいかも。 内部で強制的に8の倍数にされるので GSPOITで取得した数値を8の倍数以外に することは出来ません。
3そうだね
プレイ済み
返信[11]
親投稿
だにえる haru2016nen
背景色は8の倍数じゃなくても対応してた気が 例 BACKCOLOR RGB(1,2,3) RGBREAD BACKCOLOR() OUT R,G,B PRINT R,G,B
2そうだね
プレイ済み
返信[12]
親投稿
32bit色と16bit色が混在してるのが大変にややこしいですよね。 半透明が使えればそこは32bit色という理解でいいと思いますけど(SPCOLORなど)
1そうだね
プレイ済み
返信[13]
親投稿
-460552 となっていて、HEX$してなさそうだったので16進数変換すると FFF8F8F8 となりました。 まず、10進数も2進数も16進数も、値が10進数で「-460552」であることは変わらなくて、 -460552を16進数で表記すると FFF8F8F8 となります。 この値のうち、16進数で 00FF0000 の部分が赤の色になるので、この部分を取り出そうとすると -460552 AND &h00FF0000 とすれば赤の部分の色がとりだせます、がプログラムでこれを &hFF として解釈したいので、&h00FF0000 を &h000000FF に計算しなおす必要があります。
1そうだね
プレイ済み
返信[14]
親投稿
ここで2進数で計算するとうまい具合にいきます。 &h00FF0000 は2進数で 0000 0000 1111 1111 0000 0000 0000 0000 です &h000000FF は2進数で 0000 0000 0000 0000 0000 0000 1111 1111 です 1 が全体的に右に16個ずれています。 なので「右に16シフト」するので、シフト命令を使って &h00FF0000 >> 16 となります。 全部まとめるとこうなります R = (C AND &H00FF0000) >> 16 緑は 0000FF00 で 右8シフト、青も同じように 000000FFで右0シフト(しなくていい)で計算できます。 色を計算してる公開キーのプログラムで似たようなことをしている人は多いので参考にしてみてください。
1そうだね
プレイ済み
返信[15]
親投稿
ちなみに考え方としては「32bitの値」などビットで表記されていたら、10進数ではなく16進数で考えるといいです。 そして16進数は2進数に簡単に置き換えでき、2進数は16進数に簡単に置き換えできます。 さらにWiiUや3DSなどの機械は2進数が基本で動作しているので「ビット操作」などで検索してみるといいかもしれません。 (色コードの00FF0000部分が赤、というのもプチコン内部でその部分を赤と判断してるからです)
1そうだね
プレイ済み
返信[16]
親投稿
ちなみに32bit(RGB=8bit)と16bit(RGB=5bit)の色が混在している理由。 実際の3DSで表示している色は16bitなのです。 (GSAVE/GLOAD/FONTDEFあたりが16bit定義です) プチコンの命令として色を指定するところはすべて32bitで指定するようになっていますが、これはプチコンが仕様としてそういうふうにしてます。 実際はプチコン内部で32bitを16bitに変換して3DSの画面に表示していて、 GSPOIT は 3DSの画面から取得した16bitの色をプチコン内部で32bitに変換されて返されます。 なので、どうがんばっても3DSの画面から取得したRGB=5bitしか取れないのです。 8bitなのに5bitしかなくて、3bit足りないので、左3シフトした値で表現されます 右3シフトするとは8で掛け算するのと同じなので、必ず8の倍数になります。
1そうだね
プレイ済み
返信[17]
親投稿
BACKCOLORは単一の色を設定してるので、プチコン内部メモリに持っていて、それをOUT で返しているように推測してます。 SPCOLORも設定する色をプチコン内部で持っていて、プチコン内部で計算された結果が3DS画面に書かれているように推測してます。 GSPOITの説明にあるように「内部で色変換を経由するため描画時と同じ数値が返らない可能性があります」とあるので、 あんまり8の倍数とか細かいことは気にせずに、「同じじゃないことがある」「基本的にRGB関数の32bitで色を扱う」と思っていればそれでいいかもしれません。 どうしても本当に厳密に色8bitで管理したければ画面サイズ854x480分の配列を用意して配列に色を書いて、それを画面に書く方法があります、が当然それだけの更新は時間がかかるので重たいです 全部理解して各5bit(0~32)で色を管理してしまうのも方法かもしれません
1そうだね
プレイ済み
返信[18]
親投稿
訂正と補足。 × 右3シフトするとは8で掛け算するのと同じなので ○ 左3シフトするとは8で掛け算するのと同じなので 右にNシフトは2のN乗で割り算 左にNシフトは2のN乗で掛け算になります AND は2進数でビット演算した結果、どちらも 1であるところが有効になります。 &HFFF8F8F8 AND &H00FF0000 が &H00F80000 になるのは &HFFF8F8F8 が2進数で 1111 1111 1111 1000 1111 1000 1111 1000 &H00FF0000 が2進数で 0000 0000 1111 1111 0000 0000 0000 0000 &H00F80000 が2進数で 0000 0000 1111 1000 0000 0000 0000 0000 で、どちらも 1 であるところが残ります。
1そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
プチコン3号のGRP正体は「16bit符号無し整数型による2次元配列」だと思います。 実際、自分で二次元配列を宣言してそれに0~65535(16bit)の適当な値を書き込んでDATとして保存してもGRPとして読み出すことが可能です。 3DSはハードウェア的にポリゴンしか扱えないため昔ながらのPCのようなGRP(グラフィック画面)は内部で擬似表現しているのだと思います。(GRPは擬似的に再現しているだけなので速度面では劣るため平面ポリゴンを使っているスプライトの方が高速)
1そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
GSPOITの値を元に0~255の数字にしたいというだけであればRGBREAD GSPOIT(X,Y) OUT R,G,Bで可能ですがこれだとR、G、Bは8の倍数にしかなりません。 わざわざシフト演算(2進数を使った計算)をしなくても良いように簡単に扱えるRGBREADがあるのでそれを使いましょう。 0、8、16、24、・・・・のような8の倍数値を0~255の連続した値に戻すというのならばそれは無理です。 それはシステム側で細かい部分(8で割ったときには小数になる値)は切り捨てているので元には戻らないためです。 例えば1ドル=115円79銭だとすると現在「銭」という通貨はないため1ドルもらっても115円しか渡せないというのと同じようなものです。
1そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
なぜ、32bitで表示できるようにしないかというと速度とメモリの問題があるからだと思います。 プチコンmkIIのGRPは256色でしたからそれでも同時表示可能な色数は128倍に増えています。(表示可能な階調数でいえばR、G、Bが5、6、5であるためプチコン3号よりプチコンmkIIの方がGの階調数で優れているけどこれはアルファチャンネルがないため) それならば指定も16bit値にした方が良いと考えるかもしれませんが、16進数に変換した場合に見た目でR、G、Bが分からず2進数で変換して5桁ずつ見て判断するしかないため分かりづらいし、馴染みがない数字になるため指定の段階で32bit値で設定を可能にしているのだと思います。(一般的にはR、G、Bを各8bitでアルファチャンネルを加えた32bitカラーが使われているため32bitでの色表現は馴染み深い数字というのが一番の理由だと思う)
1そうだね
プレイ済み
返信[22]
親投稿
マギー M191246
すでに説明されているように プチコンには32bitと16bitの2種類の 色表現があるので ヘルプには、32bitの方という意味で 『各8ビットの…』と書かれているのかな という気がします。
1そうだね
プレイ済み
返信[23]
親投稿
マギー M191246
SPCOLORのついて。 これは、色そのものではなく、 スプライトの画像データの元の色に対して 実際に表示する明るさの割合を 各色(A,R,G,Bのこと)ごとに設定したものを まとめて入れるものだと考えると わかりやすいかも。 (『百分率』的にいうと『255分率』的な。) 例えば、 SPCOLOR SP,#WHITE とすると、いかにも元の色を 再現してそうですけど 実際は、各色(RGB)&HF8/&HFFとなって 元の色によっては、わずかに暗くなります。 (実は、私自身がしばらく悩んでいたので。)
1そうだね
プレイ済み
返信[24]
親投稿
【[ユウキ]】 hanabusa0908
みなさん本当にありがとうございます!しかし、途中で頭がパンクしてしまいました、、、なので皆様には申し訳ないのですが、私がこの場のレベルに追い付くのは長そうなので、また機会が会ったら質問させてもらいます。それまでは自分でかんばります。皆様のコメントは参考にさせてもらいます。勝手な都合で申し訳ありません。本当にありがとうございました!
1そうだね
プレイ済み