DrDuck0117 3 달 전
부모
커밋
2d2d110a86
33개의 변경된 파일386개의 추가작업 그리고 60개의 파일을 삭제
  1. 11 3
      ddmyx.yyp
  2. 11 3
      notes/必读(更新日志)/必读(更新日志).txt
  3. 4 4
      objects/oCamera/Create_0.gml
  4. 15 6
      objects/oCamera/Step_0.gml
  5. 2 2
      objects/oDoubleJumpEffect/oDoubleJumpEffect.yy
  6. 1 1
      objects/oInGameManager/Create_0.gml
  7. 1 0
      objects/oInventory/Step_0.gml
  8. 36 0
      objects/oInventory/oInventory.yy
  9. 11 4
      objects/oMain/Create_0.gml
  10. 1 1
      objects/oMain/Draw_64.gml
  11. 35 14
      objects/oMain/Step_0.gml
  12. 6 1
      objects/oParentEnemy/Create_0.gml
  13. 16 1
      objects/oParentEnemy/Draw_0.gml
  14. 4 0
      objects/oParentPlayerHitbox/Step_0.gml
  15. 1 0
      objects/oParticleManager/Create_0.gml
  16. 35 0
      objects/oParticleManager/oParticleManager.yy
  17. 1 0
      objects/oPlayer/Step_0.gml
  18. 25 0
      particles/peBladeHitEffect/peBladeHitEffect.yy
  19. 2 2
      rooms/rTest_1/rTest_1.yy
  20. 2 2
      rooms/rTest_2/rTest_2.yy
  21. 2 2
      rooms/rTest_backup/rTest_backup.yy
  22. 2 2
      rooms/rTitle/rTitle.yy
  23. 1 1
      scripts/Interaction/Interaction.gml
  24. 8 3
      scripts/PlayerStates/PlayerStates.gml
  25. 16 4
      scripts/general/general.gml
  26. 2 2
      scripts/general/general.yy
  27. 12 0
      shaders/sh_flash/sh_flash.fsh
  28. 19 0
      shaders/sh_flash/sh_flash.vsh
  29. 12 0
      shaders/sh_flash/sh_flash.yy
  30. BIN
      sprites/sBladeHitEffect/1f04b2b3-f4bf-4021-90e9-780cb9ea2116.png
  31. BIN
      sprites/sBladeHitEffect/layers/1f04b2b3-f4bf-4021-90e9-780cb9ea2116/40db577c-d37b-401f-9937-8f2627f852e9.png
  32. 90 0
      sprites/sBladeHitEffect/sBladeHitEffect.yy
  33. 2 2
      sprites/sDoubleJumpEffect/sDoubleJumpEffect.yy

+ 11 - 3
ddmyx.yyp

@@ -15,7 +15,7 @@
     {"$GMFolder":"","%Name":"oEnemyCrawl","folderPath":"folders/Enemy/oEnemyCrawl.yy","name":"oEnemyCrawl","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"oEnemyDummy","folderPath":"folders/Enemy/oEnemyDummy.yy","name":"oEnemyDummy","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"oEnemyFlying","folderPath":"folders/Enemy/oEnemyFlying.yy","name":"oEnemyFlying","resourceType":"GMFolder","resourceVersion":"2.0",},
