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".
2/ Create a new script "b_create_melee_weapon.asm" in the "GameEngineData\Routines\Basic\ModuleScripts\InputScripts" folder, with this code:
(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:
In the "Details Object", you can its left / right animation :
Then, set it as "Player weapon".:
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):
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):
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:
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":
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):
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):
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 :
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").
Here how to do :
1/ In the "Project Settings > User Constants", create a new constant named "OBJECT_PLAYER_MELEE" with the value "1".
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
3/ In the hierarchy, under "Game Objects", select and setup your "Melee" object:
In the "Details Object", you can its left / right animation :
Then, set it as "Player weapon".:
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):
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):
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:
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":
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):
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").