[4.1] Use the real Melee object weapon in the Platformer module

If you prefer to have a real object based Melee weapon, in your plateformer game project.
Here how to do :


1/ In the "Project Settings > User Constants", create a new constant named "OBJECT_PLAYER_MELEE" with the value "1".

2019-01-14-15-24-44-Project-Settings.png



2/ Create a new script "b_create_melee_weapon.asm" in the "GameEngineData\Routines\Basic\ModuleScripts\InputScripts" folder, with this code:
Code:
    LDA gameHandler
    AND #%00100000
    BEQ notNPCstate_attack
    JMP doneAttacking
notNPCstate_attack:
     LDA weaponsUnlocked
     AND #%00000001
     BNE canAttack
     JMP doneAttacking
canAttack:
    LDX player1_object
    GetCurrentActionType player1_object
    CMP #$03
    BNE notAlreadyAttacking
    JMP doneAttacking
  
notAlreadyAttacking:
    ;;; don't attack if already attacking.
    ;;; do we have to check for hurt here?
    ;;;;; Here, we WOULD create melee
    ChangeObjectState #$03, #$02
    LDA Object_movement,x
    AND #%00001111
    STA Object_movement,x
    LDA #$00
    STA Object_h_speed_hi,x
    STA Object_h_speed_lo,x
    STA Object_v_speed_hi,x
    STA Object_v_speed_lo,x

    LDA Object_x_hi,x
    STA temp
    LDA Object_y_hi,x
    STA temp1

    LDA Object_movement,x
    AND #%00000111
    STA temp2
    TAY

    LDA Object_x_hi,x
    SEC
    SBC #$08    ;; <<--- HERE, you have to set width of melee weapon in HEX (1 tile = 8px, 8 in decimal = #$08 in hex. Use the binary <-> hex converter plugin)
    STA temp
    LDA Object_scroll,x
    SBC #$00
    STA temp3

    LDA temp
    ;;; offset x for creation
    CLC
    ADC weaponOffsetTableX,y
    STA temp
    LDA temp3
    ADC #$00
    STA temp3

    LDA Object_y_hi,x
    CLC
    ADC weaponOffsetTableY,y
    SEC
    SBC #$08    ;; <<--- HERE, you have to set height of melee weapon in HEX (1 tile = 8px, 8 in decimal = #$08 in hex. Use the binary <-> hex converter plugin)
    STA temp1  
  
    CreateObject temp, temp1, #OBJECT_PLAYER_MELEE, #$00, temp3
  
meleeCreated:
    ;;;; x is now the newly created object's x.
    LDA Object_movement,x
    ORA temp2
    STA Object_movement,x
  
    ;PlaySound #SND_SLASH
  
doneAttacking:
    RTS
(in the script, don't forget to adapt/modify the with and the height of your weapon)


3/ In the hierarchy, under "Game Objects", select and setup your "Melee" object:

2019-01-14-15-27-04-NES-MAKER-4-1-1-Version-0x158-Plateform-Test-MST.png


In the "Details Object", you can its left / right animation :

2019-01-14-15-30-15-Monster-Animation-Info.png


Then, set it as "Player weapon".:

2019-01-14-15-30-22-Monster-Animation-Info.png


Set the "Action step 0" to "Ignore gravity" and to "DestroyMe" after the end of the Action, give a timer value of "1" (if you have an animation, you could you the "end of animation" with the right animation speed):

2019-01-19-13-34-00-Monster-Animation-Info.png


And don't forget to set the Bounding Box!


4/ Now, select the "Player" object, go the "Object Details". For the "Action Step 03", uncheck the "Harmfull invicible", set to "GoToFirst" the end of Action, give a timer value of "1", at least the value of the weapon timer (if you have an animation, you could you the "end of animation" with the right animation speed):

2019-01-19-13-37-12-Monster-Animation-Info.png



5/ In the hierarchy, select the "Game Object" element, and set the position (the Offset) of your Melee object with your Player for all its facing directions:

2019-01-15-17-40-02-NES-MAKER-4-1-1-Version-0x158-Plateform-Test-MST.png



6/ In the "Scripts > input Scripts" add the "b_create_melee_weapon.asm" script.

7/ In the "Input Editor", assign it to your button ("Press" "B" button).


8/ In your "Project Settings > Script Settings", select the "Use Sprite Based Weapon" element and assign it the "Routines\Basic\ModuleScripts\BlankScript.asm":

2019-01-14-15-42-59-Project-Settings.png



9/ Make a new script "PreDraw_DC.asm" in your "GameEngineData\Routines\Basic\ModuleScripts\MainScripts\ScrollingPlatformer" folder, with this code (it's the same script that the PreDraw, I just removed all the part about the weapon):

Code:
;; 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
    ;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.
+

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

And assigned it the the "Handle Sprite Pre-Draw" element in the "Project Settings > Script Settings".


10/ In your "Project Infos", you can check the "Weapon 1 unlock" if you want your player to have the weapon at launch (else he will have to get it from an NPC):

2019-01-14-15-40-09-Initial-Data.png



11/ Last thing, you should do a small modification in your StartMovingPlayerxxx script, just moving the "++" from before the "FaceDirection" line, to AFTER "FaceDirection" line.
For exemple, StartMovingPlayerRight.Asm should be like this :
Code:
 ;;;;; START MOVING PLAYER RIGHT:
;;;;; We will use this when the right button is pressed.
;;;;; If we are already showing the walking animation, which is for this module
;;;;; action step 1, we will skip changing to the walking state.
    LDX player1_object
    GetCurrentActionType player1_object
    CMP #$02 ;; if the state is invincible
    BEQ ++ ; skip movement if attacking
    CMP #$03
    BEQ ++ ;skip if we are casting spell
    CMP #$01
    BEQ + ;; if the action type already equals 1, jump forward
    ChangeObjectState #$01, #$04
+
;;;;;; Then, we will begin moving.
    StartMoving player1_object, MOVE_RIGHT
;;;;;; Lastly, we will change the facing direction.
    FaceDirection player1_object, FACE_RIGHT
++
    RTS

VoilĂ , your Melee weapon should work as expected...


Note: you should get rid of your GetSword pickup object, make it a health pickup or anything else you want (change the script assign to the "Power Up 00" in the "Project Settings > Script Settings").
Very good tutorial. I can't animate the attack. Do you have a tutorial on this? I tried to program it directly but my script didn't work. I'm also having some difficulty in the jump animation. My last question is whether it is possible to animate the stopped sprite...?
Thanks Dale, I followed your tutorials step by step. It's well explained.
It works but :

I've some problem with the offset of the weapon when I test the game, see below :

View attachment 1314


My weapon is Height 1, Width : 2
So in script : SBC #$01 ;; height of melee weapon and SBC #$02 ;; width of melee weapon

With some tries, I found the ideal offnet for "AttackRight".
But for AttackLeft, even is the Offset X value is to minimum (0)... My weapon is through the character and not on the left side.

Any idea ?
beautiful art. I can't wait to play your game
 

nes-lover

New member
I understand that this is an extremely old thread, and it is unlikely that I receive a response to this, but it there any way to implement Melee weapons into 4.5.9? I'm using the Arcade Platformer (Simple Platformer for the older NESMaker users) module. Thanks.
 

dale_coop

Moderator
Staff member
Check the tutorial videos...
For example, the brawler module... has a melee "fist" object.
What else is a melee than a projectile object that doesn't move ;) (every modules implements projectiles objects... just use the object #01 in the scripts)

The tutorials videos (skip the "beginners" ones, you won't learn anything from them):
 
Top Bottom