-    {"$GMFolder":"","%Name":"misc","folderPath":"folders/misc.yy","name":"misc","resourceType":"GMFolder","resourceVersion":"2.0",},
+    {"$GMFolder":"","%Name":"ParticleEffects","folderPath":"folders/ParticleEffects.yy","name":"ParticleEffects","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"Player","folderPath":"folders/Player.yy","name":"Player","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"Hitbox","folderPath":"folders/Player/Hitbox.yy","name":"Hitbox","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"Sprites","folderPath":"folders/Player/Sprites.yy","name":"Sprites","resourceType":"GMFolder","resourceVersion":"2.0",},
@@ -24,6 +24,7 @@
     {"$GMFolder":"","%Name":"Dodge&Counter","folderPath":"folders/Player/Sprites/Dodge&Counter.yy","name":"Dodge&Counter","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"Hitstun","folderPath":"folders/Player/Sprites/Hitstun.yy","name":"Hitstun","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"StateFree","folderPath":"folders/Player/Sprites/StateFree.yy","name":"StateFree","resourceType":"GMFolder","resourceVersion":"2.0",},
+    {"$GMFolder":"","%Name":"Rooms","folderPath":"folders/Rooms.yy","name":"Rooms","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"Scripts","folderPath":"folders/Scripts.yy","name":"Scripts","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"StationaryObjects","folderPath":"folders/StationaryObjects.yy","name":"StationaryObjects","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"CollectableObjects","folderPath":"folders/StationaryObjects/CollectableObjects.yy","name":"CollectableObjects","resourceType":"GMFolder","resourceVersion":"2.0",},
@@ -32,7 +33,9 @@
     {"$GMFolder":"","%Name":"SolidObjects","folderPath":"folders/StationaryObjects/SolidObjects.yy","name":"SolidObjects","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$GMFolder":"","%Name":"UIsprite","folderPath":"folders/UIsprite.yy","name":"UIsprite","resourceType":"GMFolder","resourceVersion":"2.0",},
   ],
-  "ForcedPrefabProjectReferences":[],
+  "ForcedPrefabProjectReferences":[
+    {"link":"io.gamemaker.gmparticlepresets-1.0.0","name":"io.gamemaker.gmparticlepresets-1.0.0","path":"io.gamemaker.gmparticlepresets-1.0.0.yyp",},
+  ],
   "IncludedFiles":[],
   "isEcma":false,
   "LibraryEmitters":[],
@@ -56,6 +59,7 @@
     {"id":{"name":"oFade","path":"objects/oFade/oFade.yy",},},
     {"id":{"name":"oInGameManager","path":"objects/oInGameManager/oInGameManager.yy",},},
     {"id":{"name":"oInteractIndicator","path":"objects/oInteractIndicator/oInteractIndicator.yy",},},
+    {"id":{"name":"oInventory","path":"objects/oInventory/oInventory.yy",},},
     {"id":{"name":"oMain","path":"objects/oMain/oMain.yy",},},
     {"id":{"name":"oParentAttackable","path":"objects/oParentAttackable/oParentAttackable.yy",},},
     {"id":{"name":"oParentCollectable","path":"objects/oParentCollectable/oParentCollectable.yy",},},
@@ -64,6 +68,7 @@
     {"id":{"name":"oParentInteractive","path":"objects/oParentInteractive/oParentInteractive.yy",},},
     {"id":{"name":"oParentPlayerHitbox","path":"objects/oParentPlayerHitbox/oParentPlayerHitbox.yy",},},
     {"id":{"name":"oParentSolid","path":"objects/oParentSolid/oParentSolid.yy",},},
+    {"id":{"name":"oParticleManager","path":"objects/oParticleManager/oParticleManager.yy",},},
     {"id":{"name":"oPlayer","path":"objects/oPlayer/oPlayer.yy",},},
     {"id":{"name":"oPlayerAfterImage","path":"objects/oPlayerAfterImage/oPlayerAfterImage.yy",},},
     {"id":{"name":"oPlayerCredit","path":"objects/oPlayerCredit/oPlayerCredit.yy",},},
@@ -75,6 +80,7 @@
     {"id":{"name":"oSavePoint","path":"objects/oSavePoint/oSavePoint.yy",},},
     {"id":{"name":"oSlicedApple","path":"objects/oSlicedApple/oSlicedApple.yy",},},
     {"id":{"name":"oSpike","path":"objects/oSpike/oSpike.yy",},},
+    {"id":{"name":"peBladeHitEffect","path":"particles/peBladeHitEffect/peBladeHitEffect.yy",},},
     {"id":{"name":"rTest_1","path":"rooms/rTest_1/rTest_1.yy",},},
     {"id":{"name":"rTest_2","path":"rooms/rTest_2/rTest_2.yy",},},
     {"id":{"name":"rTest_backup","path":"rooms/rTest_backup/rTest_backup.yy",},},
@@ -83,11 +89,13 @@
     {"id":{"name":"DummyAI","path":"scripts/DummyAI/DummyAI.yy",},},
     {"id":{"name":"EnemyStates","path":"scripts/EnemyStates/EnemyStates.yy",},},
     {"id":{"name":"FlyingAI","path":"scripts/FlyingAI/FlyingAI.yy",},},
-    {"id":{"name":"general","path":"scripts/general/general.yy",},},
+    {"id":{"name":"General","path":"scripts/General/General.yy",},},
     {"id":{"name":"Interaction","path":"scripts/Interaction/Interaction.yy",},},
     {"id":{"name":"PlayerStates","path":"scripts/PlayerStates/PlayerStates.yy",},},
     {"id":{"name":"Simplifier","path":"scripts/Simplifier/Simplifier.yy",},},
     {"id":{"name":"SL","path":"scripts/SL/SL.yy",},},
+    {"id":{"name":"sh_flash","path":"shaders/sh_flash/sh_flash.yy",},},
+    {"id":{"name":"sBladeHitEffect","path":"sprites/sBladeHitEffect/sBladeHitEffect.yy",},},
     {"id":{"name":"sBlockClimbable","path":"sprites/sBlockClimbable/sBlockClimbable.yy",},},
     {"id":{"name":"sBlockSlippery","path":"sprites/sBlockSlippery/sBlockSlippery.yy",},},
     {"id":{"name":"sCredit","path":"sprites/sCredit/sCredit.yy",},},

+ 11 - 3
notes/必读(更新日志)/必读(更新日志).txt

@@ -74,6 +74,7 @@ gml内部会计算image_index += sprite_fps / game_fps * image_speed等等公式
 
 2026/2/14 tianhaobu
 //注册与注销建议使用更加现代化的autoreg_handle和autodel_handle,详见2/18
+
 1. 引入了新的输入方法,相关函数在interaction.gml里,大致逻辑是这样的:
 在监听任何按键前,需要先注册一个句柄(handle)
 {句柄函数名} = new input_handle("{句柄注册名}",{优先级})
@@ -169,7 +170,7 @@ oDoor用蓝色条形sprite指示。
 
 4. 新增oSavePoint并进行存档相关内容调试
 
-5. 句柄优先级相关代码好像有些问题。明天解决。《《《
+5. 句柄优先级相关代码好像有些问题。明天解决。已解决&优化
 
 6. 在名为SL的script中新增三个函数
 get_default_save_data() 负责抓取玩家初始参数
@@ -182,7 +183,7 @@ global.player是游戏内玩家inst_id
 鉴于gml的obj和inst转换尚不明确,此变量和相似变量为快速找到指定关键inst而提出
 稍后优化
 
-8. 注意今日代码存档相关有巨量未完成部分,慎重运行修改!!明天解决!!
+8. 注意今日代码存档相关有巨量未完成部分,慎重运行修改!!明天解决!!见2/18
 
 2025/2/18 DrDuck
 
@@ -192,4 +193,11 @@ global.player是游戏内玩家inst_id
 
 2. 考虑加入音乐/粒子效果接口。先不做。
 
-3. 状态机优化写到一半,先别动
+3. 状态机优化写到一半,先别动
+
+4. 读存档大概搞定了
+
+2025/2/19 DrDuck
+
+1. 昨天日志没写完……
+补充:加入了screen_shake(_mag)函数控制摄像机震动

+ 4 - 4
objects/oCamera/Create_0.gml

@@ -1,9 +1,9 @@
 cam_width = 1920;
 cam_height = 1080;
 
-follow = oPlayer;
+x_to = 0;
+y_to = 0;
 
-x_to = x;
-y_to = y;
+smooth = 0.1;
 
-smooth = 0.1;
+shake_magnitude = 0;

+ 15 - 6
objects/oCamera/Step_0.gml

@@ -1,15 +1,24 @@
+follow = global.player;
+
 if instance_exists(follow)
 {
     x_to = follow.x;
     y_to = follow.y;
 }
 
-x += (x_to - x) * smooth;
-y += (y_to - y) * smooth;
+shake_magnitude = lerp(shake_magnitude, 0, 0.05);
+if shake_magnitude < 1
+	shake_magnitude = 0;
+	
+var _x_delta = random_range(-shake_magnitude, shake_magnitude);
+var _y_delta = random_range(-shake_magnitude, shake_magnitude);
+
+x += (x_to - x) * smooth + _x_delta;
+y += (y_to - y) * smooth + _y_delta;
 
-x = clamp(x, cam_width/2, room_width - cam_width/2);
-y = clamp(y, cam_height/2, room_height - cam_height/2);
+x = clamp(x, cam_width / 2, room_width - cam_width / 2) + _x_delta;
+y = clamp(y, cam_height / 2, room_height - cam_height / 2) + _y_delta;
 
-var _cam_x = x - cam_width/2;
-var _cam_y = y - cam_height/2;
+var _cam_x = x - cam_width / 2;
+var _cam_y = y - cam_height / 2;
 camera_set_view_pos(view_camera[0], _cam_x, _cam_y);

+ 2 - 2
objects/oDoubleJumpEffect/oDoubleJumpEffect.yy

@@ -8,8 +8,8 @@
   "name":"oDoubleJumpEffect",
   "overriddenProperties":[],
   "parent":{
-    "name":"misc",
-    "path":"folders/misc.yy",
+    "name":"Sprites",
+    "path":"folders/Player/Sprites.yy",
   },
   "parentObjectId":null,
   "persistent":false,

+ 1 - 1
objects/oInGameManager/Create_0.gml

@@ -1,5 +1,5 @@
-global.camera = icl(oCamera);
 global.player = icl(oPlayer);
+global.camera = icl(oCamera);
 
 // physics relevant
 global.g = 0.5;

+ 1 - 0
objects/oInventory/Step_0.gml

@@ -0,0 +1 @@
+global.hitstop = 10; // 全局永久暂停

+ 36 - 0
objects/oInventory/oInventory.yy

@@ -0,0 +1,36 @@
+{
+  "$GMObject":"",
+  "%Name":"oInventory",
+  "eventList":[
+    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+  ],
+  "managed":true,
+  "name":"oInventory",
+  "overriddenProperties":[],
+  "parent":{
+    "name":"CoreObjects",
+    "path":"folders/CoreObjects.yy",
+  },
+  "parentObjectId":null,
+  "persistent":false,
+  "physicsAngularDamping":0.1,
+  "physicsDensity":0.5,
+  "physicsFriction":0.2,
+  "physicsGroup":1,
+  "physicsKinematic":false,
+  "physicsLinearDamping":0.1,
+  "physicsObject":false,
+  "physicsRestitution":0.1,
+  "physicsSensor":false,
+  "physicsShape":1,
+  "physicsShapePoints":[],
+  "physicsStartAwake":true,
+  "properties":[],
+  "resourceType":"GMObject",
+  "resourceVersion":"2.0",
+  "solid":false,
+  "spriteId":null,
+  "spriteMaskId":null,
+  "visible":true,
+}

+ 11 - 4
objects/oMain/Create_0.gml

@@ -1,12 +1,15 @@
+icl(oParticleManager);
+
 global.input_handles_index = [
 	"debug",
 	"ingame",
+	"inventory",
 	"title"
 ]
-for (var i = 0; i < array_length(global.input_handles_index); i++) {
+for(var i = 0; i < array_length(global.input_handles_index); i++)
     variable_instance_set(id, global.input_handles_index[i], undefined);
-}
-autoreg_handle("ingame", "ingame", 1)
+	
+autoreg_handle("ingame", "ingame", 1);
 autoreg_handle("title", "title", 100);
 
 _jump_p = undefined;
@@ -17,14 +20,18 @@ _up = undefined;
 _down = undefined;
 _dash = undefined;
 _attack = undefined;
+_inventory = undefined;
+
+_return = undefined;
 
 _newgame = undefined;
 _continue = undefined;
 _quitgame = undefined;
-_return = undefined;
 
+_close = undefined;
 
 global.in_game_manager = noone;
+global.inventory = noone;
 global.camera = noone;
 global.player = noone;
 

+ 1 - 1
objects/oMain/Draw_64.gml

@@ -6,5 +6,5 @@ if global.developer_mode && room == rTitle
 	draw_text(0, 96, "vk_space FUNCTIONS AS NEW GAME, REWRITING CURRENT SAVE FILE WITH A DEFAULT ONE");
 	draw_text(0, 144, "vk_enter FUNCTIONS AS CONTINUE, LOADING YOUR CURRENT SAVE FILE");
 	draw_text(0, 192, "vk_escape FUNCTIONS AS QUIT GAME");
-	draw_text(0, 240, "vk_backspace WILL SAVE THE GAME AND RETURN YOU TO TITLE ROOM WHILE IN GAME");
+	draw_text(0, 240, "vk_escape WILL SAVE THE GAME AND RETURN YOU TO TITLE ROOM WHILE IN GAME");
 }

