Skip to content

Commit 898a808

Browse files
committed
lose half velocity on collision
1 parent 8253ffb commit 898a808

File tree

2 files changed

+57
-64
lines changed

2 files changed

+57
-64
lines changed
+55-62
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,100 @@
11
; this routine check if car pointed in a0 collides with
22
; car pointed in a1
33
DISTANCE_BETWEEN_CENTERS: dc.l 0
4-
SEPARATION_VECTOR: dc.l 0
5-
;APP: dc.l 0
4+
SEPARATION_VECTOR: dc.l 0
65
CHECK_COLLISIONS_WITH_OTHER_CAR:
7-
move.l a0,a2
8-
move.l a1,a3
6+
movea.l a0,a2
7+
movea.l a1,a3
98

109
; distance vector between 2 cars
11-
adda.l #MOVER_POSITION_OFFSET,a0
12-
adda.l #MOVER_POSITION_OFFSET,a1
13-
SUB2DVECTORSTATIC DISTANCE_BETWEEN_CENTERS
14-
;move.l DISTANCE_BETWEEN_CENTERS,APP
10+
adda.l #MOVER_POSITION_OFFSET,a0
11+
adda.l #MOVER_POSITION_OFFSET,a1
12+
SUB2DVECTORSTATIC DISTANCE_BETWEEN_CENTERS
1513

16-
move.l a2,a0
17-
move.l a3,a1
14+
movea.l a2,a0
15+
movea.l a3,a1
1816

1917
; get absolute values for the vector
20-
ABS_WORD DISTANCE_BETWEEN_CENTERS ; absolute x distance
21-
ABS_WORD DISTANCE_BETWEEN_CENTERS+2 ; absolute y distance
18+
ABS_WORD DISTANCE_BETWEEN_CENTERS ; absolute x distance
19+
ABS_WORD DISTANCE_BETWEEN_CENTERS+2 ; absolute y distance
2220

2321
; get half width for car 1 + half width of car 2
2422
;let shw = this.wheel_base/2 + othercar.wheel_base/2;
25-
move.w MOVER_WHEEL_BASE_OFFSET(a2),d0
26-
move.w MOVER_WHEEL_BASE_OFFSET(a3),d1
27-
add.w d1,d0
28-
lsl.w #6,d0
23+
move.w MOVER_WHEEL_BASE_OFFSET(a2),d0
24+
move.w MOVER_WHEEL_BASE_OFFSET(a3),d1
25+
add.w d1,d0
26+
lsl.w #6,d0
2927

3028
; half height sum
3129
;let shh = this.wheel_base/2 + othercar.wheel_base/2;
32-
move.w MOVER_WIDTH_DIV_2_OFFSET(a2),d2
33-
move.w MOVER_WIDTH_DIV_2_OFFSET(a2),d3
34-
add.w d3,d2
35-
lsl.w #6,d2
30+
move.w MOVER_WIDTH_DIV_2_OFFSET(a2),d2
31+
move.w MOVER_WIDTH_DIV_2_OFFSET(a2),d3
32+
add.w d3,d2
33+
lsl.w #6,d2
3634

3735
; if abs X value of distance vector is < then sum of half width of the 2 cars
3836
; I am sure they are not colliding, in this case just branch to car not collision
3937
;move.w #$0,$dff180
40-
cmp.w DISTANCE_BETWEEN_CENTERS,d0
41-
ble.w nocarcollision
38+
cmp.w DISTANCE_BETWEEN_CENTERS,d0
39+
ble.w nocarcollision
4240

4341
; if abs Y value of distance vector is < then sum of half height of the 2 cars
4442
; I am sure they are not colliding, in this case just branch to car not collision
45-
cmp.w DISTANCE_BETWEEN_CENTERS+2,d2
46-
ble.w nocarcollision
43+
cmp.w DISTANCE_BETWEEN_CENTERS+2,d2
44+
ble.w nocarcollision
4745

4846
; if we are here, it means car pointed in a0 is colliding with car in a1 (and car a1 is colliding with car in a0)
4947
; we must now resove the collision
5048

5149
; sx = sum of car widths / 2 - x absolute distance (which is on d0) ==> result in d1
52-
move.w d0,d1
53-
sub.w DISTANCE_BETWEEN_CENTERS,d1 ; d1 = sx
50+
move.w d0,d1
51+
sub.w DISTANCE_BETWEEN_CENTERS,d1 ; d1 = sx
5452

