Non-textbox based pause

User avatar
Raftronaut
Posts: 320
Joined: Mon Sep 03, 2018 4:47 pm

Re: Non-textbox based pause

Post by Raftronaut » Sun Sep 15, 2019 3:17 pm

dale_coop wrote:
Thu Aug 29, 2019 8:25 am
As Kasumi epxlained somewhere (on the Discord channel maybe), for pausing the music...
Modify the MainASM.asm script, under the "skipNMIstuff:", you will find this block of code:

Code: Select all

	LDA currentBank
	STA prevBank
	LDY #BANK_MUSIC  ;; switch to music bank
	JSR bankswitchY
	soundengine_update  
	LDY prevBank
	JSR bankswitchY	
Comment those 7 lines, like this:

Code: Select all

	; LDA currentBank
	; STA prevBank
	; LDY #BANK_MUSIC  ;; switch to music bank
	; JSR bankswitchY
	; soundengine_update  
	; LDY prevBank
	; JSR bankswitchY	
And just after them, add this block of code:

Code: Select all

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PAUSE MUSIC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	LDA currentBank
	STA prevBank
	LDY #BANK_MUSIC  ;; switch to music bank
	JSR bankswitchY

	LDA isPaused
	BEQ unpause_music
	JSR pause_song
	JMP post_pause_music_handle
unpause_music:
	JSR resume_song
post_pause_music_handle:
	soundengine_update  
	LDY prevBank
	JSR bankswitchY   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
Dale, I am having some trouble finding this block of code within my MainASM file

Code: Select all

	LDA currentBank
	STA prevBank
	LDY #BANK_MUSIC  ;; switch to music bank
	JSR bankswitchY
	soundengine_update  
	LDY prevBank
	JSR bankswitchY	
By searching skipNMIstuff in mainASM.asm I can find two areas here that mention this, around lines 151 and 260.

the closest match I found was this:

Code: Select all

skipNMIstuff:		


	
	DEC vBlankTimer
	INC randomSeed1
	;;return from this interrupt
	;; music player things
	
	LDA #$0
	STA sleeping

	LDA currentBank
	STA prevBank
	LDY #BANK_MUSIC  ;; switch to music bank
	JSR bankswitchY
	soundengine_update  
	LDY prevBank
	JSR bankswitchY	
I'd really like to try Kasumi's code to pause the square channels, but I am not quite understanding this first bit.

As always, thanks for your patience guys...
Space Raft demo updates: [url]http://nesmakers.com/viewtopic.php?f=52&t=2867[/url]

Chiptune:[url] https://soundcloud.com/user-634230995-350638590 [/url]
User avatar
Elarath
Posts: 52
Joined: Fri Apr 05, 2019 6:33 am

Re: Non-textbox based pause

Post by Elarath » Mon Jan 13, 2020 3:17 pm

This code is great!

I have noticed a glitch that appears when testing out the code to silence the square channels that I'm curious if anyone else has experienced. I got everything working, but noticed that if I transition between screens too quickly back and forth, my hud will become discolored and the player sprite will become corrupted. I have tested repeatedly with and without specifically that block of code.
Check out my game!
Light From Within
User avatar
red moon
Posts: 411
Joined: Mon Aug 12, 2019 12:19 am

Re: Non-textbox based pause

Post by red moon » Sat Feb 01, 2020 1:56 am

Hmm, I ran into some issues trying to implement this pause feature. I did adjust the predraw, add the pause script, assign the user constant, the inputs, create and assign the new sounds...but i must be missing something.

PREDRAW

Code: Select all

    LDA isPaused
    BNE +
    JMP isNotPaused
    +
    DrawSprite #$6C, #$78, #$70, #%00000001, spriteOffset
    UpdateSpritePointer
    DrawSprite #$76, #$78, #$71, #%00000001, spriteOffset
    UpdateSpritePointer
    DrawSprite #$80, #$78, #$72, #%00000001, spriteOffset
    UpdateSpritePointer
    DrawSprite #$8A, #$78, #$73, #%00000001, spriteOffset
    UpdateSpritePointer
    DrawSprite #$94, #$78, #$74, #%00000001, spriteOffset
    UpdateSpritePointer
isNotPaused:
;; sprite pre-draw
;;; this will allow a user to draw sprites
;;; before object sprites are drawn.
;;; keep in mind, there are still only 64 sprites
;;; that can be drawn on a screen, 
;;; and still only 8 per scan line!

;;; you can use DrawSprite macro directly using the following scheme:
;DrawSprite arg0, arg1, arg2, arg3, arg4
	;arg0 = x
	;arg1 = y
	;arg2 = chr table value
	;arg3 = attribute data
	;arg3 = starting ram position
	
