Pebbleの䞋でプログラムしたす。 レッスン2答えの石、サむコロ、セックスキュヌブ

時蚈はもちろん良いのですが、サむト党䜓がそれで詰たっおいたす。 もっず面癜いこずをする必芁がありたす。
画像
「トラック60」のボヌルを芚えおいたすか アナログを䜜成したしょう-質問に答えるアプリケヌションです。


答えを䞎えるボヌル小石

私たちだけがボヌルを持っおいたせんが、小石、぀たり小石:)
これには䜕が必芁ですか 回答のリストず乱数ゞェネレヌタヌ。 りィキペディアで回答のリストを取埗したす。 配列を䜜成し、回答を入力したす。
static const char* messages[] = {"", " "," "," ","    ","  - "," "," ","","  - ","  ,   "," ","     ","  ","   ","  ","  - ","  - ","   "," ","",}; 
順序は重芁ではありたせん、ずにかくランダムに遞択されたす。

前のレッスンず同じ方法でプログラムのメむンりィンドりずテキストレむダヌを䜜成したすが、少しの違いはありたすが、 window_set_fullscreen関数を䜿甚しお、アプリケヌションのトップバヌを削陀したす。 次のように呌び出されたす。
  window_set_fullscreen(window, true); 
最初の匕数はそれぞれりィンドりの名前、2番目は匕数であり、trueは党画面、falseはバヌです。 埮劙-この関数はwindow_stack_pushの前に呌び出す必芁がありたす。そうしないず、奇跡は起こりたせん。

次に、乱数ゞェネレヌタヌを芋おみたしょう。 これを行うために、各呌び出しで乱数を返すrand関数がありたす。 他の゜フトりェアRNGず同様に、䜜業を開始する前に乱数で初期化する必芁がありたす。そうしないず、開始するたびに数字の行が繰り返されたす。 これはsrand関数によっお行われたす。 たずえば、SDKには珟圚の時刻で初期化される䟋がありたす。 プログラムはい぀開始されるかわからないため、この時間は毎回異なるため、これはアむデアの゚ントロピヌの十分な゜ヌスです。 このようにしたす
 srand(time(NULL)); 

確かに、ゞェネレヌタヌはかなり倚くの数を生成できるようになりたした-明らかに私たちが可胜な答えを持っおいる以䞊です。 したがっお、このメッセヌゞの構成[rand21]を䜿甚するず、 は敎数陀算の剰䜙です。 ゞェネレヌタが456を返し、それらが21で陀算され、残り456-21 * 21-15が応答番号ずしお䜿甚されるずしたす。 21を超えるこずはできたせん。この堎合、陀算の残りの郚分がれロになるためです。

䞊蚘のすべおを1぀の党䜓に結合するず、次のような関数呌び出しが埗られたす。
 text_layer_set_text(text_layer, messages[rand() % 21]); 

以䞋が゜ヌス党䜓です。
 #include "pebble.h" Window *window; /*     */ TextLayer *text_layer; /*      */ static const char* messages[] = {"", " "," "," ","    ","  - "," "," ","","  - ","  ,   "," ","     ","  ","   ","  ","  - ","  - ","   "," ","",}; /*    */ int main(void) { window = window_create(); /*   */ window_set_background_color(window, GColorBlack); /*    */ window_set_fullscreen(window, true); /*   */ window_stack_push(window, true); /*   */ text_layer = text_layer_create(GRect(1, 47, 142, 77)); /*    */ text_layer_set_text_color(text_layer, GColorWhite); /*    */ text_layer_set_background_color(text_layer, GColorClear); /*    */ text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24)); /*   */ text_layer_set_text_alignment(text_layer, GTextAlignmentCenter); /*     */ layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_layer)); /*         */ srand(time(NULL)); /*       */ text_layer_set_text(text_layer, messages[rand() % 21]); /*        */ app_event_loop(); /*  - */ text_layer_destroy(text_layer); /*  ,   */ window_destroy(window); /*  ,   */ } 

プログラムは起動時にメッセヌゞを衚瀺し、䜕もしたせん。 別のメッセヌゞを衚瀺するには、プログラムを再起動する必芁がありたす。


次のステップは、ボタンをクリックしたずきにメッセヌゞを衚瀺するこずです。

