1
0
Kaynağa Gözat

还是看日志即可,东西太多

DrDuck0117 3 ay önce
ebeveyn
işleme
e6972fec5a

+ 6 - 0
ddmyx.yyp

@@ -14,6 +14,7 @@
     {"$GMFolder":"","%Name":"Enemy","folderPath":"folders/Enemy.yy","name":"Enemy","resourceType":"GMFolder","resourceVersion":"2.0",},
     {"$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":"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",},
@@ -47,6 +48,7 @@
     {"id":{"name":"oDoubleJumpEffect","path":"objects/oDoubleJumpEffect/oDoubleJumpEffect.yy",},},
     {"id":{"name":"oEnemyCrawl","path":"objects/oEnemyCrawl/oEnemyCrawl.yy",},},
     {"id":{"name":"oEnemyDummy","path":"objects/oEnemyDummy/oEnemyDummy.yy",},},
+    {"id":{"name":"oEnemyFlying","path":"objects/oEnemyFlying/oEnemyFlying.yy",},},
     {"id":{"name":"oEnemyHitbox","path":"objects/oEnemyHitbox/oEnemyHitbox.yy",},},
     {"id":{"name":"oFade","path":"objects/oFade/oFade.yy",},},
     {"id":{"name":"oGame","path":"objects/oGame/oGame.yy",},},
@@ -63,10 +65,12 @@
     {"id":{"name":"oPlayerHitboxMark","path":"objects/oPlayerHitboxMark/oPlayerHitboxMark.yy",},},
     {"id":{"name":"oPlayerHitboxVer","path":"objects/oPlayerHitboxVer/oPlayerHitboxVer.yy",},},
     {"id":{"name":"oSpike","path":"objects/oSpike/oSpike.yy",},},
+    {"id":{"name":"rTest_backup","path":"rooms/rTest_backup/rTest_backup.yy",},},
     {"id":{"name":"rTest","path":"rooms/rTest/rTest.yy",},},
     {"id":{"name":"CrawlAI","path":"scripts/CrawlAI/CrawlAI.yy",},},
     {"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":"PlayerStates","path":"scripts/PlayerStates/PlayerStates.yy",},},
     {"id":{"name":"Simplifier","path":"scripts/Simplifier/Simplifier.yy",},},
@@ -77,6 +81,7 @@
     {"id":{"name":"sEnemyDummyAttack","path":"sprites/sEnemyDummyAttack/sEnemyDummyAttack.yy",},},
     {"id":{"name":"sEnemyDummyCounter","path":"sprites/sEnemyDummyCounter/sEnemyDummyCounter.yy",},},
     {"id":{"name":"sEnemyDummyIdle","path":"sprites/sEnemyDummyIdle/sEnemyDummyIdle.yy",},},
+    {"id":{"name":"sEnemyFlying","path":"sprites/sEnemyFlying/sEnemyFlying.yy",},},
     {"id":{"name":"sEnemyHitboxRec","path":"sprites/sEnemyHitboxRec/sEnemyHitboxRec.yy",},},
     {"id":{"name":"sHitboxArc","path":"sprites/sHitboxArc/sHitboxArc.yy",},},
     {"id":{"name":"sHitboxHor","path":"sprites/sHitboxHor/sHitboxHor.yy",},},