;; x and y are the direct positions on the screen in pixels.
;; chr table value is which sprite you'd like to draw from the ppu table.
;; attribute data is a binary number (starts with #%), and here are how the bits work:
	;;; bit 7 - Flip sprite vertically
	;;; bit 6 - Flip sprite horizontally
	;;; bit 5 - priority (0 in front of background, 1 behind background)
	;;; bit 4,3,2 - (null)
	;;; bit 1,0 - subpalette used (00, 01, 10, 11)
	
	
;;; for starting ram position, use spriteOffset.
;; this is set to 0 just before entering this script (or 4 if sprite 0 hit was used).
;; ***remember to increase spriteOffset by 4 for every sprite that is drawn,
;; including after the last one drawn*****, so that the first object's sprite begins
;; in the next available spot.

;; I have created a macro function to handle updating to the next sprite.  So, to update to the next sprite position,
;; all that you have to do is use the function UpdateSpritePointer

;;EXAMPLE:
; DrawSprite #$80, #$80, #$10, #%00000000, spriteOffset
; UpdateSpritePointer

;;;; DRAW SPRITE ZERO FOR SPRITE ZERO HIT

	LDA gameState
	CMP #GS_MainGame	
	BNE + ;dont draw sprite zero
	LDA #HIDE_HUD
	BNE +
	;DrawSprite #$f8, #$1e, #$7F, #%00000000, spriteOffset
				;248   30    127   bit 5 = priority
	DrawSprite #SPRITE_ZERO_X, #SPRITE_ZERO_Y, #SPRITE_ZERO_INDEX, #%00100000, spriteOffset
	UpdateSpritePointer
;dont draw sprite zero.
+

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



	
;;=================== Platform engine
;; In our platform engine, the player can shoot from a 'projectile source'.
;; Since this projectile source does not interact with the background in any way,
;; it is really just a sprite extention of the player, and would be truly foolish to waste
;; an object and processing time on it.  You can, but it would be wasteful.
;; So what we can do instead is use pre-drawn sprites.  If the player is in his attack state,
;; we will check the direction, and then draw the weapon sprite based on which direction he is
;; facing.

	;LDX player1_object ;; we are going to check some player 1 things.
	;;; but getting current action type will set x to this automatically
	JMP doneDrawingWeaponSprite ;;
	GetCurrentActionType player1_object ;; what object is the current player
										;; because if it's attack (3), we should draw weapon.
	CMP #$03
	BNE notAttackingSoDontDrawWeapon
	;;attacking, so draw weapon.
	LDA Object_movement,x
	AND #%00000111
	TAY ;; now y contains direction, so we can figure out position offset
	;CMP #RIGHT
	;BNE directionIsNotRightForDrawingWeapon
	;;; direction is right.
	 LDA Object_x_hi,x
     ;;; offset x for creation
     CLC
     ADC weaponOffsetTableX,y
	 SEC
	 SBC xScroll
     SEC 
     SBC #$08 ;; width of gun 
     STA temp
     LDA Object_y_hi,x
     CLC
     ADC weaponOffsetTableY,y
     sec
     sbc #$08 ;; height of gun
     STA temp1
	 
	 CPY #RIGHT
	 BNE directionIsNotRightForDrawingWeapon
	 ;; it is right, which means draw without flip
	 LDA #%00000001
	 STA temp2
	 JMP doDrawWeapon
directionIsNotRightForDrawingWeapon:
	LDA #%01000001
	STA temp2
doDrawWeapon:
	 
	DrawSprite temp, temp1, #$2c, temp2, spriteOffset
	 JMP doneDrawingWeaponSprite
	
	



doneDrawingWeaponSprite:
	UpdateSpritePointer
	
notAttackingSoDontDrawWeapon:


	
PAUSE

Code: Select all

    LDA isPaused
    BNE unpausegame
    LDA gameHandler
    ORA #%00100000 ;; objects bit
    STA gameHandler
    LDA #$01
    STA isPaused
	;; we play the pause sfx:
	PlaySound #SND_PAUSE	
	;; we make the screen dark:
	LDA soft2001
	ORA #%11100000
	STA soft2001
	
    JMP thePauseEnd
unpausegame:
    LDA gameHandler
    AND #%11011111 ;; objects bit
    STA gameHandler
    LDA #$00
    STA isPaused
	;; we play the unpause sfx:
	PlaySound #SND_UNPAUSE
	;; we make the screen back normal:
	LDA soft2001
	AND #%00011111
	STA soft2001
thePauseEnd:
	RTS
Attachments
userconstant.jpg
userconstant.jpg (103.21 KiB) Viewed 400 times
input.jpg
input.jpg (392.37 KiB) Viewed 400 times
error1.jpg
error1.jpg (181.71 KiB) Viewed 400 times
User avatar
Mugi
Posts: 806
Joined: Thu Dec 27, 2018 8:30 pm

Re: Non-textbox based pause

Post by Mugi » Sat Feb 01, 2020 2:01 am

you mispelled the variable.

its isPaused, not IsPaused (not a capital i)
variables are case-sensitive
"what are you up to?" "Oh, not much... just... Parallaxing"
- Raftronaut
User avatar
red moon
Posts: 411
Joined: Mon Aug 12, 2019 12:19 am

Re: Non-textbox based pause

Post by red moon » Sat Feb 01, 2020 3:27 am

Thanks Mugi, it works great now!
Post Reply