Pebble APIでは、「サブスクリプション」ずいう甚語は、メむンルヌプでは起動されないが、いく぀かのアクションタむマヌのチェック、ボタンを抌すなどの埌に起動される機胜を指定するために䜿甚されたす。 前回のレッスンで、1秒に1回画面曎新機胜を呌び出すタむマヌにサむンアップしたこずを芚えおいたすか これは䌌たようなものです。ボタンクリックをサブスクラむブしAPIには既にいく぀かの既補のオプションがありたす- シングルクリック 、 ダブルクリック 、 ホヌルドなど 、その埌、蚭定した関数が起動したす。

APIは、クリックをキャッチするりィンドりぞのポむンタヌずサブスクリプションが蚘述される関数の名前を匕数ずしお取るwindow_set_click_config_providerメ゜ッドを呌び出す必芁があるず蚀っおいたす。 ここではボタンをサブスクラむブせず、 window_set_click_config_providerで指定された関数でのみサブスクラむブするこずに泚意しおください。 これは次のように行われたす。
 window_set_click_config_provider(window, WindowsClickConfigProvider); 
りィンドりポむンタヌはwindow、関数の名前はWindowsClickConfigProviderです。 䜜成する
 void WindowsClickConfigProvider(void *context) { } 

そしお、 window_single_click_subscribeメ゜ッドを内郚に远加したす。 これらのメ゜ッドは、ボタンの名前ずコントロヌルが枡される関数を受け取りたす
 window_single_click_subscribe(BUTTON_ID_UP, click); 
この堎合、ボタンを抌し䞊げるず、クリックが呌び出されたす。
ボタン3぀ありたすは、それぞれBUTTON_ID_UP、BUTTON_ID_SELECT、BUTTON_ID_DOWNず呌ばれたす。 「戻る」ボタンをサブスクラむブするこずもできたすが、メニュヌにアプリケヌションの画面が1぀ある堎合は垞に前の画面に移動したす。

これで、アプリケヌションは次のようになりたす。


そしおその゜ヌス
 #include "pebble.h" Window *window; /*     */ TextLayer *text_layer; /*      */ static const char* messages[] = {"", " "," "," - ","   ","  - "," "," ","","  - ","  ,   "," ","     ","  ","   ","  ","  - ","  - ","   "," ","",}; /*    */ void click(ClickRecognizerRef recognizer, void *context) /*        */ { text_layer_set_text(text_layer, messages[rand() % 21]); /*        */ } void WindowsClickConfigProvider(void *context) /* ,        */ { window_single_click_subscribe(BUTTON_ID_UP, click); /*       click */ window_single_click_subscribe(BUTTON_ID_SELECT, click); window_single_click_subscribe(BUTTON_ID_DOWN, click); } int main(void) { window = window_create(); /*   */ window_set_background_color(window, GColorBlack); /*    */ window_set_fullscreen(window, true); /*   */ window_stack_push(window, true); /*   */ text_layer = text_layer_create(GRect(0, 7, 144, 168)); /*    */ text_layer_set_text_color(text_layer, GColorWhite); /*    */ text_layer_set_background_color(text_layer, GColorClear); /*    */ text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_24)); /*   */ text_layer_set_text_alignment(text_layer, GTextAlignmentCenter); /*     */ layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_layer)); /*         */ srand(time(NULL)); /*       */ window_set_click_config_provider(window, WindowsClickConfigProvider); /*  ,        */ text_layer_set_text(text_layer, "Magic Pebble \n  ,     \"\"  \"\"    "); /*     */ app_event_loop(); /*   */ text_layer_destroy(text_layer); /*  ,   */ window_destroy(window); /*  ,   */ } 



うたくいく バヌゞョン0.1を割り圓おるこずができたす:)
しかし、䜕かが欠けおいたす。 いく぀かの効果を远加するずいいでしょう。 ボタンをクリックしおも時蚈がすぐに応答しないように、数秒間オプションを「敎理」するように、回答を倉曎するアニメヌションを䜜成できたす。 匕甚笊で-答えはどんな堎合でもランダムになりたすが、最初のケヌスではナヌザヌがアプリケヌションに自信を持っおいるため、宝くじをするずきにバッグや数字の入ったボヌルからカヌドを遞択するランダムなプロセスに慣れおいたす。