+ 35 - 14
objects/oMain/Step_0.gml

@@ -1,11 +1,14 @@
-_jump_p = ingame.kcp("Z") || ingame.kcp("K");
-_jump_r = ingame.kcr("Z") || ingame.kcr("K");
-_left   = ingame.kc("A")  || ingame.kc(vk_left);
-_right  = ingame.kc("D")  || ingame.kc(vk_right);
-_up     = ingame.kc("W")  || ingame.kc(vk_up);
-_down   = ingame.kc("S")  || ingame.kc(vk_down);
-_dash   = ingame.kcp("C") || ingame.kcp("L");
-_attack = ingame.kcp("X") || ingame.kcp("J");
+_jump_p = ingame.kcp("Z");
+_jump_r = ingame.kcr("Z");
+_dash   = ingame.kcp("C");
+_attack = ingame.kcp("X");
+_left   = ingame.kc(vk_left);
+_right  = ingame.kc(vk_right);
+_up     = ingame.kc(vk_up);
+_down   = ingame.kc(vk_down);
+_inventory = ingame.kcp("I");
+
+_return = ingame.kcp(vk_escape); // for debugging
 
 /*
 if (ingame.kcp(vk_escape)) {
@@ -15,12 +18,20 @@ if (title != undefined && title.kcp(vk_escape)) {
     autodel_handle("title"); 
 }
 */
