Hello to everyone,
I'm working on an Arkanoid clone for NES all in ASM 6052 just for fun, currently, in my game, the ball collide fine with the walls, with the paddle player and I'm really happy for this. But, when I try to compute the collision with the bricks, somethings goes wrong.
The collision detection with the ball is simple, i get the position of the ball and i check if the ball is in the brick corner, this for all bricks ( in this code there are only 2 bricks ), every bricks is composed by 3 tiles with 8 pixels of height and 12 pixels of weight. So i increase my X register to get the positions of the corners that are stored here:
The strange things is that if I use only one brick and finish the check by CPX #$0C, everythings works great, BUT if i put two bricks as in the example code and i finish the cicle by compater CPX #$18 for some reason it get just the second brick, the first brick is ignored. I really can't understand where I'm wrong. Anyone can help me?
Thanks a lot and sorry for my English!
I'm working on an Arkanoid clone for NES all in ASM 6052 just for fun, currently, in my game, the ball collide fine with the walls, with the paddle player and I'm really happy for this. But, when I try to compute the collision with the bricks, somethings goes wrong.
Code:
;=====================================
; Ball Collision Detection With Bricks
;=====================================
CheckCollisionOnAllBricks:
LDX #$00
CheckCollisionOnAllBricksLoop:
LDA brick_sprites, x
;Y MIN
CMP BALL_POS_Y
BCS PerformBallNotHitBrick
;Y MAX
CLC
ADC #$08
CMP BALL_POS_Y
BCC PerformBallNotHitBrick
;X MIN
INX
INX
INX
LDA brick_sprites, x
DEX
DEX
DEX
CMP BALL_POS_X
BCS PerformBallNotHitBrick
;X MAX
CLC
ADC #$18
CMP BALL_POS_X
BCC PerformBallNotHitBrick
; Collisione
PerformBallCollisionWithBrick:
LDA #$01
STA $0212
JMP CCCOABContinueLoop
PerformBallNotHitBrick:
LDA #$00
STA $0212
JMP CCCOABContinueLoop
CCCOABContinueLoop:
INX
INX
INX
INX
INX
INX
INX
INX
INX
INX
INX
INX
CPX #$18
BNE CheckCollisionOnAllBricksLoop
; Ball Collision Detection With Bricks
;=====================================
CheckCollisionOnAllBricks:
LDX #$00
CheckCollisionOnAllBricksLoop:
LDA brick_sprites, x
;Y MIN
CMP BALL_POS_Y
BCS PerformBallNotHitBrick
;Y MAX
CLC
ADC #$08
CMP BALL_POS_Y
BCC PerformBallNotHitBrick
;X MIN
INX
INX
INX
LDA brick_sprites, x
DEX
DEX
DEX
CMP BALL_POS_X
BCS PerformBallNotHitBrick
;X MAX
CLC
ADC #$18
CMP BALL_POS_X
BCC PerformBallNotHitBrick
; Collisione
PerformBallCollisionWithBrick:
LDA #$01
STA $0212
JMP CCCOABContinueLoop
PerformBallNotHitBrick:
LDA #$00
STA $0212
JMP CCCOABContinueLoop
CCCOABContinueLoop:
INX
INX
INX
INX
INX
INX
INX
INX
INX
INX
INX
INX
CPX #$18
BNE CheckCollisionOnAllBricksLoop
The collision detection with the ball is simple, i get the position of the ball and i check if the ball is in the brick corner, this for all bricks ( in this code there are only 2 bricks ), every bricks is composed by 3 tiles with 8 pixels of height and 12 pixels of weight. So i increase my X register to get the positions of the corners that are stored here:
Code:
brick_sprites:
;yPos tile attr xPos
.db $3A, $04, $0A, $70 ;sprite 0
.db $3A, $05, $0A, $78 ;sprite 1
.db $3A, $06, $0A, $7F ;sprite 2
.db $22, $04, $0A, $87 ;sprite 0
.db $22, $05, $0A, $8F ;sprite 1
.db $22, $06, $0A, $97 ;sprite 2
;yPos tile attr xPos
.db $3A, $04, $0A, $70 ;sprite 0
.db $3A, $05, $0A, $78 ;sprite 1
.db $3A, $06, $0A, $7F ;sprite 2
.db $22, $04, $0A, $87 ;sprite 0
.db $22, $05, $0A, $8F ;sprite 1
.db $22, $06, $0A, $97 ;sprite 2
The strange things is that if I use only one brick and finish the check by CPX #$0C, everythings works great, BUT if i put two bricks as in the example code and i finish the cicle by compater CPX #$18 for some reason it get just the second brick, the first brick is ignored. I really can't understand where I'm wrong. Anyone can help me?
Thanks a lot and sorry for my English!