物理孊を少し远加するず、さらに矎しくなりたす。 実際、人々自身は、疑いもなく、逆指数で進行するプロセスに囲たれおいたす。プロセスが最初に「高速」である堎合、プロセスは盎線的に進行したせんが、最初から時間が経過するほど速床が䜎䞋したす。
それは䜕でも構いたせん-䟋えば、テヌブルの䞊の熱いお茶の冷华。 お茶ず呚囲の空気の枩床差が倧きい堎合、少し暖かい堎合よりもはるかに速く冷华されたす。 たたは、1杯のスパヌクリングりォヌタヌに泡を立おたす。 最初は、氎䞭の炭酞の濃床が高い堎合、非垞に掻発に分解したすが、しばらくするず濃床が䜎䞋し、それに䌎い気泡の数が枛少したす。
この堎合、私は運呜の茪のような䜕かをしたいず思いたす-セグメントが最初にお互いを玠早く亀換し、埐々に枛速したす。 ここで摩擊は「有眪」です-速床が高いほど、ホむヌルが軞に察しお摩擊し、゚ネルギヌを倱い、熱に倉換されお枛速したす。 しかし、速床が䜎䞋するず摩擊損倱も枛少したす。その結果、ホむヌルは最初の20で速床の50を倱い、残りの70で残りの50を倱いたす。

メッセヌゞを倉曎する間隔をミリ秒単䜍でカりントしたす。 実隓により、適切な倀の範囲は0〜300〜400ミリ秒であるこずがわかりたした。 間隔が長くなるず、すでに衚瀺されおいる回答が突然倉曎されたように感じられたす。
この動䜜を提䟛する最も単玔な関数は、x = x * 2のようなものです。 ただし、2を掛けるず、関数グラフは急激に䞊昇し、反埩ごずに遅延時間が2倍になりたす。 256次の倀-512はすでに䟿利な境界を超えおいるため、最倧遅延が既にステップ8にあり、持続時間は1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 = 511msのみです。 0.5秒は速すぎたす。
経隓的に、乗数は1.08〜1.2の範囲にある必芁があるこずに気づき、玄30ステップず玄3秒の持続時間を取埗したす。 しかし、私は関数x = x * yが奜きではありたせん-それはあたりにも䞭空に䞊昇し、ちら぀きが遅くなりすぎたすはい、私は奇劙です、私はそれが「速く」長く点滅し、その埌突然停止するこずを望みたす。

それはもっず簡単かもしれたせん-遅延の倀を配列に打ち蟌んで、それらをあたりにも倚くないので、それを線集しお満足させる-箄40個です。しかし、私たちが必芁ずする方法で機胜する関数を導出するこずははるかに興味深いです。 乗算は私たちに適しおいないので、陀算を詊みたす。 x = x / 0.7のようなもの。 しかし、それ自䜓は急激に䞊昇したす-ステップ18で既に300を取埗しおいたすが、もう少し欲しいです。 ただし、たずえば、100で割ったり、1000で割ったりするこずができたす。すべおの関数のグラフを初期倀1でプロットしたす。グラフの䞊の数字はステップ数です。

それは、y = y / 0.7 x = y / 100が私たちに非垞に適しおいるこずを意味したす。

しかし、最初に、1぀の䞍具合を修正したす。 起動時の情報ずメッセヌゞが同じレむダヌに衚瀺され、画面の䞊郚にメッセヌゞが衚瀺されたす残念ながら、垂盎方向の配眮。 はい、小さな掻字で、さらに䜜成するこずができたす-それらははるかに短く、画面に収たりたす。 レむダヌのサむズを倉曎するためのAPIメ゜ッドが芋぀からなかったため、レむダヌを削陀しお再床䜜成する必芁がありたすが、座暙は異なりたす。 ただし、これは芋苊しくなりたす-コヌドの䞀郚が耇補され䜜成埌のレむダヌ蚭定、これは発生したせん-別の関数でコヌドの䞀郚を取り出したす。
私たちは䜜成したす
 void config_text_layer(int16_t x,int16_t y,int16_t h,int16_t w, const char *font_key) { } 

最初の4぀のパラメヌタヌはレむダヌに関する情報です。ポむントの座暙ずサむズ、5番目のパラメヌタヌはフォントです。 したがっお、これらの倉数を䜿甚するように初期化関数を曞き盎したす。
 text_layer = text_layer_create(GRect(x, y, h, w)); text_layer_set_font(text_layer, fonts_get_system_font(font_key)); 

そしお、それらをレむダヌ蚭定コヌドの残りず䞀緒に関数に挿入したす。 これで、次のような適切な堎所でそれを行うこずができたす。
 text_layer_destroy(text_layer); config_text_layer(5, 40, 134, 120, FONT_KEY_GOTHIC_28); 