-if (title != undefined){
-_newgame = title.kcp(vk_space);
-_continue = title.kcp(vk_enter);
-_quitgame = title.kcp(vk_escape);
+if title != undefined
+{
+	_newgame = title.kcp(vk_space);
+	_continue = title.kcp(vk_enter);
+	_quitgame = title.kcp(vk_escape);
+}
+if inventory != undefined
+{
+	_left = inventory.kcp(vk_left);
+	_right = inventory.kcp(vk_right);
+	_up = inventory.kcp(vk_up);
+	_down = inventory.kcp(vk_down);
+	_close = inventory.kcp("I") || inventory.kcp(vk_escape);
 }
-_return = ingame.kcp(vk_escape);
 
 
 if global.developer_mode && room == rTitle
@@ -54,4 +65,14 @@ if global.developer_mode && room != rTitle
 		with(global.in_game_manager) instance_destroy();
 		
 		autoreg_handle("title", "title", 100);
-	}
+	}
+if _inventory
+{
+	global.inventory = icl(oInventory);
+	autoreg_handle("inventory", "inventory", 10);
+}
+if _close
+{
+	with(global.inventory) instance_destroy();
+	autodel_handle("inventory");
+}

+ 6 - 1
objects/oParentEnemy/Create_0.gml

@@ -23,4 +23,9 @@ image_speed = 0;
 
 get_hit = false;
 
