Arduboy

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その14

atan関数の実装について色々と見てきたが、最後にそれぞれの速度を計測してみよう。 標準関数 M-KAI氏の方法 こびにぃ氏の方法 を、それぞれ1000回実行し、時間を表示してみた。 標準関数:179,532マイクロ秒 raohu69.hatenablog.jp M-KAI氏の方法:52,708マ…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その13

前回のコードを参考に、過去のコードを高速化した。 元のコード raohu69.hatenablog.jp const uint8_t atanTbl[] PROGMEM = { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その12

前回のatan2の精度を上げてみた。8x8のテーブルを16x16に変更した。 import math # 64方向 for y in range(16): for x in range(16): angle = math.atan2(y, x) * 180 / math.pi index = round(angle / (360 / 64)) if index < 0: index += 64 print(format(…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その11

今までレーダー法を見てきたがいくつか不満点があった。 計算できる範囲に制限がある。 割り算が重い。 精度が低い。 3つ目の精度の問題は置いておいて、とても良い解決策がある。それはこちら。 こびにぃのあそび:Arduboy ソースコードがダウンロードでき…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その10

31x23マスのテーブルを作成していたが、0〜90度のデータがあれば(下図の赤い部分) 他の角度のデータを求めることができる。 16x12マスのレーダー法テーブルを作成する。 # 64方向 for y in range(12): for x in range(16): # ラジアンから度へ変換する ang…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その9

狙い撃ちの精度が悪いので、レーダー法のテーブルを64方向にしてみたのだが。 import math # 64方向 for y in range(23): for x in range(31): # 中心へずらす cx = x - 15 cy = y - 11 # ラジアンから度へ変換する angle = math.atan2(cy, cx) * 180 / math…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その8

レーダー法 http://beach.biwako.ne.jp/~beaver/msx/msxtecho/tablsp4.htm 前回作成したレーダーテーブル(32方向)で、プレイヤを狙い撃つようにした。sinテーブルを32方向で作り直し、getSin関数も32方向に修正する。 import math # 32方向の1/4のデータ f…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その7

レーダー法のテーブル作成プログラムを修正した。atan2関数で各マス目への方向を求めるようにしたので、 角度の分割数や画面サイズの変更にも容易に対応できる。 import math for y in range(23): for x in range(31): # 中心へずらす cx = x - 15 cy = y - …

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その6

前回とは異なる方法で、atan2を実装できそうだ。レーダー法 http://beach.biwako.ne.jp/~beaver/msx/msxtecho/table2.htm 画面をマス目状に分割し、画面の中心からそれぞれのマス目が、 どの角度になるかをテーブル化しているようだ。 1030 DEFINT A-Z:DIM T…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その5

今回もM-KAI氏のものを参考にした。 http://web.archive.org/web/20021220053234/http://www02.geocities.co.jp:80/SiliconValley-Bay/8572/algobib/lv029.htm atanテーブルの検索ではなく、インデックスを求め、テーブルから一発で値を取得できる。今までは…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その4

今回はM-KAI氏の書かれたものを参考に、atanテーブルのサイズを半分にして検索回数を減らすことにした。 http://web.archive.org/web/20021220053234/http://www02.geocities.co.jp:80/SiliconValley-Bay/8572/algobib/lv029.htm atanテーブルのサイズは前回…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その3

atanをテーブルから求める方法だが、M-KAI氏の書かれた物を参考にさせてもらった。 http://web.archive.org/web/20021220090455/http://www02.geocities.co.jp:80/SiliconValley-Bay/8572/algobib/lv019.htm ちなみにM-KAI氏のゲームはこちらでプレイできる…

sinテーブルの作り方

半径rの円周上に、半径rに等しい長さの円弧ABを取った時、 この円弧ABに対する中心角をθとすると、θは半径rの大きさに関係なく、一定の角になる。(比が同じと言うこと) この角を1ラジアンと定める。 このラジアンを単位として角の大きさを表す方法を弧度法…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その2

例によって例のごとく、atan2は重い。 テーブル化したいのだが……。その前に、atan2について調べてみた。ターゲットを狙い撃つ場合、そのターゲットまでのx,yの距離は分かる。 であれば、tanの逆関数であるatanを使えば良さそうだが、 x=0のとき、つまり、90…

Arduboyで狙い撃つぜ!(atan2テーブルの作り方) その1

ロックオン・ストラトスのように狙い撃ちたい。 atan2関数で狙い撃てました。 #include <Arduboy2.h> Arduboy2 arduboy; #define BOSS_SHOT 10 typedef struct CharaData { float x, y; float vx, vy; int life; }; CharaData player; CharaData boss; CharaData bossSho</arduboy2.h>…

Arduboyで弾幕的なものを その3

前回、一周を64方向と決めて、64個のデータを用意しましたが、 実は、16個(0°〜90°未満)あれば十分でした。Pythonでsinテーブルを作成。 import math for i in range(16): v = math.sin(i / 64 * 2 * math.pi) print(str(v) + ',') #include <Arduboy2.h> Arduboy2 ard</arduboy2.h>…

Arduboyで弾幕的なものを その2

sin,cos関数は重かろうということで、テーブルから求めるようにしてみた。 Arduboyの解像度だと、一周64方向もあれば十分かな?まずは、Pythonでsinテーブル(64方向分)を作成。 import math for i in range(64): v = math.sin(i / 64 * 2 * math.pi) print…

Arduboyで弾幕的なものを その1

弾幕薄いぞ。何やってんの!sin,cos関数で弾幕的なものを。 #include <Arduboy2.h> Arduboy2 arduboy; #define PI 3.141592653589793f #define BOSS_SHOT 10 typedef struct CharaData { float x, y; float vx, vy; int life; }; CharaData boss; CharaData bossShot[BOS</arduboy2.h>…

Arduboyでprintf的なものを

デバッグプリント用にprintf的なものを作成した。ただし、%fが?と表示されてしまう。何故だろうか。 #include <Arduboy2.h> Arduboy2 arduboy; void setup() { arduboy.begin(); arduboy.setFrameRate(60); arduboy.clear(); } void loop() { if (!arduboy.nextFrame()) </arduboy2.h>…

Arduboyでボタンのリピートを取得する

Arduboyのボタン入力の取得は、pressed(), notPressed(), justPressed(), justReleased()があるが、ボタンのリピートも欲しくなる。ドキュメントには次のようにする。と書かれているが少々使いづらそうだ。 if (arduboy.everyXframes(5)) { if (arduboy.pres…

Arduboyで固定小数点と回転と

固定小数点で使用するsin, cos関数を作成した。 #include <Arduboy2.h> Arduboy2 arduboy; #define SCREEN_CENTER_X 64 #define SCREEN_CENTER_Y 32 #define SCREEN_LEFT -64 #define SCREEN_RIGHT 63 #define SCREEN_TOP -32 #define SCREEN_BOTTOM 31 typedef struct W</arduboy2.h>…

Arduboyで固定小数点を扱う その2

構造体と共用体を使って、固定小数点の扱いを少し楽にしてみた。 #include <Arduboy2.h> Arduboy2 arduboy; #define SCREEN_CENTER_X 64 #define SCREEN_CENTER_Y 32 #define SCREEN_LEFT -64 #define SCREEN_RIGHT 63 #define SCREEN_TOP -32 #define SCREEN_BOTTOM 31 </arduboy2.h>…

Arduboyで固定小数点を扱う その1

固定小数点を使うことがあるかもしれないので、テスト。符号1ビット、整数部7ビット、小数部8ビットにした。 整数部は7ビットなので-128〜127まで扱えるが、この値を単純に表示座標として使用すると、画面右の外側にキャラクタを置けない。 そこで、下駄…

Arduboyで処理時間を計る

今後パフォーマンスを計ることもあるかもしれないので、処理の時間を測ってみた。 今回の目的は、時間の計り方を知ることだったので、重そうな処理を適当にグルグルと回してみた。 #include <Arduboy2.h> Arduboy2 arduboy; #define N 1000 static float dust; void setu</arduboy2.h>…

Arduboyの当たり判定

Arduboyには当たり判定用メソッドcollide()が用意されている。 点と矩形、矩形同士の当たり判定が行える。 #include <Arduboy2.h> Arduboy2 arduboy; void setup() { arduboy.begin(); arduboy.setFrameRate(60); arduboy.clear(); } void loop() { if (!arduboy.nextFra</arduboy2.h>…

Arduboyでスプライトを表示する

キャラクタの表示にdrawBitmap()は不向きのようだ。 画像の黒い部分が透けてしまって、重ね合わせると下の画像が見えてしまう。調べてみると、Spritesクラスを使うと良いみたい。いくつかメソッドが用意されているが、drawExternalMask()が意図した表示にな…

Arduboyで画像を表示する

8x8の画像を画面全体に敷き詰めてみた。 #include <Arduboy2.h> Arduboy2 arduboy; const unsigned char bg[] PROGMEM = { 0x00, 0x02, 0x24, 0x42, 0x20, 0x08, 0x10, 0x08, }; void setup() { arduboy.begin(); arduboy.setFrameRate(60); arduboy.clear(); } void loo</arduboy2.h>…

Arduboyの画面をキャプチャする

Arduboyの画面キャプチャの方法を試したところ、環境の違いで動かなかった。 community.arduboy.com 私の環境、mac、Python 3.6で動かした手順を書いておこう。1. macとArduboyをUSBで接続し、Arduboyの電源をONする。 2. macのターミナルから次のコマンドを…

Arduboyのボタン入力

ボタンの種類 UP_BUTTON RIGHT_BUTTON LEFT_BUTTON DOWN_BUTTON A_BUTTON B_BUTTON ボタンが押されていることを取得する #include <Arduboy2.h> Arduboy2 arduboy; void setup() { arduboy.begin(); arduboy.setFrameRate(60); arduboy.clear(); } void loop() { if (!ar</arduboy2.h>…

Arduboyで図形を描画する

点 #include <Arduboy2.h> Arduboy2 arduboy; void setup() { arduboy.begin(); arduboy.setFrameRate(60); arduboy.clear(); } void loop() { if (!arduboy.nextFrame()) return; arduboy.clear(); // 点の描画 arduboy.drawPixel(10, 20, WHITE); arduboy.display(); }</arduboy2.h>…