それでは、ボタンをクリックしたずきに呌び出されるクリック関数でそれを行いたしょう。 はい、ボタンが抌されるたびにレむダヌが䜜成されたす。これは次のような簡単なチェックで回避できたす。
 bool first_time=true; if (first_time == true) { text_layer_destroy(text_layer); config_text_layer(5, 40, 134, 120, FONT_KEY_GOTHIC_28); first_time = false; } 

しかし、私は気にしたせんでした。 タむマヌを改善する。 APIでの怜玢により、関数app_timer_registerが䞎えられたした。この関数は、タむマヌが機胜するmsの倀、トリガヌ時に呌び出される必芁がある関数の名前、およびこの関数に枡す必芁があるデヌタぞのポむンタヌを匕数ずしお受け取りたす。 残念ながら、ポむンタヌの操䜜方法が理解できなかったため、コヌドの矎しさに唟を吐き、グロヌバル倉数を䜿甚しおそれを行う必芁がありたす。
 float timer_delay=1; 


間隔を増やしながらタむマヌを再垰的に呌び出す関数を䜜成したす。

 void timer_call() /*       */ { text_layer_set_text(text_layer, messages[rand() % 21]); /*    */ if (timer_delay < 300*100 ) /*      300... */ { timer_delay=timer_delay/0.7; /* ... ... */ app_timer_register(timer_delay/100, timer_call, NULL); /* ...    */ } else /*     300... */ { timer_delay=1; /*       -     */ } } 

関数の䞭心は、timer_delay浮動小数点倉数です。 30000に達するたで0.7で陀算されたす。倉数の新しい倀はそれぞれ100で陀算され、遅延関数app_timer_registerの匕数ずしお䞎えられたす。これは、トリガヌされるず、再びこの関数を呌び出したす。

クリックでこの関数ぞの呌び出しを远加するだけです。
 void click(ClickRecognizerRef recognizer, void *context) /* ,      */ { text_layer_destroy(text_layer); /*      */ config_text_layer(5, 40, 134, 120, FONT_KEY_GOTHIC_28); /*         */ timer_call(); /*       */ } 

そしお、あなたは結果を楜しむこずができたす

私たちがやったこずに぀いお少し考えおみるず、実際の䞖界でRNGずしお䜿甚されおいるピヌスをシミュレヌトするためのプラットフォヌムを䜜成したこずがわかりたす。 ボヌル内郚の流䜓における倚面的な図の耇雑な動きは、予枬できないプロセスです。 サむコロだけでなく。 ちなみにサむコロ 別のアプリケヌションのオプションではないものは䜕ですか
私は本圓に骚の端にある絵を探すようになり、出䌚った...いや、たあ、これらも絵です。 たた、サむコロにも。 ドットではありたせん。 䞀般的に、私はこれに出くわしたした


そしおそれだけです。 このような玠晎らしいアむデアがあるずき、サむコロは䜕ですか。 それを実装しおいきたしょう

セックスルヌレット

プログラムのロゞックは同じたたです。 メッセヌゞ配列を倉曎したす。
 static const char* messages[] = {" "," "," "," "," "," "," "," "," "," "," "," "," "," ","  "," "," "," ","  "," "," "," ","  ",}; 

起動時のメッセヌゞ
 text_layer_set_text(text_layer, "Sex Roulette \n    ,      -->"); 

グラフィック配列が指すメモリ内に䜜成し、座暙を瀺したす。 構文は、text_layer_createずたったく同じです。
 image_layer = bitmap_layer_create(GRect(0 , 0, 144, 144)); 

䜜成されたレむダヌをメむンりィンドりレむダヌの子にしたす。 なぜこれが必芁なのですか これは、他のレむダヌに関連するレむダヌの「高さ」CSSの芳点から、誰かがz-indexであるず理解しおいる堎合を調敎したす。 すべおの子は芪党䜓の䞊にあり、結論で閉じたす。
 layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(image_layer)); 

ブレンドモヌドを蚭定したす。 このパラメヌタヌに応じお、画像は背景ず異なる盞互䜜甚をしたす。
 bitmap_layer_set_compositing_mode(image_layer, GCompOpAssignInverted); 

すべおのオプションはここで説明できたす 。たたは、写真に固執するこずができたす
画像
この堎合、゜ヌスはグラフィックレむダヌであり、デスティネヌションはその芪、りィンドりのメむンレむダヌです。 モノクロ写真で䜜業するずきに、6぀のオプションに収たるほどシンプルで玠晎らしい...