-hitbox = noone;
+hitbox = noone;
+
+// shader
+flash_timer = 0;
+flash_timer = 0;
+u_flash_alpha = shader_get_uniform(sh_flash, "f_alpha");

+ 16 - 1
objects/oParentEnemy/Draw_0.gml

@@ -1,4 +1,19 @@
-draw_self();
+if flash_timer > 0
+{
+    shader_set(sh_flash);
+    
+    var _alpha = flash_timer / flash_duration;
+    
+    shader_set_uniform_f(u_flash_alpha, _alpha);
+    
+    draw_self();
+    shader_reset();
+    
+    flash_timer -= global.time_scale;
+}
+else
+    draw_self();
+
 
 if global.developer_mode
 {

+ 4 - 0
objects/oParentPlayerHitbox/Step_0.gml

@@ -22,6 +22,10 @@ for (var i = 0; i < _num; i++)
             with(_inst)
 			{
 				enemy_get_hit(other.damage, other.kb_factor_x, other.kb_factor_y);
+				flash_timer = 6;
+				flash_duration = 6;
+				
+				part_particles_burst(global.blade_hit_effect, x, y, peBladeHitEffect)
 			}
 		ds_list_add(hit_list, _inst);
     }

+ 1 - 0
objects/oParticleManager/Create_0.gml

@@ -0,0 +1 @@
+global.blade_hit_effect = part_system_create(peBladeHitEffect);

+ 35 - 0
objects/oParticleManager/oParticleManager.yy

@@ -0,0 +1,35 @@
+{
+  "$GMObject":"",
+  "%Name":"oParticleManager",
+  "eventList":[
+    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+  ],
+  "managed":true,
+  "name":"oParticleManager",
+  "overriddenProperties":[],
+  "parent":{
+    "name":"CoreObjects",
+    "path":"folders/CoreObjects.yy",
+  },
+  "parentObjectId":null,
+  "persistent":false,
+  "physicsAngularDamping":0.1,
+  "physicsDensity":0.5,
+  "physicsFriction":0.2,
+  "physicsGroup":1,
+  "physicsKinematic":false,
+  "physicsLinearDamping":0.1,
+  "physicsObject":false,
+  "physicsRestitution":0.1,
+  "physicsSensor":false,
+  "physicsShape":1,
+  "physicsShapePoints":[],
+  "physicsStartAwake":true,
+  "properties":[],
+  "resourceType":"GMObject",
+  "resourceVersion":"2.0",
+  "solid":false,
+  "spriteId":null,
+  "spriteMaskId":null,
+  "visible":true,
+}

+ 1 - 0
objects/oPlayer/Step_0.gml

@@ -6,6 +6,7 @@ player_status_update();
 player_check_door();
 player_check_attacked();
 player_check_hazard();
+player_check_death();
 
 state();
 

+ 25 - 0
particles/peBladeHitEffect/peBladeHitEffect.yy

