Use a direction value instead of dx, dy pair for movement

This commit is contained in:
Juhani Krekelä 2023-01-14 21:33:02 +02:00
parent 8246dc5240
commit c81dee26f2
1 changed files with 62 additions and 41 deletions

103
mato8.asm
View File

@ -11,11 +11,15 @@ define down_key 8
define left_key 4 define left_key 4
define right_key 6 define right_key 6
define game_over_reg v8 define direction_up 0
define fruit_x_reg v9 define direction_down 6
define fruit_y_reg va define direction_left 12
define head_dx_reg vb define direction_right 18
define head_dy_reg vc
define game_over_reg v9
define fruit_x_reg va
define fruit_y_reg vb
define head_direction_reg vc
define head_x_reg vd define head_x_reg vd
define head_y_reg ve define head_y_reg ve
@ -26,8 +30,7 @@ start:
rnd head_x_reg, 63 rnd head_x_reg, 63
rnd head_y_reg, 31 rnd head_y_reg, 31
ld head_dx_reg, 1 ld head_direction_reg, direction_right
ld head_dy_reg, 0
ld i, single_pixel ld i, single_pixel
drw head_x_reg, head_y_reg, 1 drw head_x_reg, head_y_reg, 1
@ -40,19 +43,19 @@ mainloop:
ld v0, up_key ld v0, up_key
sknp v0 sknp v0
call dir_up call turn_up
ld v0, down_key ld v0, down_key
sknp v0 sknp v0
call dir_down call turn_down
ld v0, left_key ld v0, left_key
sknp v0 sknp v0
call dir_left call turn_left
ld v0, right_key ld v0, right_key
sknp v0 sknp v0
call dir_right call turn_right
call move_snake call move_snake
@ -106,54 +109,72 @@ spawn_fruit:
ret ret
dir_up: turn_up:
; Allow only 90° turns ; Don't allow 180° turns (which would kill the snake instantly)
se head_dy_reg, 0 se head_direction_reg, direction_down
ret ld head_direction_reg, direction_up
ld head_dx_reg, 0
ld head_dy_reg, #ff
ret ret
dir_down: turn_down:
se head_dy_reg, 0 se head_direction_reg, direction_up
ret ld head_direction_reg, direction_down
ld head_dx_reg, 0
ld head_dy_reg, 1
ret ret
dir_left: turn_left:
se head_dx_reg, 0 se head_direction_reg, direction_right
ret ld head_direction_reg, direction_left
ld head_dx_reg, #ff
ld head_dy_reg, 0
ret ret
dir_right: turn_right:
se head_dx_reg, 0 se head_direction_reg, direction_left
ret ld head_direction_reg, direction_right
ld head_dx_reg, 1
ld head_dy_reg, 0
ret ret
move_snake: move_snake:
ld v0, head_x_reg ld v0, head_direction_reg
add head_x_reg, head_dx_reg call unpack_direction
ld v2, 63
and head_x_reg, v2
ld v1, head_y_reg ld v2, head_x_reg
add head_y_reg, head_dy_reg add head_x_reg, v0
ld v2, 31 ld v0, 63
and head_y_reg, v2 and head_x_reg, v0
ld v3, head_y_reg
add head_y_reg, v1
ld v0, 31
and head_y_reg, v0
ld i, single_pixel ld i, single_pixel
drw head_x_reg, head_y_reg, 1 drw head_x_reg, head_y_reg, 1
se vf, 0 se vf, 0
call collision call collision
drw v0, v1, 1 drw v2, v3, 1
ret ret
unpack_direction:
jp v0, unpack_direction_table
unpack_direction_table:
; Up
ld v0, 0
ld v1, #ff
ret
; Down
ld v0, 0
ld v1, 1
ret
; Left
ld v0, #ff
ld v1, 0
ret
; Right
ld v0, 1
ld v1, 0
ret
collision: collision:
se head_x_reg, fruit_x_reg se head_x_reg, fruit_x_reg
jp tail_collision jp tail_collision