mirror of
http://junepve.top:3000/chicrobot/CINC.git
synced 2026-10-30 06:41:29 +08:00
feat(skill) 添加3技能技能效果
This commit is contained in:
1 parent
4644d9a838
commit
0d88556089
1 file changed
+161
-8
@@ -283,7 +283,7 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 相机锁定逻辑:如果有锁定状态且有当前控制的角色,则让相机跟随角色
|
// 相机锁定逻辑:如果有锁定状态且有当前控制的角色,则让相机跟随角色
|
||||||
import('../systems/ControlMode.js').then(mod => {
|
import('../../systems/ControlMode.js').then(mod => {
|
||||||
if (mod.cameraLocked && this.currentlyControlled) {
|
if (mod.cameraLocked && this.currentlyControlled) {
|
||||||
this.cameras.main.startFollow(this.currentlyControlled);
|
this.cameras.main.startFollow(this.currentlyControlled);
|
||||||
} else {
|
} else {
|
||||||
@@ -501,7 +501,7 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
this.skillWheel.skillInfo = {
|
this.skillWheel.skillInfo = {
|
||||||
1: { key: 'Q', color: 0x00ff00 }, // 扔出傀儡
|
1: { key: 'Q', color: 0x00ff00 }, // 扔出傀儡
|
||||||
2: { key: 'W', color: 0x00ffff }, // 二技能:飞镖攻击
|
2: { key: 'W', color: 0x00ffff }, // 二技能:飞镖攻击
|
||||||
3: { key: 'E', color: 0xff00ff }, // 占位
|
3: { key: 'E', color: 0xff00ff }, // 三技能:十字斩
|
||||||
4: { key: 'R', color: 0xffff00 } // 本体移动
|
4: { key: 'R', color: 0xffff00 } // 本体移动
|
||||||
};
|
};
|
||||||
} else if (this.currentlyControlled && this.currentlyControlled.type === 'diaochan') {
|
} else if (this.currentlyControlled && this.currentlyControlled.type === 'diaochan') {
|
||||||
@@ -746,6 +746,9 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
case 2: // 技能2:扇形飞镖攻击
|
case 2: // 技能2:扇形飞镖攻击
|
||||||
this.castFanDartSkill();
|
this.castFanDartSkill();
|
||||||
break;
|
break;
|
||||||
|
case 3: // 技能3:十字斩
|
||||||
|
this.castCrossSlashSkill();
|
||||||
|
break;
|
||||||
case 4: // 技能4:本体向技能指向方向移动
|
case 4: // 技能4:本体向技能指向方向移动
|
||||||
// 确保是本体在控制
|
// 确保是本体在控制
|
||||||
if (!this.isControllingPuppet) {
|
if (!this.isControllingPuppet) {
|
||||||
@@ -793,17 +796,17 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
// 计算技能释放角度
|
// 计算技能释放角度
|
||||||
const skillAngle = Math.atan2(directionY, directionX);
|
const skillAngle = Math.atan2(directionY, directionX);
|
||||||
|
|
||||||
// 扇形角度范围:30度(转换为弧度)
|
// 扇形角度范围:45度(转换为弧度)
|
||||||
const fanAngle = Phaser.Math.DegToRad(30);
|
const fanAngle = Phaser.Math.DegToRad(45);
|
||||||
|
|
||||||
// 飞镖数量
|
// 飞镖数量
|
||||||
const dartCount = 5;
|
const dartCount = 4;
|
||||||
|
|
||||||
// 飞镖速度
|
// 飞镖速度
|
||||||
const dartSpeed = 1000;
|
const dartSpeed = 1000;
|
||||||
|
|
||||||
// 飞镖飞行距离
|
// 飞镖飞行距离
|
||||||
const dartDistance = 300;
|
const dartDistance = 400;
|
||||||
|
|
||||||
// 计算每个飞镖的角度间隔
|
// 计算每个飞镖的角度间隔
|
||||||
const angleStep = fanAngle / (dartCount - 1);
|
const angleStep = fanAngle / (dartCount - 1);
|
||||||
@@ -843,6 +846,101 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 释放十字斩技能
|
||||||
|
*/
|
||||||
|
castCrossSlashSkill() {
|
||||||
|
if (!this.currentlyControlled) return;
|
||||||
|
|
||||||
|
// 计算技能释放方向(基于技能轮盘中心到指针的相对方向)
|
||||||
|
const pointer = this.input.activePointer;
|
||||||
|
const directionX = pointer.x - this.skillWheel.centerX;
|
||||||
|
const directionY = pointer.y - this.skillWheel.centerY;
|
||||||
|
|
||||||
|
// 计算技能释放角度
|
||||||
|
const skillAngle = Math.atan2(directionY, directionX);
|
||||||
|
|
||||||
|
// 计算归一化方向向量
|
||||||
|
const distance = Math.sqrt(directionX * directionX + directionY * directionY);
|
||||||
|
let normalizedX = 0;
|
||||||
|
let normalizedY = 0;
|
||||||
|
if (distance > 0) {
|
||||||
|
normalizedX = directionX / distance;
|
||||||
|
normalizedY = directionY / distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 十字斩放置距离范围
|
||||||
|
const minDistance = 0; // 最小距离(角色自身位置)
|
||||||
|
const maxDistance = 200; // 最大距离
|
||||||
|
|
||||||
|
// 计算轮盘按钮与中心的距离百分比(相对于轮盘半径)
|
||||||
|
const distancePercentage = Math.min(distance / this.skillWheel.radius, 1);
|
||||||
|
|
||||||
|
// 根据距离百分比计算十字斩实际释放距离
|
||||||
|
const crossSlashDistance = minDistance + (maxDistance - minDistance) * distancePercentage;
|
||||||
|
// 本体反向位移距离(固定值)
|
||||||
|
const bodyDisplacementDistance = 100;
|
||||||
|
|
||||||
|
// 计算十字斩位置
|
||||||
|
const crossSlashX = this.currentlyControlled.x + normalizedX * crossSlashDistance;
|
||||||
|
const crossSlashY = this.currentlyControlled.y + normalizedY * crossSlashDistance;
|
||||||
|
|
||||||
|
// 创建十字斩效果
|
||||||
|
this.createCrossSlashEffect(crossSlashX, crossSlashY, skillAngle);
|
||||||
|
|
||||||
|
// 本体向相反方向位移
|
||||||
|
const bodyDisplacementX = -normalizedX * bodyDisplacementDistance;
|
||||||
|
const bodyDisplacementY = -normalizedY * bodyDisplacementDistance;
|
||||||
|
this.currentlyControlled.x += bodyDisplacementX;
|
||||||
|
this.currentlyControlled.y += bodyDisplacementY;
|
||||||
|
this.currentlyControlled.setVelocity(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建十字斩视觉效果
|
||||||
|
*/
|
||||||
|
createCrossSlashEffect(x, y, angle) {
|
||||||
|
// 创建十字斩图形
|
||||||
|
const crossSlash = this.add.graphics();
|
||||||
|
crossSlash.setScrollFactor(1);
|
||||||
|
crossSlash.setDepth(50);
|
||||||
|
|
||||||
|
// 十字斩尺寸
|
||||||
|
const crossSize = 80;
|
||||||
|
|
||||||
|
// 设置十字斩位置
|
||||||
|
crossSlash.setPosition(x, y);
|
||||||
|
|
||||||
|
// 绘制十字(相对于位置点)
|
||||||
|
crossSlash.lineStyle(4, 0xff00ff, 1);
|
||||||
|
// 水平线
|
||||||
|
crossSlash.beginPath();
|
||||||
|
crossSlash.moveTo(-crossSize/2, 0);
|
||||||
|
crossSlash.lineTo(crossSize/2, 0);
|
||||||
|
crossSlash.strokePath();
|
||||||
|
// 垂直线
|
||||||
|
crossSlash.beginPath();
|
||||||
|
crossSlash.moveTo(0, -crossSize/2);
|
||||||
|
crossSlash.lineTo(0, crossSize/2);
|
||||||
|
crossSlash.strokePath();
|
||||||
|
|
||||||
|
// 旋转十字斩以匹配技能方向(调整角度使连线位于夹角中间)
|
||||||
|
crossSlash.rotation = angle - Math.PI/4;
|
||||||
|
|
||||||
|
// 十字斩持续时间
|
||||||
|
const duration = 1000;
|
||||||
|
|
||||||
|
// 淡出效果
|
||||||
|
this.tweens.add({
|
||||||
|
targets: crossSlash,
|
||||||
|
alpha: 0,
|
||||||
|
duration: duration,
|
||||||
|
onComplete: () => {
|
||||||
|
crossSlash.destroy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新技能预览效果
|
* 更新技能预览效果
|
||||||
*/
|
*/
|
||||||
@@ -895,6 +993,61 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
this.skillPreview.strokeCircle(targetX, targetY, 15);
|
this.skillPreview.strokeCircle(targetX, targetY, 15);
|
||||||
this.skillPreview.fillStyle(0x00ff00, 0.2);
|
this.skillPreview.fillStyle(0x00ff00, 0.2);
|
||||||
this.skillPreview.fillCircle(targetX, targetY, 15);
|
this.skillPreview.fillCircle(targetX, targetY, 15);
|
||||||
|
} else if (this.skillWheel.activeSkill === 3 && !this.isControllingPuppet) {
|
||||||
|
// 三技能:十字斩预览
|
||||||
|
const minDistance = 0; // 最小距离(角色自身位置)
|
||||||
|
const maxDistance = 200; // 最大距离
|
||||||
|
const maxBodyDisplacementDistance = 100; // 最大本体位移距离
|
||||||
|
|
||||||
|
// 计算轮盘按钮与中心的距离百分比(相对于轮盘半径)
|
||||||
|
const distancePercentage = Math.min(distance / this.skillWheel.radius, 1);
|
||||||
|
|
||||||
|
// 根据距离百分比计算十字斩实际释放距离
|
||||||
|
const crossSlashDistance = minDistance + (maxDistance - minDistance) * distancePercentage;
|
||||||
|
// 本体反向位移距离(与十字斩释放距离成比例)
|
||||||
|
const bodyDisplacementDistance = maxBodyDisplacementDistance * distancePercentage;
|
||||||
|
|
||||||
|
// 计算十字斩位置
|
||||||
|
const crossSlashX = this.currentlyControlled.x + normalizedX * crossSlashDistance;
|
||||||
|
const crossSlashY = this.currentlyControlled.y + normalizedY * crossSlashDistance;
|
||||||
|
|
||||||
|
// 计算本体位移后的位置
|
||||||
|
const bodyDisplacementX = -normalizedX * bodyDisplacementDistance;
|
||||||
|
const bodyDisplacementY = -normalizedY * bodyDisplacementDistance;
|
||||||
|
const bodyEndX = this.currentlyControlled.x + bodyDisplacementX;
|
||||||
|
const bodyEndY = this.currentlyControlled.y + bodyDisplacementY;
|
||||||
|
|
||||||
|
// 绘制十字斩预览
|
||||||
|
this.skillPreview.lineStyle(4, 0xff00ff, 0.5);
|
||||||
|
// 计算旋转后的四个端点坐标(调整角度使连线位于夹角中间)
|
||||||
|
const crossSize = 40;
|
||||||
|
const adjustedAngle = skillAngle - Math.PI/4;
|
||||||
|
// 水平线左端点
|
||||||
|
const hLeftX = crossSlashX + Math.cos(adjustedAngle - Math.PI/2) * crossSize;
|
||||||
|
const hLeftY = crossSlashY + Math.sin(adjustedAngle - Math.PI/2) * crossSize;
|
||||||
|
// 水平右端点
|
||||||
|
const hRightX = crossSlashX + Math.cos(adjustedAngle + Math.PI/2) * crossSize;
|
||||||
|
const hRightY = crossSlashY + Math.sin(adjustedAngle + Math.PI/2) * crossSize;
|
||||||
|
// 垂直线上端点
|
||||||
|
const vTopX = crossSlashX + Math.cos(adjustedAngle) * crossSize;
|
||||||
|
const vTopY = crossSlashY + Math.sin(adjustedAngle) * crossSize;
|
||||||
|
// 垂直线下端点
|
||||||
|
const vBottomX = crossSlashX + Math.cos(adjustedAngle + Math.PI) * crossSize;
|
||||||
|
const vBottomY = crossSlashY + Math.sin(adjustedAngle + Math.PI) * crossSize;
|
||||||
|
|
||||||
|
// 绘制水平线
|
||||||
|
this.skillPreview.beginPath();
|
||||||
|
this.skillPreview.moveTo(hLeftX, hLeftY);
|
||||||
|
this.skillPreview.lineTo(hRightX, hRightY);
|
||||||
|
this.skillPreview.strokePath();
|
||||||
|
// 绘制垂直线
|
||||||
|
this.skillPreview.beginPath();
|
||||||
|
this.skillPreview.moveTo(vTopX, vTopY);
|
||||||
|
this.skillPreview.lineTo(vBottomX, vBottomY);
|
||||||
|
this.skillPreview.strokePath();
|
||||||
|
|
||||||
|
// 绘制十字斩方向
|
||||||
|
// 移除本体与技能的连线
|
||||||
} else if (this.skillWheel.activeSkill === 4 && !this.isControllingPuppet) {
|
} else if (this.skillWheel.activeSkill === 4 && !this.isControllingPuppet) {
|
||||||
// 四技能:本体移动预览
|
// 四技能:本体移动预览
|
||||||
const maxDistance = 200;
|
const maxDistance = 200;
|
||||||
@@ -917,8 +1070,8 @@ export default class AttackSkillTestScene extends Phaser.Scene {
|
|||||||
this.skillPreview.fillCircle(targetX, targetY, 15);
|
this.skillPreview.fillCircle(targetX, targetY, 15);
|
||||||
} else if (this.skillWheel.activeSkill === 2 && !this.isControllingPuppet) {
|
} else if (this.skillWheel.activeSkill === 2 && !this.isControllingPuppet) {
|
||||||
// 二技能:扇形飞镖攻击预览
|
// 二技能:扇形飞镖攻击预览
|
||||||
// 扇形角度范围:30度(转换为弧度)
|
// 扇形角度范围:45度(转换为弧度)
|
||||||
const fanAngle = Phaser.Math.DegToRad(30);
|
const fanAngle = Phaser.Math.DegToRad(45);
|
||||||
|
|
||||||
// 飞镖数量
|
// 飞镖数量
|
||||||
const dartCount = 5;
|
const dartCount = 5;
|
||||||
|
|||||||
Reference in new issue
Block a user