@@ -0,0 +1,25 @@
+{
+  "$GMParticleSystem":"",
+  "%Name":"peBladeHitEffect",
+  "backdropHeight":768,
+  "backdropImageOpacity":0.5,
+  "backdropImagePath":"",
+  "backdropWidth":1366,
+  "backdropXOffset":0.0,
+  "backdropYOffset":0.0,
+  "drawOrder":0,
+  "emitters":[
+    {"$GMPSEmitter":"","%Name":"Emitter","additiveBlend":false,"directionIncrease":0.0,"directionMax":15.0,"directionMin":-15.0,"directionWiggle":0.0,"distribution":0,"editorColour":1090519039,"editorDrawShape":true,"emitCount":8,"emitDelayMax":0.0,"emitDelayMin":0.0,"emitDelayUnits":0,"emitIntervalMax":0.0,"emitIntervalMin":0.0,"emitIntervalUnits":0,"enabled":true,"endColour":2164260863,"GMPresetName":null,"gravityDirection":0.0,"gravityForce":0.0,"headPosition":0.0,"lifetimeMax":12.0,"lifetimeMin":10.0,"linkedEmitter":null,"locked":false,"midColour":4294967295,"mode":1,"name":"Emitter","orientationIncrease":0.0,"orientationMax":0.0,"orientationMin":0.0,"orientationRelative":true,"orientationWiggle":0.0,"regionH":0.0,"regionW":0.0,"regionX":0.0,"regionY":0.0,"resourceType":"GMPSEmitter","resourceVersion":"2.0","scaleX":1.0,"scaleY":1.0,"shape":0,"sizeIncrease":0.01,"sizeMax":2.0,"sizeMin":1.5,"sizeWiggle":0.0,"spawnOnDeathCount":1,"spawnOnDeathGMPreset":null,"spawnOnDeathId":null,"spawnOnUpdateCount":1,"spawnOnUpdateGMPreset":null,"spawnOnUpdateId":null,"speedIncrease":0.0,"speedMax":15.0,"speedMin":10.0,"speedWiggle":0.0,"spriteAnimate":false,"spriteId":{"name":"sBladeHitEffect","path":"sprites/sBladeHitEffect/sBladeHitEffect.yy",},"spriteRandom":false,"spriteStretch":false,"startColour":4294967295,"texture":-1,},
+  ],
+  "name":"peBladeHitEffect",
+  "parent":{
+    "name":"ParticleEffects",
+    "path":"folders/ParticleEffects.yy",
+  },
+  "resourceType":"GMParticleSystem",
+  "resourceVersion":"2.0",
+  "showBackdrop":true,
+  "showBackdropImage":false,
+  "xorigin":0,
+  "yorigin":0,
+}

+ 2 - 2
rooms/rTest_1/rTest_1.yy