@@ -102,6 +107,7 @@
   "resourceVersion":"2.0",
   "RoomOrderNodes":[
     {"roomId":{"name":"rTest","path":"rooms/rTest/rTest.yy",},},
+    {"roomId":{"name":"rTest_backup","path":"rooms/rTest_backup/rTest_backup.yy",},},
   ],
   "templateType":"game",
   "TextureGroups":[

+ 29 - 2
notes/必读(更新日志)/必读(更新日志).txt

@@ -41,5 +41,32 @@ gml内部会计算image_index += sprite_fps / game_fps * image_speed等等公式
 
 10. 你可以接着写
 
-2026/2/...
-...
+2026/2/14 DrDuck
+
+1. 改进敌人碰撞箱逻辑,将persist改为hitbox_type, "COLLISION", "BLADE",...
+可以更方便地检测下劈/拼刀等逻辑
+
+2. 重构rTest方便测试手感,原rTest -> rTest_backup
+
+3. 暂时禁用player_dodge()与相关函数,方便测试
+(dash,free,attacked处将调用注释掉)
+
+4. 新增player_calc_gravity()函数,用于计算动态重力,增进手感
+替代了原来的y_spd += global.g
+此外将oInput的_jump_r改成_jump, 更适配现在的逻辑
+
+5. 对玩家攻击状态机进行微调,使得攻击时可以转向
+并销毁碰撞箱(这个还没写)
+
+6. 在oGame中增加点击瞬移,方便调试
+
+7. 需要优化check_hazard逻辑,现在会重复判定!(还没写)
+
+8. 下劈落地需要销毁碰撞箱并立刻切换至state_free(还没写)
+
+9. oEnemyHitbox的重心在center/middle, 导致玩家可能被向着错误方向击退
+(试试站在oEnemyDummy正前方一点的位置攻击,不要闪躲)(还没改)
+
+10. 计划明天弄一下跨房间?
+
+11. 有个写了一半的oEnemyFlying, 先不要动

+ 1 - 1
objects/oEnemyCrawl/Create_0.gml

@@ -1,7 +1,7 @@
 event_inherited();
 
 walk_spd = 2.5;
-hp = 150;
+hp = 15;
 
 enemy_ai = enemy_crawl_ai;
 

+ 1 - 1
objects/oEnemyHitbox/Create_0.gml

@@ -1,7 +1,7 @@
 damage = 1;
 owner = noone;
 
-persist = true;
+hitbox_type = "COLLISION";
 
 x_offset = 0;
 y_offset = 0;

+ 1 - 1
objects/oEnemyHitbox/Step_0.gml

@@ -4,7 +4,7 @@ if owner != noone
 	y = owner.y + y_offset;
 }
 
