movement finally friggen works after a lot of modifications to make it feel realistic with the given pixel size

This commit is contained in:
2025-04-06 22:22:08 -04:00
parent acea55b89e
commit c16948482c
+85 -70
View File
@@ -4,12 +4,12 @@
# CSCB58 Winter 2025 Assembly Final Project # CSCB58 Winter 2025 Assembly Final Project
# University of Toronto, Scarborough # University of Toronto, Scarborough
# #
# Student: Name, Student Number, UTorID, official email # Student: Jeremy Janella, 1010412215, janellaj, jeremy.janella@mail.utoronto.ca
# # Bitmap Display Configuration: # # Bitmap Display Configuration:
# - Unit width in pixels: 8 (update this as needed) # - Unit width in pixels: 8
# - Unit height in pixels: 8 (update this as needed) # - Unit height in pixels: 8
# - Display width in pixels: 1024 (update this as needed) # - Display width in pixels: 1024
# - Display height in pixels: 512 (update this as needed) # - Display height in pixels: 512
# - Base Address for Display: 0x10008000 ($gp) # - Base Address for Display: 0x10008000 ($gp)
# #
# Which milestoneshave been reached in this submission? # Which milestoneshave been reached in this submission?
@@ -38,71 +38,58 @@
.data .data
newline: .asciiz "\n"
resetting: .asciiz "Starting Main\n"
# Store the offsets from the ship position. First 2 are pod, second 4 are service module, last 2 are legs. 8 pixels total # Store the offsets from the ship position. First 2 are pod, second 4 are service module, last 2 are legs. 8 pixels total
S: .word 4 8 516 520 1028 1032 1536 1548 S: .word 4 8 516 520 1028 1032 1536 1548
# Store the screen behind the ship # Store the screen behind the ship
BH: .word 0:8 BH: .word 0:8
sw $t8, 8($a0) # Layer 1
sw $t8, 12($a0)
sw $t8, 516($a0) # Layer 2
sw $t8, 520($a0)
sw $t8, 524($a0)
sw $t8, 528($a0)
sw $t8, 1032($a0) # Layer 3
sw $t8, 1036($a0)
sw $t9, 1540($a0) # Layer 4
sw $t9, 1544($a0)
sw $t9, 1548($a0)
sw $t9, 1552($a0)
sw $t7, 2048($a0) # Layer 5
sw $t9, 2052($a0)
sw $t9, 2056($a0)
sw $t9, 2060($a0)
sw $t9, 2064($a0)
sw $t7, 2068($a0)
sw $t7, 2560($a0) # Layer 6
sw $t7, 2580($a0)
.eqv BASE_ADDRESS 0x10008000 .eqv BASE_ADDRESS 0x10008000
.text .text
.global main
main: main:
la $a0, resetting
li $v0, 4
syscall
li $s0, BASE_ADDRESS # $s0 stores the base address for display li $s0, BASE_ADDRESS # $s0 stores the base address for display
jal cBH # s1 is set later, ship position (including base address)
li $s2, 0 # s2 is the sub pixel y position, mod4
li $s3, 0 # s3 is the x velocity
li $s5, 0 # s5 stores subpixel y velocity
jal lev0 jal lev0
li $s2, 0 # initial x velocity is 0
li $s3, 0 # initial y velocity is 0 (-1 is upwards)
li $s4, 0
mainl: # Main Game loop mainlo: # Main Game loop
# # Read if input was sent
li $t0, 0xffff0000 li $t0, 0xffff0000
lw $t1, 0($t0) lw $t1, 0($t0)
beq $t1, 1, inp beq $t1, 1, inp # Apply input
main1: main1: # Apply gravity to velocity if not landed
beq $s4, 10, gravity li $t9, 0xff0000
main2: addi $s5, $s5, 1 # Add gravity to vertical velocity
jal land
beqz $v0, main2 # if not landed: skip
blez $s5, main2 # if ascending: skip
li $s3, 0
li $s5, 0
main2: # Draw changes
jal mship jal mship
# Sleep, 50ms, 20Hz # Sleep, 25ms, 40Hz
li $a0, 50 li $a0, 25
li $v0, 32 li $v0, 32
syscall syscall
addi $s4, $s4, 1 j mainlo
j mainl
gravity:# Apply gravity
addi $s3, $s3, 1
li $s4, 0
j main2
inp: # Handle input inp: # Handle input
lw $t0, 4($t0) # t0 = ascii code of input lw $t0, 4($t0) # t0 = ascii code of input
@@ -115,15 +102,15 @@ inp: # Handle input
j main1 # return to main loop j main1 # return to main loop
inpa: # accelerate left is pushed inpa: # accelerate left is pushed
addi $s2, $s2, -1 addi $s3, $s3, -4
j main1 j main1
inpw: # accelerate up is pushed inpw: # increase thrust is pushed
addi $s3, $s3, -1 addi $s5, $s5, -32
j main1 j main1
inpd: # accelerate right is pushed inpd: # accelerate right is pushed
addi $s2, $s2, 1 addi $s3, $s3, 4
j main1 j main1
inpr:# reset if r if pressed inpr:# reset if r if pressed
@@ -154,24 +141,26 @@ lev0: # Prepare level 0
jal dtur jal dtur
addi $a0, $s0, 30220 # Draw medium platform addi $a0, $s0, 30220 # Draw medium platform
jal dmp jal dmp
addi $s1, $s0, 28184 # s1 stores the players position. 27984 is spawn addi $s1, $s0, 28188
jal mship
jal cBH
jal dship jal dship
lw $t0, 0($sp) lw $t0, 0($sp)
addi $sp, $sp, 4 # Return to main from the stack addi $sp, $sp, 4 # Return to main from the stack
jr $t0 jr $t0
cBH: # Clean bheind ship buffer cBH: # Clean behind ship buffer
la $t0, BH # &B[i] la $t0, BH # &B[i]
li $t1, 0 # Counter li $t1, 0 # Counter
sw 0x0, 0($t0) # B[i] = black li $t9, 0 # Draw black into the behind ship buffer
cBH1: sw $t9, 0($t0) # B[i] = black
addi $t1, $t1, 1 addi $t1, $t1, 1
addi $t0, $t0, 4 addi $t0, $t0, 4
beq $t1, 8, cBH1 bne $t1, 8, cBH1
cBH1: jr $ra cBH2: jr $ra
ss: # Set the screen ss: # Set the screen
@@ -422,11 +411,13 @@ dland1: jr $ra
land: # Return 1 in v0 iff spaceship is landed. Checks $s1 for the ships position. Landed iff neither black or white under both feet land: # Return 1 in v0 iff spaceship is landed. Checks $s1 for the ships position. Landed iff neither black or white under both feet
addi $t0, $s1, 3056 # Load the pixel under left leg addi $t0, $s1, 2048 # Load the pixel under left leg
lw $t0, 0($t0)
beqz $t0, land1 # Not landed if white star or black space under foot beqz $t0, land1 # Not landed if white star or black space under foot
beq $t0, 0xffffff, land1 beq $t0, 0xffffff, land1
j landtr j landtr
land1: addi $t0, $s1, 3076 # Load the pixel under right leg land1: addi $t0, $s1, 2048 # Load the pixel under right leg
lw $t0, 0($t0)
beqz $t0, landfa # Not landed if white star or black space under foot beqz $t0, landfa # Not landed if white star or black space under foot
beq $t0, 0xffffff, landfa beq $t0, 0xffffff, landfa
j landtr j landtr
@@ -438,7 +429,6 @@ landtr: li $v0, 1
jr $ra jr $ra
mship : # move the ship (in $s1) by ($a0, $a1). mship : # move the ship (in $s1) by ($a0, $a1).
# 1. Write the saved pixel over the ship # 1. Write the saved pixel over the ship
# 2. save the pixels in the new position # 2. save the pixels in the new position
@@ -461,17 +451,40 @@ mship1: lw $t1, 0($t0) # t1 = S[i]
addi $t3, $t3, 1 addi $t3, $t3, 1
bne $t3, 8, mship1 bne $t3, 8, mship1
# Calculate the new position # X before move
sll $t0, $s2, 2 sub $t5, $s1, $s0
add $s1, $s1, $t0 andi $t5, $t5, 511
sll $t0, $s3, 9 bge $t5, 500, main
# Calculate the new position, vert velocity is 1/32 as fast as whatever is stored to allow more granularity
add $s1, $s1, $s3 # position accumulates x velocity
add $s2, $s2, $s5 # y subpix pos += y subpix vel
andi $t0, $s2, 0xffffffe0
andi $s2, $s2, 0x0000001f
sll $t0, $t0, 4
add $s1, $s1, $t0 add $s1, $s1, $t0
# X after move
sub $t6, $s1, $s0
andi $t6, $t6, 511
bge $t6, 500, main
# Difference should equal x velocity, otherwise hit an edge
sub $t0, $t6, $t5
bne $t0, $s3, main
# Reset if the player is out of screen # Reset if the player is out of screen
blt $s1, $s0, main blt $s1, $s0, main
addi $t0, $s0, 29696 addi $t0, $s0, 31220
bgt $s1, $t0, main bgt $s1, $t0, main
# 2. save the pixels in the new position # 2. save the pixels in the new position
li $t3, 0 # counter i li $t3, 0 # counter i
la $t0, S # t0 = &S la $t0, S # t0 = &S
@@ -495,11 +508,13 @@ mship2: lw $t1, 0($t0) # t1 = S[i]
dbgd: # Debug print an int
li $v0, 1
syscall
la $a0, newline
li $v0, 4
syscall
jr $ra