diff options
author | Bad Diode <bd@badd10de.dev> | 2021-04-26 11:11:36 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-04-26 11:11:36 +0200 |
commit | 24887f28c3eb6d67a7c1a0803520b3fb728ee4f3 (patch) | |
tree | 3816d8f7f4e1d3d6c4bb6caf084cbb06d93e941c /src/gba-buttons.c | |
parent | 0f16e5bfb1738330a33b300067f86d363fd250bf (diff) | |
download | gba-experiments-24887f28c3eb6d67a7c1a0803520b3fb728ee4f3.tar.gz gba-experiments-24887f28c3eb6d67a7c1a0803520b3fb728ee4f3.zip |
Move code to relevant files for organization
Diffstat (limited to 'src/gba-buttons.c')
-rw-r--r-- | src/gba-buttons.c | 602 |
1 files changed, 597 insertions, 5 deletions
diff --git a/src/gba-buttons.c b/src/gba-buttons.c index 951b4dc..dd06351 100644 --- a/src/gba-buttons.c +++ b/src/gba-buttons.c | |||
@@ -1,3 +1,6 @@ | |||
1 | #include "common.h" | ||
2 | #include "sprites.h" | ||
3 | |||
1 | // 1bpp packed | 4 | // 1bpp packed |
2 | u32 gba_btn_a_data[] = { | 5 | u32 gba_btn_a_data[] = { |
3 | 0xc0300804, 0x844242c2, 0x030c1020, 0x21424243, | 6 | 0xc0300804, 0x844242c2, 0x030c1020, 0x21424243, |
@@ -133,11 +136,6 @@ u32 gba_btn_fx_startselect[] = { | |||
133 | 0x01800000, 0x00000000, 0x00000000, 0x00000004, | 136 | 0x01800000, 0x00000000, 0x00000000, 0x00000004, |
134 | }; | 137 | }; |
135 | 138 | ||
136 | typedef struct SpriteAnimation { | ||
137 | size_t *tile_offsets; | ||
138 | size_t n_frames; | ||
139 | } SpriteAnimation; | ||
140 | |||
141 | typedef enum {BTN_STATE_IDLE, BTN_STATE_PRESSED, BTN_STATE_RELEASED, BTN_STATE_HOLD} BtnState; | 139 | typedef enum {BTN_STATE_IDLE, BTN_STATE_PRESSED, BTN_STATE_RELEASED, BTN_STATE_HOLD} BtnState; |
142 | 140 | ||
143 | typedef struct AnimationEntry { | 141 | typedef struct AnimationEntry { |
@@ -262,3 +260,597 @@ AnimationEntry *btn_animation_startselect[] = { | |||
262 | {0, 0, 12, 1}, | 260 | {0, 0, 12, 1}, |
263 | }, | 261 | }, |
264 | }; | 262 | }; |
263 | |||
264 | typedef struct ButtonSprite { | ||
265 | ObjState *sprites; | ||
266 | AnimationEntry **animations; | ||
267 | size_t frame; | ||
268 | size_t n_obj; | ||
269 | size_t n_frames; | ||
270 | BtnState state; | ||
271 | } ButtonSprite; | ||
272 | |||
273 | void | ||
274 | init_button_sprite(ButtonSprite *btn) { | ||
275 | for (size_t i = 0; i < btn->n_obj; ++i) { | ||
276 | btn->sprites[i].id = load_packed_sprite_data( | ||
277 | btn->sprites[i].data, | ||
278 | btn->sprites[i].n_tiles, | ||
279 | btn->sprites[i].frames); | ||
280 | btn->sprites[i].base_tile = sprites[btn->sprites[i].id].tile_start; | ||
281 | } | ||
282 | } | ||
283 | |||
284 | void | ||
285 | button_tick(ButtonSprite *btn) { | ||
286 | // Nothing to do here. | ||
287 | if (btn->state == BTN_STATE_IDLE) { | ||
288 | return; | ||
289 | } | ||
290 | |||
291 | // Reset animation state. | ||
292 | if (btn->state == BTN_STATE_PRESSED && btn->frame != 0) { | ||
293 | btn->frame = 0; | ||
294 | } | ||
295 | |||
296 | // Continue the animation. | ||
297 | if (btn->state == BTN_STATE_HOLD || btn->state == BTN_STATE_PRESSED ) { | ||
298 | if(btn->frame < btn->n_frames - 1) { | ||
299 | btn->frame++; | ||
300 | } | ||
301 | } | ||
302 | |||
303 | // Finish the animation and return to idle. | ||
304 | if (btn->state == BTN_STATE_RELEASED) { | ||
305 | if (btn->frame > 0 && btn->frame < btn->n_frames - 1) { | ||
306 | btn->frame++; | ||
307 | } else { | ||
308 | btn->frame = 0; | ||
309 | btn->state = BTN_STATE_IDLE; | ||
310 | } | ||
311 | } | ||
312 | for (size_t i = 0; i < btn->n_obj; ++i) { | ||
313 | AnimationEntry anim_frame = btn->animations[i][btn->frame]; | ||
314 | int x = btn->sprites[i].x + anim_frame.x_offset; | ||
315 | int y = btn->sprites[i].y + anim_frame.y_offset; | ||
316 | int base_tile = btn->sprites[i].base_tile + anim_frame.tile_offset; | ||
317 | |||
318 | // Clear the previous x/y coordinate and base tiles. | ||
319 | btn->sprites[i].obj_attr_0 &= ~0xFF; | ||
320 | btn->sprites[i].obj_attr_1 &= ~0x1FF; | ||
321 | btn->sprites[i].obj_attr_2 &= ~0x3FF; | ||
322 | |||
323 | // Update x/y/tile and hidden state from the animations. | ||
324 | btn->sprites[i].obj_attr_0 |= OBJ_Y_COORD(y); | ||
325 | btn->sprites[i].obj_attr_1 |= OBJ_X_COORD(x); | ||
326 | btn->sprites[i].obj_attr_2 |= base_tile; | ||
327 | if (anim_frame.hidden) { | ||
328 | btn->sprites[i].obj_attr_0 |= OBJ_HIDDEN; | ||
329 | } else { | ||
330 | btn->sprites[i].obj_attr_0 &= ~OBJ_HIDDEN; | ||
331 | } | ||
332 | |||
333 | // Update OBJ attributes. | ||
334 | OBJ_ATTR_0(btn->sprites[i].id) = btn->sprites[i].obj_attr_0; | ||
335 | OBJ_ATTR_1(btn->sprites[i].id) = btn->sprites[i].obj_attr_1; | ||
336 | OBJ_ATTR_2(btn->sprites[i].id) = btn->sprites[i].obj_attr_2; | ||
337 | } | ||
338 | } | ||
339 | |||
340 | ButtonSprite buttons[] = { | ||
341 | // DOWN. | ||
342 | { | ||
343 | .frame = 0, | ||
344 | .n_obj = 3, | ||
345 | .n_frames = 8, | ||
346 | .state = BTN_STATE_RELEASED, | ||
347 | .animations = &btn_animation, | ||
348 | .sprites = &(ObjState[]){ | ||
349 | { | ||
350 | .id = 0, | ||
351 | .x = SCREEN_WIDTH / 2 - 64 - 16, | ||
352 | .y = SCREEN_HEIGHT / 2 + 29, | ||
353 | .data = &gba_btn_updown_data, | ||
354 | .n_tiles = 4, | ||
355 | .frames = 1, | ||
356 | .obj_attr_0 = 0, | ||
357 | .obj_attr_1 = OBJ_V_FLIP | OBJ_SIZE_MID, | ||
358 | .obj_attr_2 = 0 | ||
359 | }, | ||
360 | { | ||
361 | .id = 0, | ||
362 | .x = SCREEN_WIDTH / 2 - 64 - 16, | ||
363 | .y = SCREEN_HEIGHT / 2 + 29 + 11, | ||
364 | .data = &gba_btn_down_shadow_data, | ||
365 | .n_tiles = 2, | ||
366 | .frames = 1, | ||
367 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
368 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
369 | .obj_attr_2 = 0 | ||
370 | }, | ||
371 | { | ||
372 | .id = 0, | ||
373 | .x = SCREEN_WIDTH / 2 - 64 - 16 - 8, | ||
374 | .y = SCREEN_HEIGHT / 2 + 29 + 17, | ||
375 | .data = &gba_btn_fx_downup, | ||
376 | .n_tiles = 4, | ||
377 | .frames = 4, | ||
378 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
379 | .obj_attr_1 = OBJ_SIZE_MID, | ||
380 | .obj_attr_2 = 0 | ||
381 | }, | ||
382 | }, | ||
383 | }, | ||
384 | // UP. | ||
385 | { | ||
386 | .frame = 0, | ||
387 | .n_obj = 3, | ||
388 | .n_frames = 8, | ||
389 | .state = BTN_STATE_RELEASED, | ||
390 | .animations = &btn_animation, | ||
391 | .sprites = &(ObjState[]){ | ||
392 | { | ||
393 | .id = 0, | ||
394 | .x = SCREEN_WIDTH / 2 - 64 - 16, | ||
395 | .y = SCREEN_HEIGHT / 2 + 32 - 18, | ||
396 | .data = &gba_btn_updown_data, | ||
397 | .n_tiles = 4, | ||
398 | .frames = 1, | ||
399 | .obj_attr_0 = 0, | ||
400 | .obj_attr_1 = OBJ_SIZE_MID, | ||
401 | .obj_attr_2 = 0 | ||
402 | }, | ||
403 | { | ||
404 | .id = 0, | ||
405 | .x = SCREEN_WIDTH / 2 - 64 - 16, | ||
406 | .y = SCREEN_HEIGHT / 2 + 32 - 18 + 7, | ||
407 | .data = &gba_btn_up_shadow_data, | ||
408 | .n_tiles = 2, | ||
409 | .frames = 1, | ||
410 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
411 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
412 | .obj_attr_2 = 0 | ||
413 | }, | ||
414 | { | ||
415 | .id = 0, | ||
416 | .x = SCREEN_WIDTH / 2 - 64 - 16 - 8, | ||
417 | .y = SCREEN_HEIGHT / 2 + 32 - 18 - 7, | ||
418 | .data = &gba_btn_fx_downup, | ||
419 | .n_tiles = 4, | ||
420 | .frames = 4, | ||
421 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
422 | .obj_attr_1 = OBJ_V_FLIP | OBJ_SIZE_MID, | ||
423 | .obj_attr_2 = 0 | ||
424 | }, | ||
425 | }, | ||
426 | }, | ||
427 | // LEFT | ||
428 | { | ||
429 | .frame = 0, | ||
430 | .n_obj = 3, | ||
431 | .n_frames = 8, | ||
432 | .state = BTN_STATE_RELEASED, | ||
433 | .animations = &btn_animation, | ||
434 | .sprites = &(ObjState[]){ | ||
435 | { | ||
436 | .id = 0, | ||
437 | .x = SCREEN_WIDTH / 2 - 64 - 16 - 10, | ||
438 | .y = SCREEN_HEIGHT / 2 + 32 - 10, | ||
439 | .data = &gba_btn_leftright_data, | ||
440 | .n_tiles = 4, | ||
441 | .frames = 1, | ||
442 | .obj_attr_0 = 0, | ||
443 | .obj_attr_1 = OBJ_SIZE_MID, | ||
444 | .obj_attr_2 = 0 | ||
445 | }, | ||
446 | { | ||
447 | .id = 0, | ||
448 | .x = SCREEN_WIDTH / 2 - 64 - 16 - 10, | ||
449 | .y = SCREEN_HEIGHT / 2 + 32 - 10 + 6, | ||
450 | .data = &gba_btn_leftright_shadow_data, | ||
451 | .n_tiles = 2, | ||
452 | .frames = 1, | ||
453 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
454 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
455 | .obj_attr_2 = 0 | ||
456 | }, | ||
457 | { | ||
458 | .id = 0, | ||
459 | .x = SCREEN_WIDTH / 2 - 64 - 16 - 10 - 6, | ||
460 | .y = SCREEN_HEIGHT / 2 + 32 - 10 - 8, | ||
461 | .data = &gba_btn_fx_leftright, | ||
462 | .n_tiles = 4, | ||
463 | .frames = 4, | ||
464 | .obj_attr_0 = OBJ_SHAPE_TALL, | ||
465 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID, | ||
466 | .obj_attr_2 = 0 | ||
467 | }, | ||
468 | }, | ||
469 | }, | ||
470 | // RIGHT. | ||
471 | { | ||
472 | .frame = 0, | ||
473 | .n_obj = 3, | ||
474 | .n_frames = 8, | ||
475 | .state = BTN_STATE_RELEASED, | ||
476 | .animations = &btn_animation, | ||
477 | .sprites = &(ObjState[]){ | ||
478 | { | ||
479 | .id = 0, | ||
480 | .x = SCREEN_WIDTH / 2 - 64 - 16 + 11, | ||
481 | .y = SCREEN_HEIGHT / 2 + 32 - 10, | ||
482 | .data = &gba_btn_leftright_data, | ||
483 | .n_tiles = 4, | ||
484 | .frames = 1, | ||
485 | .obj_attr_0 = 0, | ||
486 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID, | ||
487 | .obj_attr_2 = 0 | ||
488 | }, | ||
489 | { | ||
490 | .id = 0, | ||
491 | .x = SCREEN_WIDTH / 2 - 64 - 16 + 11, | ||
492 | .y = SCREEN_HEIGHT / 2 + 32 - 10 + 6, | ||
493 | .data = &gba_btn_leftright_shadow_data, | ||
494 | .n_tiles = 2, | ||
495 | .frames = 1, | ||
496 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
497 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_SMALL, | ||
498 | .obj_attr_2 = 0 | ||
499 | }, | ||
500 | { | ||
501 | .id = 0, | ||
502 | .x = SCREEN_WIDTH / 2 - 64 - 16 + 11 + 14, | ||
503 | .y = SCREEN_HEIGHT / 2 + 32 - 10 - 8, | ||
504 | .data = &gba_btn_fx_leftright, | ||
505 | .n_tiles = 4, | ||
506 | .frames = 4, | ||
507 | .obj_attr_0 = OBJ_SHAPE_TALL, | ||
508 | .obj_attr_1 = OBJ_SIZE_MID, | ||
509 | .obj_attr_2 = 0 | ||
510 | }, | ||
511 | }, | ||
512 | }, | ||
513 | // L. | ||
514 | { | ||
515 | .frame = 0, | ||
516 | .n_obj = 3, | ||
517 | .n_frames = 8, | ||
518 | .state = BTN_STATE_RELEASED, | ||
519 | .animations = &btn_animation, | ||
520 | .sprites = &(ObjState[]){ | ||
521 | { | ||
522 | .id = 0, | ||
523 | .x = SCREEN_WIDTH / 2 - 64 - 28, | ||
524 | .y = SCREEN_HEIGHT / 2 - 32 - 20, | ||
525 | .data = &gba_btn_l_data, | ||
526 | .n_tiles = 2, | ||
527 | .frames = 1, | ||
528 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
529 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
530 | .obj_attr_2 = 0 | ||
531 | }, | ||
532 | { | ||
533 | .id = 0, | ||
534 | .x = SCREEN_WIDTH / 2 - 64 - 28, | ||
535 | .y = SCREEN_HEIGHT / 2 - 32 - 20 + 2, | ||
536 | .data = &gba_btn_lr_shadow_data, | ||
537 | .n_tiles = 2, | ||
538 | .frames = 1, | ||
539 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
540 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
541 | .obj_attr_2 = 0 | ||
542 | }, | ||
543 | { | ||
544 | .id = 0, | ||
545 | .x = SCREEN_WIDTH / 2 - 64 - 28 - 12, | ||
546 | .y = SCREEN_HEIGHT / 2 - 32 - 20 - 12, | ||
547 | .data = &gba_btn_fx_lr, | ||
548 | .n_tiles = 4, | ||
549 | .frames = 4, | ||
550 | .obj_attr_0 = OBJ_SHAPE_SQUARE, | ||
551 | .obj_attr_1 = OBJ_SIZE_MID, | ||
552 | .obj_attr_2 = 0 | ||
553 | }, | ||
554 | }, | ||
555 | }, | ||
556 | // R. | ||
557 | { | ||
558 | .frame = 0, | ||
559 | .n_obj = 3, | ||
560 | .n_frames = 8, | ||
561 | .state = BTN_STATE_RELEASED, | ||
562 | .animations = &btn_animation, | ||
563 | .sprites = &(ObjState[]){ | ||
564 | { | ||
565 | .id = 0, | ||
566 | .x = SCREEN_WIDTH / 2 + 32 + 20 + 24, | ||
567 | .y = SCREEN_HEIGHT / 2 - 32 - 20, | ||
568 | .data = &gba_btn_r_data, | ||
569 | .n_tiles = 2, | ||
570 | .frames = 1, | ||
571 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
572 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
573 | .obj_attr_2 = 0 | ||
574 | }, | ||
575 | { | ||
576 | .id = 0, | ||
577 | .x = SCREEN_WIDTH / 2 + 32 + 20 + 24, | ||
578 | .y = SCREEN_HEIGHT / 2 - 32 - 20 + 2, | ||
579 | .data = &gba_btn_lr_shadow_data, | ||
580 | .n_tiles = 2, | ||
581 | .frames = 1, | ||
582 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
583 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
584 | .obj_attr_2 = 0 | ||
585 | }, | ||
586 | { | ||
587 | .id = 0, | ||
588 | .x = SCREEN_WIDTH / 2 + 32 + 20 + 12 + 24, | ||
589 | .y = SCREEN_HEIGHT / 2 - 32 - 20 - 12, | ||
590 | .data = &gba_btn_fx_lr, | ||
591 | .n_tiles = 4, | ||
592 | .frames = 4, | ||
593 | .obj_attr_0 = OBJ_SHAPE_SQUARE, | ||
594 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID, | ||
595 | .obj_attr_2 = 0 | ||
596 | }, | ||
597 | }, | ||
598 | }, | ||
599 | // A. | ||
600 | { | ||
601 | .frame = 0, | ||
602 | .n_obj = 3, | ||
603 | .n_frames = 8, | ||
604 | .state = BTN_STATE_RELEASED, | ||
605 | .animations = &btn_animation_ab, | ||
606 | .sprites = &(ObjState[]){ | ||
607 | { | ||
608 | .id = 0, | ||
609 | .x = SCREEN_WIDTH / 2 + 32 + 20 + 20, | ||
610 | .y = SCREEN_HEIGHT / 2 + 32 - 16, | ||
611 | .data = &gba_btn_a_data, | ||
612 | .n_tiles = 4, | ||
613 | .frames = 1, | ||
614 | .obj_attr_0 = OBJ_SHAPE_SQUARE, | ||
615 | .obj_attr_1 = OBJ_SIZE_MID, | ||
616 | .obj_attr_2 = 0 | ||
617 | }, | ||
618 | { | ||
619 | .id = 0, | ||
620 | .x = SCREEN_WIDTH / 2 + 32 + 20 + 20, | ||
621 | .y = SCREEN_HEIGHT / 2 + 32 - 16 + 8, | ||
622 | .data = &gba_btn_ab_shadow_data, | ||
623 | .n_tiles = 2, | ||
624 | .frames = 1, | ||
625 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
626 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
627 | .obj_attr_2 = 0 | ||
628 | }, | ||
629 | { | ||
630 | .id = 0, | ||
631 | .x = SCREEN_WIDTH / 2 + 32 + 19 - 7 + 20, | ||
632 | .y = SCREEN_HEIGHT / 2 + 32 - 23, | ||
633 | .data = &gba_btn_fx_ab, | ||
634 | .n_tiles = 16, | ||
635 | .frames = 3, | ||
636 | .obj_attr_0 = OBJ_SHAPE_SQUARE, | ||
637 | .obj_attr_1 = OBJ_SIZE_BIG, | ||
638 | .obj_attr_2 = 0 | ||
639 | }, | ||
640 | }, | ||
641 | }, | ||
642 | // B. | ||
643 | { | ||
644 | .frame = 0, | ||
645 | .n_obj = 3, | ||
646 | .n_frames = 8, | ||
647 | .state = BTN_STATE_RELEASED, | ||
648 | .animations = &btn_animation_ab, | ||
649 | .sprites = &(ObjState[]){ | ||
650 | { | ||
651 | .id = 0, | ||
652 | .x = SCREEN_WIDTH / 2 + 32 + 20, | ||
653 | .y = SCREEN_HEIGHT / 2 + 32, | ||
654 | .data = &gba_btn_b_data, | ||
655 | .n_tiles = 4, | ||
656 | .frames = 1, | ||
657 | .obj_attr_0 = OBJ_SHAPE_SQUARE, | ||
658 | .obj_attr_1 = OBJ_SIZE_MID, | ||
659 | .obj_attr_2 = 0 | ||
660 | }, | ||
661 | { | ||
662 | .id = 0, | ||
663 | .x = SCREEN_WIDTH / 2 + 32 + 20, | ||
664 | .y = SCREEN_HEIGHT / 2 + 32 + 8, | ||
665 | .data = &gba_btn_ab_shadow_data, | ||
666 | .n_tiles = 2, | ||
667 | .frames = 1, | ||
668 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
669 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
670 | .obj_attr_2 = 0 | ||
671 | }, | ||
672 | { | ||
673 | .id = 0, | ||
674 | .x = SCREEN_WIDTH / 2 + 32 - 8 + 20, | ||
675 | .y = SCREEN_HEIGHT / 2 + 33 + 8 - 16, | ||
676 | .data = &gba_btn_fx_ab, | ||
677 | .n_tiles = 16, | ||
678 | .frames = 3, | ||
679 | .obj_attr_0 = OBJ_SHAPE_SQUARE, | ||
680 | .obj_attr_1 = OBJ_SIZE_BIG, | ||
681 | .obj_attr_2 = 0 | ||
682 | }, | ||
683 | }, | ||
684 | }, | ||
685 | // START. | ||
686 | { | ||
687 | .frame = 0, | ||
688 | .n_obj = 3, | ||
689 | .n_frames = 8, | ||
690 | .state = BTN_STATE_RELEASED, | ||
691 | .animations = &btn_animation_startselect, | ||
692 | .sprites = &(ObjState[]){ | ||
693 | { | ||
694 | .id = 0, | ||
695 | .x = SCREEN_WIDTH / 2 - 10 + 26 - 14, | ||
696 | .y = SCREEN_HEIGHT / 2 + 40 + 10, | ||
697 | .data = &gba_btn_startselect_data, | ||
698 | .n_tiles = 2, | ||
699 | .frames = 2, | ||
700 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
701 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
702 | .obj_attr_2 = 0 | ||
703 | }, | ||
704 | { | ||
705 | .id = 0, | ||
706 | .x = SCREEN_WIDTH / 2 - 18 + 26 - 14, | ||
707 | .y = SCREEN_HEIGHT / 2 + 46 + 10, | ||
708 | .data = &gba_btn_start_text, | ||
709 | .n_tiles = 4, | ||
710 | .frames = 1, | ||
711 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
712 | .obj_attr_1 = OBJ_SIZE_MID, | ||
713 | .obj_attr_2 = 0 | ||
714 | }, | ||
715 | { | ||
716 | .id = 0, | ||
717 | .x = SCREEN_WIDTH / 2 - 19 + 26 - 14, | ||
718 | .y = SCREEN_HEIGHT / 2 + 37 + 10, | ||
719 | .data = &gba_btn_fx_startselect, | ||
720 | .n_tiles = 4, | ||
721 | .frames = 4, | ||
722 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
723 | .obj_attr_1 = OBJ_SIZE_MID, | ||
724 | .obj_attr_2 = 0 | ||
725 | }, | ||
726 | }, | ||
727 | }, | ||
728 | // SELECT. | ||
729 | { | ||
730 | .frame = 0, | ||
731 | .n_obj = 3, | ||
732 | .n_frames = 8, | ||
733 | .state = BTN_STATE_RELEASED, | ||
734 | .animations = &btn_animation_startselect, | ||
735 | .sprites = &(ObjState[]){ | ||
736 | { | ||
737 | .id = 0, | ||
738 | .x = SCREEN_WIDTH / 2 - 10 - 14, | ||
739 | .y = SCREEN_HEIGHT / 2 + 40 + 10, | ||
740 | .data = &gba_btn_startselect_data, | ||
741 | .n_tiles = 2, | ||
742 | .frames = 2, | ||
743 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
744 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
745 | .obj_attr_2 = 0 | ||
746 | }, | ||
747 | { | ||
748 | .id = 0, | ||
749 | .x = SCREEN_WIDTH / 2 - 18 - 14, | ||
750 | .y = SCREEN_HEIGHT / 2 + 46 + 10, | ||
751 | .data = &gba_btn_select_text, | ||
752 | .n_tiles = 4, | ||
753 | .frames = 1, | ||
754 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
755 | .obj_attr_1 = OBJ_SIZE_MID, | ||
756 | .obj_attr_2 = 0 | ||
757 | }, | ||
758 | { | ||
759 | .id = 0, | ||
760 | .x = SCREEN_WIDTH / 2 - 19 - 14, | ||
761 | .y = SCREEN_HEIGHT / 2 + 37 + 10, | ||
762 | .data = &gba_btn_fx_startselect, | ||
763 | .n_tiles = 4, | ||
764 | .frames = 4, | ||
765 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
766 | .obj_attr_1 = OBJ_SIZE_MID, | ||
767 | .obj_attr_2 = 0 | ||
768 | }, | ||
769 | }, | ||
770 | }, | ||
771 | }; | ||
772 | |||
773 | static inline void | ||
774 | init_button_sprites(void) { | ||
775 | for (size_t i = 0; i < sizeof(buttons) / sizeof(ButtonSprite); ++i) { | ||
776 | init_button_sprite(&buttons[i]); | ||
777 | } | ||
778 | } | ||
779 | |||
780 | static inline void | ||
781 | update_button_sprites(void) { | ||
782 | if (key_pressed(KEY_DOWN)) { | ||
783 | buttons[0].state = BTN_STATE_PRESSED; | ||
784 | } else if (key_hold(KEY_DOWN)) { | ||
785 | buttons[0].state = BTN_STATE_HOLD; | ||
786 | } else { | ||
787 | buttons[0].state = BTN_STATE_RELEASED; | ||
788 | } | ||
789 | if (key_pressed(KEY_UP)) { | ||
790 | buttons[1].state = BTN_STATE_PRESSED; | ||
791 | } else if (key_hold(KEY_UP)) { | ||
792 | buttons[1].state = BTN_STATE_HOLD; | ||
793 | } else { | ||
794 | buttons[1].state = BTN_STATE_RELEASED; | ||
795 | } | ||
796 | if (key_pressed(KEY_LEFT)) { | ||
797 | buttons[2].state = BTN_STATE_PRESSED; | ||
798 | } else if (key_hold(KEY_LEFT)) { | ||
799 | buttons[2].state = BTN_STATE_HOLD; | ||
800 | } else { | ||
801 | buttons[2].state = BTN_STATE_RELEASED; | ||
802 | } | ||
803 | if (key_pressed(KEY_RIGHT)) { | ||
804 | buttons[3].state = BTN_STATE_PRESSED; | ||
805 | } else if (key_hold(KEY_RIGHT)) { | ||
806 | buttons[3].state = BTN_STATE_HOLD; | ||
807 | } else { | ||
808 | buttons[3].state = BTN_STATE_RELEASED; | ||
809 | } | ||
810 | if (key_pressed(KEY_L)) { | ||
811 | buttons[4].state = BTN_STATE_PRESSED; | ||
812 | } else if (key_hold(KEY_L)) { | ||
813 | buttons[4].state = BTN_STATE_HOLD; | ||
814 | } else { | ||
815 | buttons[4].state = BTN_STATE_RELEASED; | ||
816 | } | ||
817 | if (key_pressed(KEY_R)) { | ||
818 | buttons[5].state = BTN_STATE_PRESSED; | ||
819 | } else if (key_hold(KEY_R)) { | ||
820 | buttons[5].state = BTN_STATE_HOLD; | ||
821 | } else { | ||
822 | buttons[5].state = BTN_STATE_RELEASED; | ||
823 | } | ||
824 | if (key_pressed(KEY_A)) { | ||
825 | buttons[6].state = BTN_STATE_PRESSED; | ||
826 | } else if (key_hold(KEY_A)) { | ||
827 | buttons[6].state = BTN_STATE_HOLD; | ||
828 | } else { | ||
829 | buttons[6].state = BTN_STATE_RELEASED; | ||
830 | } | ||
831 | if (key_pressed(KEY_B)) { | ||
832 | buttons[7].state = BTN_STATE_PRESSED; | ||
833 | } else if (key_hold(KEY_B)) { | ||
834 | buttons[7].state = BTN_STATE_HOLD; | ||
835 | } else { | ||
836 | buttons[7].state = BTN_STATE_RELEASED; | ||
837 | } | ||
838 | if (key_pressed(KEY_START)) { | ||
839 | buttons[8].state = BTN_STATE_PRESSED; | ||
840 | } else if (key_hold(KEY_START)) { | ||
841 | buttons[8].state = BTN_STATE_HOLD; | ||
842 | } else { | ||
843 | buttons[8].state = BTN_STATE_RELEASED; | ||
844 | } | ||
845 | if (key_pressed(KEY_SELECT)) { | ||
846 | buttons[9].state = BTN_STATE_PRESSED; | ||
847 | } else if (key_hold(KEY_SELECT)) { | ||
848 | buttons[9].state = BTN_STATE_HOLD; | ||
849 | } else { | ||
850 | buttons[9].state = BTN_STATE_RELEASED; | ||
851 | } | ||
852 | |||
853 | for (size_t i = 0; i < sizeof(buttons) / sizeof(ButtonSprite); ++i) { | ||
854 | button_tick(&buttons[i]); | ||
855 | } | ||
856 | } | ||