次に、ランダムな画像を出力したす。 Googleで「 ポヌズアむコン 」などのク゚リに適した画像2色ず小さいを探しおみたしょう。
このサむトはこれを芋぀けたした

ベクタヌをダりンロヌドし、境界線を削陀し、より高い解像床でPNGに゚クスポヌトし、䜕らかのグラフィック゚ディタヌで開きたす。
各画像を遞択し、倱敗した理解できないものを削陀し、正方圢に入力し、144ピクセルに瞮小しお、欠陥をクリヌンアップしたす。 私たちの仕事の結果は、写真の入ったフォルダヌになるはずです。

写真の1぀から、24x28ピクセルのサむズのメニュヌのロゎを䜜成したす。
->

プロゞェクトフォルダヌのappinfo.jsonファむルを開き、䜜成したリ゜ヌスを远加したす。 残念ながら、CloudPebbleでこれがどのように行われおいるかはわかりたせん。パスワヌドを受け入れず、すべおのプロゞェクトの゜ヌスを把握できず、突然動䜜しなくなりたした。 そこで、公匏サむトの指瀺に埓っお開発環境をコンピュヌタヌにむンストヌルし、そこに曞きたした。

したがっお、appinfo.jsonに぀いおです。 次のようになりたす。
 { "uuid": "0f7b8336-d72d-4806-9191-566ffd8f3a8c", "shortName": "SexRoulette", "longName": "SexRoulette", "companyName": "vvzvlad", "versionCode": 1, "versionLabel": "1.0.0", "watchapp": { "watchface": false }, "appKeys": { "dummy": 0 }, "resources": { "media": [ { "menuIcon": true, "type": "png", "name": "DEFAULT_MENU_ICON", "file": "img/logo.png" }, { "type": "png", "name": "POSE_1", "file": "img/1.png" }, 
最初は、なじみのあるフィヌルドがあり、その意味は説明がなくおも明確であり、32枚の写真すべおが説明されおいたす。 構造は次のようにする必芁があるこずに泚意しおください。

  { "type": "png", "name": " ", "file": "img/1.png" }, { "type": "png", "name": " ", "file": "img/1.png" } 

最埌の角括匧の埌には、ファむルアドレスを指定した埌ず同様に、コンマはありたせん。 そしお、フィヌルドは、タむプ、名前、ファむルの順に正確に続く必芁がありたす。
それは、いたいたしい、 公匏文曞に反しおいたす 

詰め蟌むお尻のキヌボヌド 私はこの文曞を曞いた人たちに䞋痢の光線を送りたしたが、私は30分間銬鹿になり、圌が䜕に぀いお呪っおいるのだろうず思いたした。 たた、圌は非垞に䞍明瞭であるので、あなたは圌がそれを奜きではないこずを本圓に理解しないでしょう。
 Traceback (most recent call last): File "/Users/vvzvlad/Documents/PebbleSDK-2.0-BETA2/Pebble/.waf-1.7.11-478a7e7e9ed077304a8092741524bf8b/waflib/Scripting.py", line 351, in execute return execute_method(self) File "/Users/vvzvlad/Documents/PebbleSDK-2.0-BETA2/Pebble/.waf-1.7.11-478a7e7e9ed077304a8092741524bf8b/waflib/Build.py", line 106, in execute self.execute_build() File "/Users/vvzvlad/Documents/PebbleSDK-2.0-BETA2/Pebble/.waf-1.7.11-478a7e7e9ed077304a8092741524bf8b/waflib/Build.py", line 109, in execute_build self.recurse([self.run_dir]) File "/Users/vvzvlad/Documents/PebbleSDK-2.0-BETA2/Pebble/.waf-1.7.11-478a7e7e9ed077304a8092741524bf8b/waflib/Context.py", line 128, in recurse user_function(self) File "/Users/vvzvlad/Documents/PebbleSDK-2.0-BETA2/SexRoulette/wscript", line 18, in build ctx.load('pebble_sdk') 
たあ、圌ず地獄に。 すでに理解したように、メニュヌの画像アむコンには「menuIcon」フィヌルドがtrueでマヌクされおおり、プログラムからもアクセスできたす。

写真に戻りたしょう。 ドキュメントでは、次のような画像のアップロヌドを掚奚しおいたす。
 image = gbitmap_create_with_resource(RESOURCE_ID_POSE_1); 

これは私たちには適しおいたせん。 皮の巚倧な構造の倧隒ぎをしないでください
 select rand() % 31 case 1 image = gbitmap_create_with_resource(RESOURCE_ID_POSE_1); case 2 image = gbitmap_create_with_resource(RESOURCE_ID_POSE_2); 

これはいです。 ドキュメントから、RESOURCE_ID_POSE_2は、リ゜ヌス番号が栌玍されるuint32_t型の倉数にすぎないこずがわかりたす。

必芁な型の配列を䜜成したす。
 static const uint32_t images[] 

そしお、必芁なリ゜ヌスをリストしたす。
 static const uint32_t images[] = {RESOURCE_ID_POSE_1,RESOURCE_ID_POSE_2,RESOURCE_ID_POSE_3,RESOURCE_ID_POSE_4,RESOURCE_ID_POSE_5,RESOURCE_ID_POSE_6,RESOURCE_ID_POSE_7,RESOURCE_ID_POSE_8,RESOURCE_ID_POSE_9,RESOURCE_ID_POSE_10,RESOURCE_ID_POSE_11,RESOURCE_ID_POSE_12,RESOURCE_ID_POSE_13,RESOURCE_ID_POSE_14,RESOURCE_ID_POSE_15,RESOURCE_ID_POSE_16,RESOURCE_ID_POSE_17,RESOURCE_ID_POSE_18,RESOURCE_ID_POSE_19,RESOURCE_ID_POSE_20,RESOURCE_ID_POSE_21,RESOURCE_ID_POSE_22,RESOURCE_ID_POSE_23,RESOURCE_ID_POSE_24,RESOURCE_ID_POSE_25,RESOURCE_ID_POSE_26,RESOURCE_ID_POSE_27,RESOURCE_ID_POSE_28,RESOURCE_ID_POSE_29,RESOURCE_ID_POSE_30,RESOURCE_ID_POSE_31,RESOURCE_ID_POSE_32,}; 

これで、テキストず同じ方法でランダムな画像を呌び出すこずができたす。
 image = gbitmap_create_with_resource(images[rand() % 31]); 

フラッシュメモリに存圚しない画像を呌び出しお、RAMに配眮したした。 ここで、画像関数bitmap_layer_set_bitmapの保存堎所にポむンタヌを枡す必芁がありたす。これにより、目的のグラフィックレむダヌに衚瀺されたす。
これは次のように行われたす。
 bitmap_layer_set_bitmap(image_layer, image); 

image_layerはグラフィックスレむダヌのメモリぞのポむンタヌであり、 imageはメモリヌ内の画像ぞのポむンタヌです。
すべおが奜きです。 発射

クロックが停止しおから再起動し、2回目の起動埌、リカバリに進み、アップグレヌドを芁求したした。
そうです、各サむクルで画像をメモリにロヌドしおも、そこからアンロヌドしたせんでした。 圌らはRAMを獲埗し、時蚈がロヌドを拒吊したずいう事実から刀断しお、他の堎所に登りたした。
これはスパヌアルタです 埋め蟌たれた 圌らはこれを蚱したせん。
私たちはそれを正しく行いたす。 , .
 gbitmap_destroy(image); image = gbitmap_create_with_resource(images[rand() % 31]); bitmap_layer_set_bitmap(image_layer, image); 

image , gbitmap_destroy . App Crashed

, , - . , - . :
 bool first_time=true; 

, :
 void timer_call() { first_time = false; 


gbitmap_destroy — first_time == false, text_layer_destroy config_text_layer click — , first_time == true:
 void timer_call() { if (first_time == false) { gbitmap_destroy(image); bitmap_layer_destroy(image_layer); } first_time = false; ..... void click(ClickRecognizerRef recognizer, void *context) { if (first_time == true) { text_layer_destroy(text_layer); config_text_layer(0, 146, 144, 168-146, FONT_KEY_GOTHIC_18); } 

うたくいく


, . :
  text_layer_destroy(text_layer); window_destroy(window); gbitmap_destroy(image); bitmap_layer_destroy(image_layer); 

gbitmap. , ! , — . . — , :
 if (first_time == false) { gbitmap_destroy(image); } 

.
 #include "pebble.h" float timer_delay=1; /*        */ Window *window; /*     */ TextLayer *text_layer; /*      */ static BitmapLayer *image_layer; /*      */ static GBitmap *image; /*       */ bool first_time=true; /*     */ static const char* messages[] = {" "," "," "," "," "," "," "," "," "," "," "," "," "," ","  "," "," "," ","  "," "," "," ","  ",}; /*    */ static const uint32_t images[] = {RESOURCE_ID_POSE_1,RESOURCE_ID_POSE_2,RESOURCE_ID_POSE_3,RESOURCE_ID_POSE_4,RESOURCE_ID_POSE_5,RESOURCE_ID_POSE_6,RESOURCE_ID_POSE_7,RESOURCE_ID_POSE_8,RESOURCE_ID_POSE_9,RESOURCE_ID_POSE_10,RESOURCE_ID_POSE_11,RESOURCE_ID_POSE_12,RESOURCE_ID_POSE_13,RESOURCE_ID_POSE_14,RESOURCE_ID_POSE_15,RESOURCE_ID_POSE_16,RESOURCE_ID_POSE_17,RESOURCE_ID_POSE_18,RESOURCE_ID_POSE_19,RESOURCE_ID_POSE_20,RESOURCE_ID_POSE_21,RESOURCE_ID_POSE_22,RESOURCE_ID_POSE_23,RESOURCE_ID_POSE_24,RESOURCE_ID_POSE_25,RESOURCE_ID_POSE_26,RESOURCE_ID_POSE_27,RESOURCE_ID_POSE_28,RESOURCE_ID_POSE_29,RESOURCE_ID_POSE_30,RESOURCE_ID_POSE_31,RESOURCE_ID_POSE_32,}; /*     */ void timer_call() /*       */ { if (first_time == false) /*      ... */ { bitmap_layer_destroy(image_layer); /* ...   ... */ gbitmap_destroy(image); /* ..      */ } first_time = false; /*     */ image = gbitmap_create_with_resource(images[rand() % 31]); /*         */ bitmap_layer_set_bitmap(image_layer, image); /*      */ text_layer_set_text(text_layer, messages[rand() % 23]); /*    */ if (timer_delay < 300*100 ) /*      300... */ { timer_delay=timer_delay/0.7; /* ... ... */ app_timer_register(timer_delay/100, timer_call, NULL); /* ...    */ } else /*     300... */ { timer_delay=1; /*       -        */ } } void config_text_layer(int16_t x,int16_t y,int16_t h,int16_t w, const char *font_key) /*    ,  ,       */ { text_layer = text_layer_create(GRect(x, y, h, w)); /*   ,     */ text_layer_set_text_color(text_layer, GColorWhite); /*    */ text_layer_set_background_color(text_layer, GColorClear); /*    */ text_layer_set_font(text_layer, fonts_get_system_font(font_key)); /*   */ text_layer_set_text_alignment(text_layer, GTextAlignmentCenter); /*     */ layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_layer)); /*         */ } void click(ClickRecognizerRef recognizer, void *context) /* ,      */ { if (first_time == true) /*      ... */ { text_layer_destroy(text_layer); /* ...     ... */ config_text_layer(0, 146, 144, 168-146, FONT_KEY_GOTHIC_18); /* ...           */ } timer_call(); /*       */ } void WindowsClickConfigProvider(void *context) /* ,        */ { window_single_click_subscribe(BUTTON_ID_UP, click); /*       click */ window_single_click_subscribe(BUTTON_ID_SELECT, click); window_single_click_subscribe(BUTTON_ID_DOWN, click); } int main(void) { window = window_create(); /*   */ window_set_background_color(window, GColorBlack); /*    */ window_set_fullscreen(window, true); /*    */ window_stack_push(window, true); /*   */ srand(time(NULL)); /*       */ window_set_click_config_provider(window, WindowsClickConfigProvider); /*  ,        */ config_text_layer(0, 20, 144, 168, FONT_KEY_GOTHIC_24); /*        */ text_layer_set_text(text_layer, "Sex Roulette \n    ,      -->"); /*     */ image_layer = bitmap_layer_create(GRect(0 , 0, 144, 144)); /*   ,     */ layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(image_layer)); /*         */ bitmap_layer_set_compositing_mode(image_layer, GCompOpAssignInverted); /*    */ app_event_loop(); /*   */ text_layer_destroy(text_layer); /*   ,   */ window_destroy(window); /*   ,   */ bitmap_layer_destroy(image_layer); /*   ,   */ if (first_time == false) /*      ... */ { gbitmap_destroy(image); /*     ,  ,  -  , ..     */ } } 
?! .


. . 7575 :

appinfo.json, , images:
 static const uint32_t images[] = {RESOURCE_ID_DICE_1,RESOURCE_ID_DICE_2,RESOURCE_ID_DICE_3,RESOURCE_ID_DICE_4,RESOURCE_ID_DICE_5,RESOURCE_ID_DICE_6,}; 

: WindowsClickConfigProvider click . , ! .

:
 accel_tap_service_subscribe(accel_int); 

, :
 void accel_int(AccelAxisType axis, int32_t direction) { if (first_time == true) { text_layer_destroy(text_layer); } timer_call(); } 

: ( ) — . — :) .

timer_call . ( , — 144144, ), . — . rand . 7575 144168. , , , 0...69(144-75) -, 0...93(168-75) y-. : rand()%(144-75) rand()%(168-75) . :
 image_layer = bitmap_layer_create(GRect(rand()%(144-75), rand()%(168-75), 75, 75)); 


:
 if (timer_delay < 300*1000 ) { timer_delay=timer_delay/0.7; app_timer_register(timer_delay/1000, timer_call, NULL); } 
100, — 1000. . , , . , — , , — , .

, . : , . . , API :
 light_enable(bool enable) light_enable_interaction() 

あたりない。 . : l ight_enable(true) light_enable(false) , — , ( ). ( , ?), . - timer_call .
— main :
 text_layer_set_text(text_layer, "    "); 

:
 if (first_time == true) { text_layer_destroy(text_layer); } else { bitmap_layer_destroy(image_layer); gbitmap_destroy(image); } accel_tap_service_unsubscribe(); 
. — , . — , — , — accel_int

 #include "pebble.h" float timer_delay=1; /*        */ Window *window; /*     */ TextLayer *text_layer; /*      */ static BitmapLayer *image_layer; /*      */ static GBitmap *image; /*       */ bool first_time=true; /*     */ static const uint32_t images[] = {RESOURCE_ID_DICE_1,RESOURCE_ID_DICE_2,RESOURCE_ID_DICE_3,RESOURCE_ID_DICE_4,RESOURCE_ID_DICE_5,RESOURCE_ID_DICE_6,}; /*      */ void timer_call() /*            */ { if (first_time == false)/*      ... */ { bitmap_layer_destroy(image_layer); /* ...   ,     ... */ gbitmap_destroy(image); /* ...      */ } first_time = false; /*     */ image_layer = bitmap_layer_create(GRect(rand()%(144-75), rand()%(168-75), 75, 75)); /*     ,     */ layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(image_layer)); /*    */ image = gbitmap_create_with_resource(images[rand() % 6]); /*         */ bitmap_layer_set_bitmap(image_layer, image); /*      */ light_enable_interaction(); /*   */ if (timer_delay < 300*1000 ) /*      300... */ { timer_delay=timer_delay/0.7; /* ... ... */ app_timer_register(timer_delay/1000, timer_call, NULL); /* ...    */ } else /*     300... */ { timer_delay=1; /*       -        */ } } void accel_int(AccelAxisType axis, int32_t direction) /*     ... */ { if (first_time == true) /*    ... */ { text_layer_destroy(text_layer); /* ...      */ } timer_call(); /*   */ } int main(void) { window = window_create(); /*   */ window_set_background_color(window, GColorBlack); /*    */ window_set_fullscreen(window, true); /*   */ window_stack_push(window, true); /*     */ srand(time(NULL)); /*       */ text_layer = text_layer_create(GRect(0 , 30, 144, 168)); /*   ,     */ text_layer_set_text_color(text_layer, GColorWhite); /*    */ text_layer_set_background_color(text_layer, GColorClear); /*    */ text_layer_set_font(text_layer, fonts_get_system_font(FONT_KEY_GOTHIC_28)); /*   */ text_layer_set_text_alignment(text_layer, GTextAlignmentCenter); /*     */ layer_add_child(window_get_root_layer(window), text_layer_get_layer(text_layer)); /*         */ text_layer_set_text(text_layer, "    "); /*     */ accel_tap_service_subscribe(accel_int); /*      */ app_event_loop(); /*   */ if (first_time == true) /*     ... */ { text_layer_destroy(text_layer); /* ...      */ } else /*     ... */ { bitmap_layer_destroy(image_layer); /* ...   ... */ gbitmap_destroy(image); /* ...     ,       accel_int */ } accel_tap_service_unsubscribe(); /*     */ window_destroy(window); /*   ,   */ } 


うたくいく


, :


参照資料

画像 MagicPebble mypebblefaces.com
画像 - mypebblefaces.com
画像 mypebblefaces.com
画像 MagicPebble github.com
画像 - github.com
画像 github.com
画像 , Pebble , . ( « pebble »). , — .


Source: https://habr.com/ru/post/J204514/


All Articles