@@ -1047,8 +1047,8 @@
   ],
   "name":"rTest_1",
   "parent":{
-    "name":"ddmyx",
-    "path":"ddmyx.yyp",
+    "name":"Rooms",
+    "path":"folders/Rooms.yy",
   },
   "parentRoom":null,
   "physicsSettings":{

+ 2 - 2
rooms/rTest_2/rTest_2.yy

@@ -101,8 +101,8 @@
   ],
   "name":"rTest_2",
   "parent":{
-    "name":"ddmyx",
-    "path":"ddmyx.yyp",
+    "name":"Rooms",
+    "path":"folders/Rooms.yy",
   },
   "parentRoom":null,
   "physicsSettings":{

+ 2 - 2
rooms/rTest_backup/rTest_backup.yy

@@ -435,8 +435,8 @@
   ],
   "name":"rTest_backup",
   "parent":{
-    "name":"ddmyx",
-    "path":"ddmyx.yyp",
+    "name":"Rooms",
+    "path":"folders/Rooms.yy",
   },
   "parentRoom":null,
   "physicsSettings":{

+ 2 - 2
rooms/rTitle/rTitle.yy

@@ -17,8 +17,8 @@
   ],
   "name":"rTitle",
   "parent":{
-    "name":"ddmyx",
-    "path":"ddmyx.yyp",
+    "name":"Rooms",
+    "path":"folders/Rooms.yy",
   },
   "parentRoom":null,
   "physicsSettings":{

+ 1 - 1
scripts/Interaction/Interaction.gml

@@ -1,4 +1,4 @@
-/// @desc 对句柄进行每帧例行初始化.
+/// @desc 对句柄进行每帧例行初始化
 function _handle_init(){
 	if (!variable_global_exists("input_handles_list")) global.input_handles_list = [];
 	global.input_consumed = {}; 

+ 8 - 3
scripts/PlayerStates/PlayerStates.gml

@@ -185,6 +185,9 @@ function player_check_dodge()
 }
 function player_check_death()
 {
+	if state == state_death
+		return;
+	
 	if global.playerHP <= 0
 	{
 		save_game_to_disk();
@@ -282,6 +285,7 @@ function player_check_attacked()
 		_dir = facing;
 	
 	global.hitstop = 12;
+	screen_shake(10);
 	
 	x_spd = _dir * 30;
     y_spd = -5;
@@ -294,7 +298,7 @@ function player_check_attacked()
 function player_check_hazard()
 {
 	if current_hazard == noone ||
-	state == state_hitstun_hazard || state == state_death
+	state == state_hitstun_hazard || state == state_death || state == state_locked
 		return;
     
     global.playerHP -= current_hazard.damage;
@@ -306,6 +310,7 @@ function player_check_hazard()
 	_dir = facing;
 		
 	global.hitstop = 18;
+	screen_shake(10);
 	
 	x_spd = _dir * 10;
 	y_spd = -10;
@@ -445,13 +450,13 @@ function state_locked()
 	locked_timer -= global.time_scale;
 	
 	x_spd = 0;
-	y_spd = 0;
+	y_spd += player_calc_gravity();
 	
 	if locked_timer <= 0
 		state = state_free;
 }
 function state_death()
-{
+{	
 	x_spd = 0;
 	y_spd = 0;
 	if animation_end()

+ 16 - 4
scripts/general/general.gml

@@ -1,13 +1,9 @@
 function check_hitstop()
 {
 	if global.hitstop > 0
-	{
 		return true;
-	}
 	else
-	{
 		return false;
-	}
 }
 /// @desc 优雅地检测该实例的sprite当前动画是否到达最后一帧
 function animation_end()
@@ -31,4 +27,20 @@ function camera_snap()
 {
 	oCamera.x = oCamera.x_to;
 	oCamera.y = oCamera.y_to;	
+}
+
+/// @desc 触发屏幕震动
+/// @param {Real} _magnitude 以像素计算的震动强度
+// @param {Real} _frames 以帧计算的持续时间
+function screen_shake(_magnitude)//, _duration)
+{
+    // 只有当新的震动比当前的更强时才覆盖
+    with(oCamera)
+	{
+        if _magnitude > shake_magnitude
+		{
+            shake_magnitude = _magnitude;
+            //shake_duration = _duration;
+        }
+    }
 }

+ 2 - 2
scripts/general/general.yy

@@ -1,9 +1,9 @@
 {
   "$GMScript":"v1",
-  "%Name":"general",
+  "%Name":"General",
   "isCompatibility":false,
   "isDnD":false,
-  "name":"general",
+  "name":"General",
   "parent":{
     "name":"Scripts",
     "path":"folders/Scripts.yy",

+ 12 - 0
shaders/sh_flash/sh_flash.fsh

@@ -0,0 +1,12 @@
+varying vec2 v_vTexcoord;
+varying vec4 v_vColour;
+
+uniform float f_alpha; 
+
+void main()
+{
+    vec4 texColor = texture2D(gm_BaseTexture, v_vTexcoord);
+    vec3 white = vec3(1.0, 1.0, 1.0);
+    
+    gl_FragColor = vec4(mix(texColor.rgb, white, f_alpha), texColor.a);
+}

+ 19 - 0
shaders/sh_flash/sh_flash.vsh

@@ -0,0 +1,19 @@
+//
+// Simple passthrough vertex shader
+//
+attribute vec3 in_Position;                  // (x,y,z)
+//attribute vec3 in_Normal;                  // (x,y,z)     unused in this shader.
+attribute vec4 in_Colour;                    // (r,g,b,a)
+attribute vec2 in_TextureCoord;              // (u,v)
+
+varying vec2 v_vTexcoord;
+varying vec4 v_vColour;
+
+void main()
+{
+    vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
+    gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
+    
+    v_vColour = in_Colour;
+    v_vTexcoord = in_TextureCoord;
+}

+ 12 - 0
shaders/sh_flash/sh_flash.yy

@@ -0,0 +1,12 @@
+{
+  "$GMShader":"",
+  "%Name":"sh_flash",
+  "name":"sh_flash",
+  "parent":{
+    "name":"ddmyx",
+    "path":"ddmyx.yyp",
+  },
+  "resourceType":"GMShader",
+  "resourceVersion":"2.0",
+  "type":1,
+}

BIN
sprites/sBladeHitEffect/1f04b2b3-f4bf-4021-90e9-780cb9ea2116.png


BIN
sprites/sBladeHitEffect/layers/1f04b2b3-f4bf-4021-90e9-780cb9ea2116/40db577c-d37b-401f-9937-8f2627f852e9.png


+ 90 - 0
sprites/sBladeHitEffect/sBladeHitEffect.yy

@@ -0,0 +1,90 @@
+{
+  "$GMSprite":"v2",
+  "%Name":"sBladeHitEffect",
+  "bboxMode":0,
+  "bbox_bottom":7,
+  "bbox_left":0,
+  "bbox_right":127,
+  "bbox_top":0,
+  "collisionKind":1,
+  "collisionTolerance":0,
+  "DynamicTexturePage":false,
+  "edgeFiltering":false,
+  "For3D":false,
+  "frames":[
+    {"$GMSpriteFrame":"v1","%Name":"1f04b2b3-f4bf-4021-90e9-780cb9ea2116","name":"1f04b2b3-f4bf-4021-90e9-780cb9ea2116","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
+  ],
+  "gridX":0,
+  "gridY":0,
+  "height":8,
+  "HTile":false,
+  "layers":[
+    {"$GMImageLayer":"","%Name":"40db577c-d37b-401f-9937-8f2627f852e9","blendMode":0,"displayName":"default","isLocked":false,"name":"40db577c-d37b-401f-9937-8f2627f852e9","opacity":100.0,"resourceType":"GMImageLayer","resourceVersion":"2.0","visible":true,},
+  ],
+  "name":"sBladeHitEffect",
+  "nineSlice":null,
+  "origin":4,
+  "parent":{
+    "name":"ParticleEffects",
+    "path":"folders/ParticleEffects.yy",
+  },
+  "preMultiplyAlpha":false,
+  "resourceType":"GMSprite",
+  "resourceVersion":"2.0",
+  "sequence":{
+    "$GMSequence":"v1",
+    "%Name":"sBladeHitEffect",
+    "autoRecord":true,
+    "backdropHeight":768,
+    "backdropImageOpacity":0.5,
+    "backdropImagePath":"",
+    "backdropWidth":1366,
+    "backdropXOffset":0.0,
+    "backdropYOffset":0.0,
+    "events":{
+      "$KeyframeStore<MessageEventKeyframe>":"",
+      "Keyframes":[],
+      "resourceType":"KeyframeStore<MessageEventKeyframe>",
+      "resourceVersion":"2.0",
+    },
+    "eventStubScript":null,
+    "eventToFunction":{},
+    "length":1.0,
+    "lockOrigin":false,
+    "moments":{
+      "$KeyframeStore<MomentsEventKeyframe>":"",
+      "Keyframes":[],
+      "resourceType":"KeyframeStore<MomentsEventKeyframe>",
+      "resourceVersion":"2.0",
+    },
+    "name":"sBladeHitEffect",
+    "playback":1,
+    "playbackSpeed":30.0,
+    "playbackSpeedType":0,
+    "resourceType":"GMSequence",
+    "resourceVersion":"2.0",
+    "showBackdrop":true,
+    "showBackdropImage":false,
+    "timeUnits":1,
+    "tracks":[
+      {"$GMSpriteFramesTrack":"","builtinName":0,"events":[],"inheritsTrackColour":true,"interpolation":1,"isCreationTrack":false,"keyframes":{"$KeyframeStore<SpriteFrameKeyframe>":"","Keyframes":[
+            {"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
+                "0":{"$SpriteFrameKeyframe":"","Id":{"name":"1f04b2b3-f4bf-4021-90e9-780cb9ea2116","path":"sprites/sBladeHitEffect/sBladeHitEffect.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
+              },"Disabled":false,"id":"da1b9ad5-19dd-47c4-9289-5f67afd8aaa6","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
+          ],"resourceType":"KeyframeStore<SpriteFrameKeyframe>","resourceVersion":"2.0",},"modifiers":[],"name":"frames","resourceType":"GMSpriteFramesTrack","resourceVersion":"2.0","spriteId":null,"trackColour":0,"tracks":[],"traits":0,},
+    ],
+    "visibleRange":null,
+    "volume":1.0,
+    "xorigin":64,
+    "yorigin":4,
+  },
+  "swatchColours":null,
+  "swfPrecision":0.5,
+  "textureGroupId":{
+    "name":"Default",
+    "path":"texturegroups/Default",
+  },
+  "type":0,
+  "VTile":false,
+  "width":128,
+}

+ 2 - 2
sprites/sDoubleJumpEffect/sDoubleJumpEffect.yy

@@ -25,8 +25,8 @@
   "nineSlice":null,
   "origin":4,
   "parent":{
-    "name":"misc",
-    "path":"folders/misc.yy",
+    "name":"Sprites",
+    "path":"folders/Player/Sprites.yy",
   },
   "preMultiplyAlpha":false,
   "resourceType":"GMSprite",