sprite animation testing
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

151 linhas
4.3KB

  1. ;----------------
  2. ; Animation Subs
  3. ;----------------
  4. struct Actor
  5. bytes 1, YPos
  6. bytes 1, XPos
  7. bytes 1, GFXCounter
  8. bytes 1, GFXState
  9. bytes 1, TileData
  10. words 1, GFXData
  11. end_struct
  12. SECTION "Actor STructs", WRAM0
  13. dstruct Actor, Player
  14. SECTION "Animation Variables", HRAM
  15. hCameraX: dw
  16. hCameraY: dw
  17. hWorkingX: dw
  18. hWorkingY: dw
  19. hWorkingScreenX: db
  20. hWorkingScreenY: db
  21. hWorkingState: db
  22. hWorkingCounter: db
  23. hWorkingData: dw
  24. hWorkingTile: db
  25. SECTION "Animations Subs", ROM0
  26. ; RenderActor:
  27. ; takes a pointer to an actor struct
  28. ; and renders it to shadow OAM, advancinc
  29. ; the animation frame and constructing
  30. ; each frame as needed.
  31. ; initial input:
  32. ; [hl] <- start of Actor Struct in WRAM
  33. ; output:
  34. ; an oam object for each line in the frame data,
  35. ; copied to shadowOAM (wShadowOAM)
  36. RenderActor::
  37. ; @input: hl <- Player
  38. ; @input: de <- ShadowOAM place
  39. ; clobbers af, bc, de, hl
  40. ld a, [hli] ; a <- YPos
  41. ldh [hWorkingScreenY], a
  42. ld a, [hli] ; a <- XPos
  43. ldh [hWorkingScreenX], a
  44. push hl ; save counter pointer on stack
  45. ld a, [hli] ; a <- GFXCounter
  46. ldh [hWorkingCounter], a
  47. ld a, [hli] ; a <- GFXState
  48. ldh [hWorkingState], a
  49. ld a, [hli] ; a <- TileData
  50. ldh [hWorkingTile], a
  51. ld a, [hli] ; a <- GFXData(Low)
  52. ld h, [hl] ; a <- GFXData (High)
  53. ld l, a
  54. ld a, [hWorkingState] ; add actor struct offset saved in wWorkingState
  55. rlca ; double state offset because of word length
  56. add a, l
  57. ld l, a
  58. adc a, h
  59. sub l
  60. ld h, a ; hl contains state struct pointer
  61. ld a, [hli] ;
  62. ld h, [hl] ; derefence [hl]
  63. ld l, a ;
  64. ld a, [hWorkingCounter]
  65. inc a
  66. ld b, a
  67. ld a, [hli] ; a <- state frame limit
  68. cp b
  69. ld a, b
  70. jr nc, .continueAnimation
  71. xor a
  72. .continueAnimation
  73. ldh [hWorkingCounter], a
  74. ld b, h ;
  75. ld c, l ; save current hl
  76. pop hl ; restore counter wram pointer
  77. ld [hl], a ;
  78. ld h, b ; restore hl
  79. ld l, c ;
  80. ld c, a ; save current frame in c
  81. xor a ; set a = 0
  82. .loopFrameFind ;
  83. ld b, a ; b <- current total
  84. ld a, [hli] ; a <- next frame tick limit
  85. add b ; add to limit
  86. cp c ; compare to limit
  87. jr nc, .foundFrame ; if no carry, cum total > current frame
  88. inc hl
  89. inc hl
  90. jr .loopFrameFind
  91. .foundFrame
  92. ld a, [hli]
  93. ld h, [hl]
  94. ld l, a ; hl <- pointer to frame data
  95. ld a, [hli]
  96. ld b, a ; b <- sprite counter
  97. .spriteLoop
  98. ld a, [hli] ; load Y position, then offset by -16
  99. ld c, a
  100. ld a, [hWorkingScreenY]
  101. add c
  102. ld c, 16
  103. add c
  104. ld [de], a ; store YPos in shadowOAM
  105. inc de
  106. ld a, [hli] ; load X position, then offset by -8
  107. ld c, a
  108. ld a, [hWorkingScreenX]
  109. add c
  110. ld c, 8
  111. add c
  112. ld [de], a ; store XPos in shadowOAM
  113. inc de
  114. ld a, [hli] ; load tile offset, and add to base tile pointer
  115. ld c, a
  116. ld a, [hWorkingTile]
  117. add c
  118. ld [de], a
  119. inc de
  120. ld a, [hli] ; load attributes and xor them
  121. ld c, a
  122. ld a, 0 ; TO DO: set base attributes
  123. xor c
  124. ld [de], a
  125. inc de
  126. dec b ; end of single sprite
  127. jr nz, .spriteLoop
  128. ret