-if !persist
+if hitbox_type != "COLLISION"
 {
 	duration--;
 	if duration < 0

+ 1 - 1
objects/oGame/Create_0.gml

@@ -1,6 +1,6 @@
 icl(oInput);
 icl(oCamera);
-icl(oPlayer, 160, 2016);
+icl(oPlayer, 160, 2016 - 540);
 
 global.g = 0.5;
 

+ 10 - 1
objects/oGame/Step_0.gml

@@ -1,2 +1,11 @@
 if global.hitstop > 0
-	global.hitstop--;
+	global.hitstop--;
+	
+if global.developer_mode
+{
+	if mouse_check_button_pressed(mb_left)
+	{
+		oPlayer.x = mouse_x;
+		oPlayer.y = mouse_y;
+	}	
+}

+ 1 - 1
objects/oInput/Step_0.gml

@@ -1,5 +1,5 @@
 _jump_p = kcp("Z") || kcp("K");
-_jump_r = kcr("Z") || kcp("K");
+_jump_r = kcr("Z") || kcr("K");
 _left = kc("A") || kc(vk_left);
 _right = kc("D") || kc(vk_right);
 _up = kc("W") || kc(vk_up);

+ 0 - 1
objects/oParentEnemy/Create_0.gml

@@ -3,7 +3,6 @@ y_spd = 0;
 facing = 1;
 
 hp = 1;
-walk_spd = 0;
 
 hitstun_timer = 0;
 hitstun_max = 10;

+ 5 - 2
objects/oParentPlayerHitbox/Step_0.gml

@@ -11,16 +11,19 @@ for (var i = 0; i < _num; i++)
 {
     var _inst = _temp_list[| i];
 
-    if ds_list_find_index(hit_list, _inst) == -1
+    if ds_list_find_index(hit_list, _inst) == -1 && instance_exists(_inst)
 	{
 		if ds_list_empty(hit_list)
 			hit_feedback(owner);
+		if _inst.object_index == oEnemyHitbox
+			if _inst.hitbox_type = "BLADE"
+				global.hitstop = 10;
 		if object_is_ancestor(_inst.object_index, oParentEnemy)
             with(_inst)
 			{
 				enemy_get_hit(other.damage, other.kb_factor_x, other.kb_factor_y);
 			}
-        ds_list_add(hit_list, _inst);
+		ds_list_add(hit_list, _inst);
     }
 }
 ds_list_destroy(_temp_list);

+ 2 - 3
objects/oPlayer/Create_0.gml

@@ -42,11 +42,10 @@ marked_target = noone;
 is_marked = false;
 is_perfect = false;
 
-is_invincible = false;
+invincible_timer = 0;
 /*
 debug_hitbox_x1 = 0;
 debug_hitbox_y1 = 0;
 debug_hitbox_x2 = 0;
 debug_hitbox_y2 = 0;
-*/
-tp_lastsafe = false;
+*/

+ 3 - 2
objects/oPlayer/Step_0.gml

@@ -4,7 +4,8 @@ if check_hitstop()
 player_status_update();
 
 player_check_attacked();
-player_check_hazard();
+if state != state_hitstun_hazard
+	player_check_hazard();
 
 state();
 
@@ -13,7 +14,7 @@ player_move_and_collide();
 /**/
 image_xscale = facing;
 
-if is_invincible && global.developer_mode
+if invincible_timer > 0 && global.developer_mode
 	image_blend = c_orange;
 else
 	image_blend = c_white;

+ 0 - 1
objects/oPlayer/oPlayer.yy

@@ -4,7 +4,6 @@
   "eventList":[
     {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"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",},
-    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
     {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
     {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":1,"eventType":2,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
   ],

+ 1 - 1
objects/oPlayerHitboxVer/Create_0.gml

@@ -6,7 +6,7 @@ kb_factor_y = -10;
 
 hit_feedback = function(_owner)
 {
-	_owner.y_spd = _owner.jump_spd * 0.8;
+	_owner.y_spd = _owner.jump_spd * 0.64;
 	_owner.jump_cnt = 1;
 	_owner.can_dash = true;
 	_owner.coyote_timer = 0;

Dosya farkı çok büyük olduğundan ihmal edildi
+ 913 - 402
rooms/rTest/rTest.yy


+ 1 - 1
scripts/DummyAI/DummyAI.gml

@@ -16,7 +16,7 @@ function enemy_dummy_ai()
 		case "COUNTER":
 			if animation_end()
 			{
-				enemy_create_hitbox(384, 96, facing * 192, 0, 12);
+				enemy_create_hitbox(384, 144, facing * 192, 0, 12);
 				
 				state = "ATTACK";
 				set_sprite(sEnemyDummyCounter);

+ 3 - 2
scripts/EnemyStates/EnemyStates.gml

@@ -37,7 +37,8 @@ function enemy_check_hitstun()
 		x_spd = 0;
 		y_spd = 0;
 		
-		image_blend = c_orange;
+		if global.developer_mode
+			image_blend = c_orange;
 	}
 	else
 	{
@@ -89,7 +90,7 @@ oEnemyHitbox的基础大小为2*2
 */	
 	if _duration != 0
 	{
-		_hb.persist = false;
+		_hb.hitbox_type = "BLADE";
 		_hb.duration = _duration;
 	}
 	return _hb;

+ 48 - 34
scripts/PlayerStates/PlayerStates.gml

@@ -1,5 +1,8 @@
 function player_move_and_collide()
 {
+	y_spd *= global.time_scale;
+	x_spd *= global.time_scale;
+	
     if place_meeting(x, y + y_spd, oParentSolid)
 	{
         while !place_meeting(x, y + sign(y_spd), oParentSolid)
@@ -28,6 +31,9 @@ function player_move_and_collide()
         }
 	}
     x += x_spd;
+	
+	y_spd /= global.time_scale;
+	x_spd /= global.time_scale;
 }
 function player_status_update()
 {
@@ -60,19 +66,22 @@ function player_status_update()
 		jump_cnt = 1;
 		
 	if dash_cooldown > 0
-		dash_cooldown--;
+		dash_cooldown -= global.time_scale;
 
 	if dash_buffer > 0
-		dash_buffer--;
+		dash_buffer -= global.time_scale;
 	
 	if attack_buffer > 0
-		attack_buffer--;
+		attack_buffer -= global.time_scale;
 	
 	if move_lock_timer > 0
-		move_lock_timer--;
+		move_lock_timer -= global.time_scale;
 	
 	if coyote_timer > 0
-		coyote_timer--;
+		coyote_timer -= global.time_scale;
+		
+	if invincible_timer > 0
+		invincible_timer -= global.time_scale;
 }
 
 function player_check_dash()
@@ -156,13 +165,12 @@ function player_check_dodge()
 
 function player_check_attacked()
 {
-	if current_attacker == noone || is_invincible
-	|| (state == state_dodge && dodge_phase == "WAIT")
+	if current_attacker == noone || invincible_timer > 0
+	//|| (state == state_dodge && dodge_phase == "WAIT")
 		return;
 	
 	global.playerHP -= current_attacker.damage;
-	is_invincible = true;
-	alarm[0] = 80; // 稍后取缔
+	invincible_timer = 80;
 	
 	var _dir = sign(x - current_attacker.x); 
     if _dir == 0
@@ -186,8 +194,7 @@ function player_check_hazard()
     {
         global.playerHP -= _hazard.damage;
 		
-		is_invincible = true;
-        alarm[0] = 150;
+		invincible_timer = 150;
 		
 		var _dir = sign(x - _hazard.x); 
 		if _dir == 0
@@ -206,7 +213,7 @@ function player_check_hazard()
 function state_hitstun_attacked()
 {
 	x_spd = lerp(x_spd, 0, 0.1);	
-	y_spd += global.g;
+	y_spd += player_calc_gravity();
 	
 	if animation_end()
 		state = state_free;
@@ -214,7 +221,7 @@ function state_hitstun_attacked()
 function state_hitstun_hazard()
 {
 	x_spd = lerp(x_spd, 0, 0.1);
-	y_spd += global.g;
+	y_spd += player_calc_gravity();
 	
 	if animation_end()
 	{
@@ -224,7 +231,7 @@ function state_hitstun_hazard()
 		_fade._callback = function()
 		{
 			oPlayer.x = 160;//oPlayer.last_safe_x;
-			oPlayer.y = 2016;//oPlayer.last_safe_y;
+			oPlayer.y = 2016 - 540;//oPlayer.last_safe_y;
 			camera_snap();
 		};
 	}
@@ -232,7 +239,7 @@ function state_hitstun_hazard()
 
 function state_free()
 {
-	y_spd += global.g;
+	y_spd += player_calc_gravity();
 	
 	if _on_wall != 0 && y_spd > 0
 		y_spd = min(y_spd, 3);
@@ -259,9 +266,10 @@ function state_free()
 		}
 	}
 	
-	/**/
+	/*
 	player_check_dodge();
 	if state == state_dodge return;
+	*/
 	
 	player_check_movement();
 	player_check_dash();
@@ -270,7 +278,7 @@ function state_free()
 }
 function state_dash()
 {
-    y_spd += 0.2 * global.g;
+    y_spd += 0.2 * player_calc_gravity();
     icl(oPlayerAfterImage);
 	
     if animation_end()
@@ -282,14 +290,15 @@ function state_dash()
         player_check_attack();
     }
 	
-	player_check_dodge();
+	//player_check_dodge();
 }
 function state_attack()
 {
 	player_check_movement();
 	player_check_jump();
+	player_check_dash();
 	
-    y_spd += global.g;
+    y_spd += player_calc_gravity();
 	
     if image_index == 1
 	{
@@ -316,18 +325,33 @@ function state_attack()
 		_hb.owner = id;
 	}
     // 冲刺预输入
-    if image_index >= 2
-        player_check_dash();
 	// 攻击后摇结束
+	if facing = -_move_dir
+		state = state_free;
     if animation_end()
         state = state_free;
 }
 function state_locked()
 {
 	x_spd = 0;
-	y_spd += global.g;
+	y_spd += player_calc_gravity();
+}
+
+/// @desc 返回基于玩家当前状态的重力值,注意不会自动赋值
+function player_calc_gravity()
+{
+	var _g = global.g;
+	
+	if y_spd > 0
+		_g *= 1.2; // 下坠
+	
+	if abs(y_spd) < 0.5
+		_g *= 0.75; //滞空
+	
+	return _g; // * global.time_scale;
 }
 
+/*
 function state_dodge()
 {
 	if dodge_phase == "WAIT"
@@ -344,12 +368,11 @@ function state_dodge()
 			if current_attacker != noone && is_marked
 			{
                 is_perfect = true;
-				is_invincible = true;
+				invincible_timer = 150;
 				
                 global.time_scale = 0.2;
 				global.hitstop = 20;
 				
-				alarm[0] = 210; //之后实机测试计算
             }
 		}
 	}
@@ -409,13 +432,4 @@ function state_dodge_ending()
     if animation_end()
 		state = state_free;
 }
-
-/*
-function player_check_hyper()
-{
-	if oInput.hyper
-	{
-	
-	}
-*/
-	
+*/

+ 5 - 1
sprites/sEnemyCrawl/sEnemyCrawl.yy

@@ -13,6 +13,7 @@
   "For3D":false,
   "frames":[
     {"$GMSpriteFrame":"v1","%Name":"313d19ac-423c-4585-89d5-d727c8a6382e","name":"313d19ac-423c-4585-89d5-d727c8a6382e","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
+    {"$GMSpriteFrame":"v1","%Name":"2206178b-f750-4980-9248-d3c5d997dd60","name":"2206178b-f750-4980-9248-d3c5d997dd60","resourceType":"GMSpriteFrame","resourceVersion":"2.0",},
   ],
   "gridX":0,
   "gridY":0,
@@ -49,7 +50,7 @@
     },
     "eventStubScript":null,
     "eventToFunction":{},
-    "length":1.0,
+    "length":2.0,
     "lockOrigin":false,
     "moments":{
       "$KeyframeStore<MomentsEventKeyframe>":"",
@@ -71,6 +72,9 @@
             {"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
                 "0":{"$SpriteFrameKeyframe":"","Id":{"name":"313d19ac-423c-4585-89d5-d727c8a6382e","path":"sprites/sEnemyCrawl/sEnemyCrawl.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
               },"Disabled":false,"id":"803bc476-ea8e-4da5-bd78-635ef15618c1","IsCreationKey":false,"Key":0.0,"Length":1.0,"resourceType":"Keyframe<SpriteFrameKeyframe>","resourceVersion":"2.0","Stretch":false,},
+            {"$Keyframe<SpriteFrameKeyframe>":"","Channels":{
+                "0":{"$SpriteFrameKeyframe":"","Id":{"name":"2206178b-f750-4980-9248-d3c5d997dd60","path":"sprites/sEnemyCrawl/sEnemyCrawl.yy",},"resourceType":"SpriteFrameKeyframe","resourceVersion":"2.0",},
+              },"Disabled":false,"id":"7ba0e635-adfc-409a-925e-bb3a24cccbde","IsCreationKey":false,"Key":1.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,

BIN
sprites/sEnemyHitboxRec/a76ad535-27e8-4a95-b902-7e8bd3b236b8.png


BIN
sprites/sEnemyHitboxRec/layers/a76ad535-27e8-4a95-b902-7e8bd3b236b8/294f880a-79b3-48fc-888a-f3c14992345f.png


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor