collisions
This commit is contained in:
parent
3bdf1a28c1
commit
0b4f05e1c2
@ -8,6 +8,8 @@
|
||||
;; Variables declared in RAM zero-page
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
.segment "ZEROPAGE"
|
||||
Collision: .res 1 ; 0 or 1, if 0 no collision, if 1, collisison
|
||||
|
||||
Buttons: .res 1 ; Pressed buttons (A|B|Sel|Start|Up|Dwn|Lft|Rgt)
|
||||
PrevButtons: .res 1 ; Stores the previous buttons from the last frame
|
||||
|
||||
@ -39,6 +41,11 @@ ParamYPos: .res 1 ; Used as parameter to subroutine
|
||||
ParamTileNum: .res 1 ; Used as parameter to subroutine
|
||||
ParamNumTiles: .res 1 ; Used as parameter to subroutine
|
||||
ParamAttribs: .res 1 ; Used as parameter to subroutine
|
||||
ParamRectX1: .res 1 ; Used as parameter to subroutine
|
||||
ParamRectY1: .res 1 ; Used as parameter to subroutine
|
||||
ParamRectX2: .res 1 ; Used as parameter to subroutine
|
||||
ParamRectY2: .res 1 ; Used as parameter to subroutine
|
||||
|
||||
|
||||
PrevOAMCount: .res 1 ; Store the previous number of bytes that were sent to the OAM
|
||||
|
||||
@ -327,6 +334,103 @@ EndRoutine:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Subroutine to check collisions
|
||||
;; PARAMS: ParamXPos, ParamYPos (x and y of missile)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
.proc CheckEnemyCollision
|
||||
txa
|
||||
pha ; Push and save the X register in the stack
|
||||
|
||||
ldx #0
|
||||
stx Collision ; Collision = 0
|
||||
|
||||
EnemiesCollisionLoop:
|
||||
cpx #MAX_ACTORS * .sizeof(Actor)
|
||||
beq FinishCollisionCheck
|
||||
lda ActorsArray+Actor::Type,x
|
||||
cmp #ActorType::AIRPLANE
|
||||
bne NextEnemy ; If not an airplane - skip to next enemy type
|
||||
|
||||
;; LOAD BOUNDING BOX X1,Y1,X2,Y2
|
||||
lda ActorsArray+Actor::XPos,x ; Bounding Box X1Y1
|
||||
sta ParamRectX1
|
||||
lda ActorsArray+Actor::YPos,y
|
||||
sta ParamRectY1
|
||||
|
||||
lda ActorsArray+Actor::XPos,x ; Bounding Box X2Y2
|
||||
clc
|
||||
adc #22 ; Get right value of the airplane bounding box by adding 22
|
||||
sta ParamRectX2
|
||||
|
||||
lda ActorsArray+Actor::YPos,y ; Bottom of box by adding 8, one sprite tall
|
||||
clc
|
||||
adc #8
|
||||
sta ParamRectY2
|
||||
|
||||
jsr IsPointInsideBoundingBox
|
||||
|
||||
lda Collision
|
||||
beq NextEnemy
|
||||
lda #ActorType::NULL
|
||||
sta ActorsArray+Actor::Type,x
|
||||
jmp FinishCollisionCheck
|
||||
|
||||
NextEnemy:
|
||||
txa
|
||||
clc
|
||||
adc #.sizeof(Actor)
|
||||
tax
|
||||
jmp EnemiesCollisionLoop
|
||||
|
||||
FinishCollisionCheck:
|
||||
pla
|
||||
tax
|
||||
|
||||
rts
|
||||
.endproc
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Subroutine to check if a point is inside a bounding box.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Params:
|
||||
;; (ParamXPos, ParamYPos) - coords to be tested
|
||||
;; (ParamRectX1,ParamRectY1,ParamRectX2,ParamRectY2) Are rectangle coords)
|
||||
;; Output:
|
||||
;; Collision flag is either 1 or 0
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
.proc IsPointInsideBoundingBox
|
||||
lda ParamXPos
|
||||
cmp ParamRectX1
|
||||
bcc PointIsOutside
|
||||
|
||||
lda ParamYPos
|
||||
cmp ParamRectY1
|
||||
bcc PointIsOutside
|
||||
|
||||
lda ParamXPos
|
||||
cmp ParamRectX2
|
||||
bcs PointIsOutside
|
||||
|
||||
lda ParamYPos
|
||||
cmp ParamRectY2
|
||||
bcs PointIsOutside
|
||||
|
||||
PointIsInside:
|
||||
lda #1
|
||||
sta Collision
|
||||
jmp EndCollisionCheck
|
||||
|
||||
PointIsOutside:
|
||||
lda #0
|
||||
sta Collision
|
||||
|
||||
EndCollisionCheck:
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Subroutine to loop all actors and update them (position, velocity, etc.)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
@ -345,6 +449,27 @@ EndRoutine:
|
||||
lda #ActorType::NULL
|
||||
sta ActorsArray+Actor::Type,x ; Remove the missile from the array
|
||||
SkipMissile:
|
||||
|
||||
CheckCollision:
|
||||
lda ActorsArray+Actor::XPos,x
|
||||
clc
|
||||
adc #3
|
||||
sta ParamXPos ; Missile position to be checked X += 3
|
||||
|
||||
lda ActorsArray+Actor::YPos,y
|
||||
clc
|
||||
adc #1
|
||||
sta ParamYPos ; Missile position to be checked Y += 1
|
||||
|
||||
jsr CheckEnemyCollision ; Perform collision check between the missile and other enemy actor
|
||||
|
||||
lda Collision
|
||||
beq NoCollisionFound
|
||||
lda #ActorType::NULL
|
||||
sta ActorsArray+Actor::Type,x
|
||||
NoCollisionFound:
|
||||
|
||||
|
||||
jmp NextActor
|
||||
:
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user