5553
; sy = sum of car heights / 2 - y absolute distance (which is on d2) ==> result in d3
56-
move.w d2,d3
57-
sub.w DISTANCE_BETWEEN_CENTERS+2,d3 ; d3 = sy
54+
move.w d2,d3
55+
sub.w DISTANCE_BETWEEN_CENTERS+2,d3 ; d3 = sy
5856

5957
; compare sx with sy, if sx is smaller, reset
60-
61-
move.l d3,d4
62-
move.l d4,d3
63-
cmp.w d1,d3
64-
ble.s sxgreaterthansy
65-
moveq #0,d3
66-
bra.s correctsign
58+
cmp.w d1,d3
59+
ble.s sxgreaterthansy
60+
moveq #0,d3
61+
bra.s correctsign
6762
sxgreaterthansy:
68-
moveq #0,d1
63+
moveq #0,d1
6964
correctsign:
70-
move.w MOVER_X_POSITION_OFFSET(a3),d4
71-
cmp.w MOVER_X_POSITION_OFFSET(a2),d4
72-
ble.s nochangexsign
73-
neg.w d1
65+
move.w MOVER_X_POSITION_OFFSET(a3),d4
66+
cmp.w MOVER_X_POSITION_OFFSET(a2),d4
67+
ble.s nochangexsign
68+
neg.w d1
7469
nochangexsign:
75-
move.w MOVER_Y_POSITION_OFFSET(a3),d4
76-
cmp.w MOVER_Y_POSITION_OFFSET(a2),d4
77-
ble.s nochangeysign
78-
neg.w d3
70+
move.w MOVER_Y_POSITION_OFFSET(a3),d4
71+
cmp.w MOVER_Y_POSITION_OFFSET(a2),d4
72+
ble.s nochangeysign
73+
neg.w d3
7974
nochangeysign
8075
;move.w #$FFFF,$dff180
8176

8277
; add separation vector to car position
83-
SETCARPROPERTYADDR MOVER_POSITION_OFFSET,a0
84-
move.w d1,SEPARATION_VECTOR
85-
move.w d3,SEPARATION_VECTOR+2
86-
;move.l SEPARATION_VECTOR,APP
87-
lea SEPARATION_VECTOR,a1
78+
lea SEPARATION_VECTOR(PC),a0
79+
move.w d1,(a0)
80+
move.w d3,2(a0)
81+
SETCARPROPERTYADDR MOVER_POSITION_OFFSET,a1
8882
ADD2DVECTOR
89-
move.l (a1),(a0)
9083

91-
; add SEPARATION_VECTOR to other
92-
move.w MOVER_X_VELOCITY_OFFSET(a2),d1
93-
move.w MOVER_Y_VELOCITY_OFFSET(a2),d3
94-
;lsr.w #4,d1
95-
;lsr.w #4,d3
96-
add.w d1,MOVER_X_VELOCITY_OFFSET(a3)
97-
add.w d3,MOVER_Y_VELOCITY_OFFSET(a3)
84+
move.w MOVER_X_VELOCITY_OFFSET(a2),d1
85+
move.w MOVER_Y_VELOCITY_OFFSET(a2),d3
9886

99-
sub.w d1,MOVER_X_VELOCITY_OFFSET(a2)
100-
sub.w d3,MOVER_Y_VELOCITY_OFFSET(a2)
87+
asr.w #1,d1
88+
asr.w #1,d3
10189

102-
nocarcollision:
90+
add.w d1,MOVER_X_VELOCITY_OFFSET(a3)
91+
add.w d3,MOVER_Y_VELOCITY_OFFSET(a3)
10392

93+
sub.w d1,MOVER_X_VELOCITY_OFFSET(a2)
94+
sub.w d3,MOVER_Y_VELOCITY_OFFSET(a2)
95+
96+
nocarcollision:
10497

105-
move.l a2,a0
106-
move.l a3,a1
98+
movea.l a2,a0
99+
movea.l a3,a1
107100
rts

rc_ocs/src/rc.s

+2-2
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,8 @@ moversloop:
415415
move.w #MAX_CARS-1,d6
416416
check_collisions_with_other_cars_loop:
417417
; skip check collisions with itself
418-
cmp.l a0,a1
419-
beq.s skip_check_collisions_with_other_cars
418+
cmp.l a0,a1
419+
beq.s skip_check_collisions_with_other_cars
420420

421421
; skip check collisions with cars not in play
422422
btst.b d6,CARS_IN_PLAY+1

0 commit comments

Comments
 (0)