1
0
Disbranĉigi 0

'Physics', jump arc

This commit is contained in:
Jaidyn Ann 2020-07-21 03:28:20 -05:00
parent cc4cf42cf0
commit ac8792ff3b
2 changed files with 83 additions and 30 deletions

113
sbp.mfk
View File

@ -2,7 +2,6 @@
// SUPERPANSKATOL' // SUPERPANSKATOL'
// Based on Garydos'es Pong example // Based on Garydos'es Pong example
import random
import nes_joy import nes_joy
segment(chrrom) const array graphics @ $0000 = file("tileset.chr") segment(chrrom) const array graphics @ $0000 = file("tileset.chr")
@ -25,9 +24,13 @@ struct Entity {
Sprite top1, // right side, please kill me Sprite top1, // right side, please kill me
Sprite bottom1, Sprite bottom1,
// all this can be crammed into a byte (if merge dircount w frame) `o`
// note to self: do that
byte movement, // 0-3; idle, walk, jump/fall byte movement, // 0-3; idle, walk, jump/fall
byte direction, byte jump, // 0/1
byte frame // internal count used for animation byte direction, // 0/1
byte dircount, // counter for time-limited movement; i.e., jumping
byte frame // internal count used for animation; max 5
} }
// ============================================================================ // ============================================================================
@ -86,7 +89,8 @@ const byte LEFTWALL = $04
// ------------------------------------- // -------------------------------------
// i don't actually remember if the super crate box guy is named sam or not // i don't actually remember if the super crate box guy is named sam or not
// or if he even has a name? // or if he even has a name?
const byte SAM_HEIGHT = $20 // height of each paddle in pixels const byte SAM_WALKSPEED = 2
const byte SAM_FALLSPEED = 4
const byte SAM_ATTR = %00000001 const byte SAM_ATTR = %00000001
const byte SAM_ATTR_HFLIP = %01000001 const byte SAM_ATTR_HFLIP = %01000001
const byte SAM_ATTR_VFLIP = %10000001 const byte SAM_ATTR_VFLIP = %10000001
@ -118,6 +122,7 @@ const array SAM_WALK = [ $64, $74, $65, $75,
// quite important uwu // quite important uwu
void main() { void main() {
sam.dircount = 0
gamestate = STATETITLE gamestate = STATETITLE
title_init() title_init()
while(true){} // all work is done in nmi while(true){} // all work is done in nmi
@ -257,8 +262,6 @@ void title_init() {
void title_logic() { void title_logic() {
read_joy1() read_joy1()
if input_start != 0 { if input_start != 0 {
rand_seed = framecounter //seed the random number generator with the amount of frames
//that have passed since the title screen was shown
gamestate = STATEPLAYING gamestate = STATEPLAYING
ingame_init() ingame_init()
return return
@ -287,6 +290,9 @@ void ingame_init() {
//re-enable the screen and nmi //re-enable the screen and nmi
ppu_ctrl = %10010000 // enable NMI, sprites from Pattern Table 0, background from Pattern Table 1 ppu_ctrl = %10010000 // enable NMI, sprites from Pattern Table 0, background from Pattern Table 1
ppu_mask = %00011110 // enable sprites, enable background, no clipping on left side ppu_mask = %00011110 // enable sprites, enable background, no clipping on left side
sam.top0.y = 40
sam.top0.x = 50
} }
void ingame_logic() { void ingame_logic() {
@ -316,38 +322,28 @@ void ingame_input ( ) {
read_joy1() read_joy1()
sam.movement = 0 sam.movement = 0
// up
if input_dy < 0 {
if (sam.top0.y > TOPWALL) {
sam.top0.y -= 2
}
}
// down
else if input_dy > 0 {
if (sam.top0.y + SAM_HEIGHT) < BOTTOMWALL {
sam.top0.y += 2
}
}
// left // left
if input_dx < 0 { if ( input_dx < 0 ) {
sam.direction = 0 sam.direction = 0
sam.top0.x -= 2 sam.movement = 1
sam.movement = 1
} }
// right // right
else if input_dx > 0 { else if ( input_dx > 0 ) {
sam.direction = 1 sam.direction = 1
sam.top0.x += 2 sam.movement = 1
sam.movement = 1 }
// a button
if ( input_btn == 1 && sam.jump == 0 ) {
sam.jump = 1
sam.dircount = 0
} }
} }
void update_ingame_sprites ( ) void update_ingame_sprites ( )
{ {
// player. sam is the player. // player. sam is the player.
update_entity( pointer.Entity( sam.addr ), update_entity( pointer.Entity( sam.addr ), SAM_IDLE, SAM_WALK )
sam.top0.x, sam.top0.y, SAM_IDLE, SAM_WALK)
} }
macro void load_ingame_attr_table() { macro void load_ingame_attr_table() {
@ -452,8 +448,13 @@ macro void draw_boundaries_background() {
// ------------------------------------- // -------------------------------------
// SPRITES // SPRITES
// ------------------------------------- // -------------------------------------
void update_entity ( pointer.Entity ent, pointer idle, pointer walk ) {
entity_physics( ent )
entity_sprite( ent, ent[0].top0.x, ent[0].top0.y, idle, walk )
}
// sets the current frame of ent's animation and determines which animation to use // sets the current frame of ent's animation and determines which animation to use
void update_entity ( pointer.Entity ent, byte xx, byte yy, pointer idle, pointer walk ) { void entity_sprite ( pointer.Entity ent, byte xx, byte yy, pointer idle, pointer walk ) {
if ( ent[0].direction == 0 ) { if ( ent[0].direction == 0 ) {
ent[0].top0.attrs = SAM_ATTR_HFLIP ent[0].top0.attrs = SAM_ATTR_HFLIP
ent[0].bottom0.attrs = SAM_ATTR_HFLIP ent[0].bottom0.attrs = SAM_ATTR_HFLIP
@ -498,7 +499,12 @@ void update_entity ( pointer.Entity ent, byte xx, byte yy, pointer idle, pointer
ani = 0 ani = 0
} }
if ( ent[0].movement == 1 ) { if ( ent[0].jump == 1 ) {
ent[0].top0.tile = idle[0]
ent[0].bottom0.tile = idle[1]
ent[0].top1.tile = idle[2]
ent[0].bottom1.tile = idle[3]
} else if ( ent[0].movement == 1 ) {
ent[0].top0.tile = walk[ani + 0] ent[0].top0.tile = walk[ani + 0]
ent[0].bottom0.tile = walk[ani + 1] ent[0].bottom0.tile = walk[ani + 1]
ent[0].top1.tile = walk[ani + 2] ent[0].top1.tile = walk[ani + 2]
@ -513,6 +519,54 @@ void update_entity ( pointer.Entity ent, byte xx, byte yy, pointer idle, pointer
ent[0].frame += 1 ent[0].frame += 1
} }
// -------------------------------------
// "PHYSICS"
// -------------------------------------
void entity_physics ( pointer.Entity ent ) {
if ( ent[0].bottom0.y < BOTTOMWALL - 10 && ent[0].jump == 1 && ent[0].dircount == 0 ) {
// if not on ground, don't start jumping
ent[0].jump = 0
} else if ( ent[0].jump == 1 )
{
// a meager attempt at replicating scb's jump arc
// a few deficiencies:
// * a bit too short
// * "float" is a bit too short
// it might work out gameplay-wise, though, so idk we'll see
if ( ent[0].dircount < 3) {
ent[0].top0.y -= 6
} else if ( ent[0].dircount == 3 ) {
ent[0].top0.y -= 2
} else if ( ent[0].dircount == 4 ) {
ent[0].top0.y -= 6
} else if ( ent[0].dircount < 9 ) {
ent[0].top0.y -= 3
} else if ( 9 <= ent[0].dircount <= 10 ) {
ent[0].top0.y -= 1
} else if ( ent[0].dircount == 13 ) {
ent[0].top0.y += 2
} else if ( 13 < ent[0].dircount < 20 ) {
ent[0].top0.y += 2
} else if ( 20 < ent[0].dircount ) {
ent[0].dircount = -1
ent[0].jump = 0
}
ent[0].dircount += 1
}
if ( ent[0].bottom0.y < BOTTOMWALL - 10 && ent[0].jump == 0 ) {
ent[0].top0.y += SAM_FALLSPEED
}
if ( ent[0].movement == 1 ) {
if ( ent[0].direction == 0 ) {
ent[0].top0.x -= SAM_WALKSPEED
} else if ( ent[0].direction == 1) {
ent[0].top0.x += SAM_WALKSPEED
}
}
}
// ------------------------------------- // -------------------------------------
// ETC // ETC
// ------------------------------------- // -------------------------------------
@ -537,7 +591,6 @@ inline void draw_score() {
// ============================================================================ // ============================================================================
// UTIL // UTIL
// ============================================================================ // ============================================================================
inline asm void ppu_wait_vblank() { inline asm void ppu_wait_vblank() {
vblankwait: vblankwait:
BIT $2002 BIT $2002

BIN
sbp.nes

Binary file not shown.