英雄卡片 召唤成功, todo 细节优化

This commit is contained in:
2024-11-19 00:14:01 +08:00
parent da06fb8954
commit ce8b47de7d
11 changed files with 2300 additions and 8929 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -50,6 +50,7 @@ export class SingletonModuleComp extends ecs.Comp {
Role: Role = null;
heros:any = [];
mheros:any = [];
monsters:any = [];
skills:any = []
sk_info:any = []

View File

@@ -170,22 +170,22 @@ export class HeroViewComp extends CCComp {
}
onPreSolve (selfCollider: Collider2D, otherCollider: Collider2D) {
// if(selfCollider.group == otherCollider.group&&selfCollider.tag==otherCollider.tag){
// if(otherCollider.node.name=="role") return
// let self_x = selfCollider.node.position.x;
// let other_x = otherCollider.node.position.x;
// if(otherCollider.node.getComponent(HeroViewComp).type == this.type && self_x < other_x && Math.abs(other_x-self_x) < 15 ){
// this.stop_cd = 0.1;
// }
// // if(selfCollider.node.position.y < otherCollider.node.position.y){
// // if(selfCollider.node.getSiblingIndex() < otherCollider.node.getSiblingIndex()){
if(selfCollider.group == otherCollider.group&&selfCollider.tag==otherCollider.tag){
if(otherCollider.node.name=="role") return
let self_x = selfCollider.node.position.x;
let other_x = otherCollider.node.position.x;
if(otherCollider.node.getComponent(HeroViewComp).type == this.type && self_x < other_x && Math.abs(other_x-self_x) < 30 ){
this.stop_cd = 0.1;
}
// if(selfCollider.node.position.y < otherCollider.node.position.y){
// if(selfCollider.node.getSiblingIndex() < otherCollider.node.getSiblingIndex()){
// // selfCollider.node.setSiblingIndex(otherCollider.node.getSiblingIndex()+1)
// // // console.log("onPreSolve b:"+selfCollider.node.uuid+":"+selfCollider.node.getSiblingIndex()+"/"+otherCollider.node.uuid+":"+otherCollider.node.getSiblingIndex());
// // }
// // }
// selfCollider.node.setSiblingIndex(otherCollider.node.getSiblingIndex()+1)
// // console.log("onPreSolve b:"+selfCollider.node.uuid+":"+selfCollider.node.getSiblingIndex()+"/"+otherCollider.node.uuid+":"+otherCollider.node.getSiblingIndex());
// }
// }
}
if(selfCollider.group != otherCollider.group&&otherCollider.tag == 0){
this.stop_cd = 0.1;
this.is_atking=true

View File

@@ -207,7 +207,7 @@ export class CardControllerComp extends CCComp {
this.node.getChildByName("mission_home").active=false
this.node.getChildByName("mission").active=true
smc.vm_data.mission.play = true;
oops.message.dispatchEvent("mission_start")
// oops.message.dispatchEvent("mission_start")
}
to_home(){
this.node.getChildByName("mission_home").active=false

View File

@@ -0,0 +1,48 @@
import { instantiate, Prefab } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { smc } from "../common/SingletonModuleComp";
import { HCardComp } from "./HCardComp";
/** HCard 模块 */
@ecs.register(`HCard`)
export class HCard extends ecs.Entity {
/** ---------- 数据层 ---------- */
// HCardModel!: HCardModelComp;
/** ---------- 业务层 ---------- */
// HCardBll!: HCardBllComp;
/** ---------- 视图层 ---------- */
// HCardView!: HCardViewComp;
/** 实始添加的数据层组件 */
protected init() {
// this.addComponents<ecs.Comp>();
}
load(uuid:number=1001,index:number=-1,parent:any) {
let box_group= 0
var path = "gui/element/hcard";
var prefab: Prefab = oops.res.get(path, Prefab)!;
var node = instantiate(prefab);
node.parent = parent
var hcc = node.getComponent(HCardComp)!;
hcc.hi= index
this.add(hcc)
}
/** 模块资源释放 */
destroy() {
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
super.destroy();
}
}
/** HCard 模块业务逻辑系统组件,如无业务逻辑处理可删除此对象 */
export class EcsHCardSystem extends ecs.System {
constructor() {
super();
// this.add(new ecs.ComblockSystem());
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "92107feb-d660-4d0b-9ed8-a27bf6bcdd46",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,31 @@
import { _decorator,Button,EventHandler,EventTouch,Label,NodeEventType,resources,Sprite,SpriteAtlas,UITransform,v3 } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { smc } from "../common/SingletonModuleComp";
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { RandomManager } from "../../../../extensions/oops-plugin-framework/assets/core/common/random/RandomManager";
import { HeroModelComp } from "../hero/HeroModelComp";
const { ccclass, property } = _decorator;
/** 视图层对象 */
@ccclass('HCardComp')
@ecs.register('HCardComp', false)
export class HCardComp extends CCComp {
hi: number = 0;
protected onLoad(): void {
}
start() {
let heros:any= ecs.query(ecs.allOf(HeroModelComp));
this.node.getChildByName("name").getComponent(Label)!.string = heros[this.hi].HeroView.hero_name
}
/** 视图对象通过 ecs.Entity.remove(ControllerComp) 删除组件是触发组件处理自定义释放逻辑 */
reset() {
console.log("hcard reset");
this.node.destroy();
}
}

View File

@@ -0,0 +1 @@
{"ver":"4.0.23","importer":"typescript","imported":true,"uuid":"b2cd85d5-4a01-4430-acdb-dd37eaa45dd5","files":[],"subMetas":{},"userData":{}}

View File

@@ -1,4 +1,4 @@
import { _decorator,Button,EventHandler,EventTouch,Label,NodeEventType,resources,Sprite,SpriteAtlas,UITransform,v3 } from "cc";
import { _decorator,Button,EventHandler,EventTouch,Label,NodeEventType,resources,Sprite,SpriteAtlas,UITransform,v3, Vec3 } from "cc";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { smc } from "../common/SingletonModuleComp";
@@ -7,7 +7,7 @@ import { RandomManager } from "../../../../extensions/oops-plugin-framework/asse
import { SkillSet } from "../common/config/SkillSet";
import { HeroModelComp } from "../hero/HeroModelComp";
import { RewardSet } from "../common/config/RewardSet";
import { GameSet } from "../common/config/BoxSet";
import { BoxSet, GameSet } from "../common/config/BoxSet";
import { GameMap } from "./GameMap";
import { MapModelComp } from "./model/MapModelComp";
import { Talent } from "../Role/Talent";
@@ -16,22 +16,242 @@ import { MonViewComp } from "../mon/MonViewComp";
import { HeroViewComp } from "../hero/HeroViewComp";
import { RoleViewComp } from "../Role/RoleViewComp";
import { BossViewComp } from "../Boss/BossViewComp";
import { Hero } from "../hero/Hero";
import { HeroSet } from "../common/config/heroSet";
import { Boss } from "../Boss/Boss";
import { MonModelComp } from "../mon/MonModelComp";
import { BossList, MissionNum, MonsetList } from "../common/config/MissionSet";
import { Timer } from "../../../../extensions/oops-plugin-framework/assets/core/common/timer/Timer";
import { HCard } from "./HCard";
import { HCardComp } from "./HCardComp";
const { ccclass, property } = _decorator;
/** 视图层对象 */
@ccclass('MissionComp')
@ecs.register('Mission', false)
export class MissionComp extends CCComp {
max_count: number = 99 ; //最大波次
cur_count: number = 1; //波次
boss_count: number = 10; //boss波次间隔
monster_level:number = 1; //怪物池等级
max_monster_level:number = 4; //最高怪物次等级
min_monster_num:number = 1; ///最小每次刷新怪物数量
max_monster_num:number = 1; //最大每次刷新怪物数量
refresh_timer: Timer = new Timer(5); // 刷新怪物定时器
refresh_cd: Timer = new Timer(0.5);
mission_up_timer: Timer = new Timer(30); //波次增加
boss_timer: Timer = new Timer(10);
boss_num:number = 1;
cur_mission:number = 1; //当前关卡方案
mission_list:any = []
boss_list:any = []
setp_timer: Timer = new Timer(0.3);
call_hero_timer: Timer = new Timer(0.3);
target_timer: Timer = new Timer(0.1);
setp_num:number = smc.vm_data.mission.once;
total:number = 0;
hero_total:number = 0;
reward:number = 0;
reward_num:number = 0;
game_over:boolean = false;
start_ys:any[] = [0,70,-70];
mon_index:number = 0
protected onLoad(): void {
onLoad(){
// 监听全局事件
oops.message.on("other_add_monster", this.on_other_add_monster, this);
oops.message.on("do_add_hero", this.on_do_add_hero, this);
oops.message.on("mission_start", this.mission_start, this);
oops.message.on("mission_end", this.mission_end, this);
oops.message.on("mon_dead", this.on_mon_dead, this);
}
start() {
this.hcard_call()
}
/** 视图对象通过 ecs.Entity.remove(ControllerComp) 删除组件是触发组件处理自定义释放逻辑 */
protected update(dt: number): void {
if(!smc.vm_data.mission.play||smc.vm_data.pause){
return
}
if(this.setp_timer.update(dt)){
if(this.total<=0) return
this.monster_refresh()
}
if(this.call_hero_timer.update(dt)){
if(this.hero_total <= 0) return
this.heros_call()
}
if(this.boss_timer.update(dt)){
if(this.boss_num <=0 ) return
// this.load_boss()
}
this.is_reward()
if (this.refresh_timer.update(dt)) {
this.setp_num=smc.vm_data.mission.once
}
if (this.mission_up_timer.update(dt)) {
// 刷新怪物定时器
this.cur_count += 1;
}
this.count_hero_pos()
this.count_mon_pos()
// if (this.game_timer.update(dt)) {
// smc.vm_data.game.g_time += 1;
// }
// this.shuaxin(dt)
}
mission_start(){
this.total=smc.vm_data.mission.m_less=smc.vm_data.mission.m_alive=smc.vm_data.mission.total;
this.hero_total=2
let num =RandomManager.instance.getRandomByObjectList(MissionNum,1)
this.cur_mission = num[0]
this.mission_list = MonsetList[this.cur_mission]
this.boss_list = BossList[this.cur_mission]
// console.log("当前关卡方案",this.cur_mission,this.mission_list)
this.refresh_timer= new Timer(smc.vm_data.mission.refresh_timer);
this.boss_num=1
this.boss_timer = new Timer(smc.vm_data.mission.boss_cd)
smc.vm_data.mission.coin = 0
}
mission_end(){
smc.vm_data.mission.play=false
let heros:any= ecs.query(ecs.allOf(HeroViewComp));
let hcards:any= ecs.query(ecs.allOf(HCardComp));
let hcns=this.node.getChildByName("hcards")
for(let i=0;i<hcns.children.length;i++){
hcns.children[i].destroy()
}
for(let i=0;i<heros.length;i++){
heros[i].HeroView.ent.destroy()
}
for(let i=0;i<hcards.length;i++){
hcards[i].HCardComp.ent.destroy()
}
}
on_mon_dead(){
let coin =(GameSet.MON_COIN_ADD*smc.vm_data.mission.coin_reward_add*(1+Talents[1006].bonus*smc.vm_data.talent[1006].lv)).toFixed(0)
smc.vm_data.mission.coin += parseFloat(coin)
smc.vm_data.mission.reward_num += 1;
smc.vm_data.mission.reward_gold +=10+(1-smc.vm_data.mission.mission_lv)*1
smc.vm_data.mission.reward_exp +=10+(1-smc.vm_data.mission.mission_lv)*1
smc.vm_data.mission.m_alive -= 1;
if(smc.vm_data.mission.m_alive <= 0){
smc.vm_data.mission.victory = 1;
oops.message.dispatchEvent("minssion_victory");
}
}
monster_refresh(){
if (this.setp_num <= 0){
return
}
let m:any = RandomManager.instance.getRandomByObjectList(this.mission_list[this.monster_level],1)
this.addMonster(m[0])
this.mon_index += 1
if(this.mon_index>2){
this.mon_index = 0
}
smc.vm_data.mission.m_less=this.total -= 1
// this.setp_num -= 1
}
is_reward(){
if(smc.vm_data.mission.reward_num < smc.vm_data.mission.reward) return
// this.do_reward()
smc.vm_data.mission.reward_num = 0
}
do_reward(){
console.log("do_reward")
oops.message.dispatchEvent("do_reward");
}
private on_other_add_monster(event: string, args: any) {
var scene = smc.map.MapView.scene;
let pos:Vec3 = v3(BoxSet.MONSTER_START,BoxSet.GAME_LINE)
let monster_layer = scene.entityLayer!.node!
this.addMonster(args.uuid)
}
check_mon_count(){
let count = 0;
let list = ecs.query(ecs.allOf(MonModelComp));
count = list.length
return count;
}
count_mon_pos(){
let monsters:any= ecs.query(ecs.allOf(MonModelComp));
for(let i=0;i<monsters.length;i++){
if(monsters[i].HeroView == undefined) return
let mon:any = monsters[i].HeroView.node.position
smc.enemy_pos[i].x= mon.x
}
}
count_hero_pos(){
let heros:any= ecs.query(ecs.allOf(HeroModelComp));
for(let i=0;i<heros.length;i++){
if(heros[i].HeroView == undefined) return
let ho:any = heros[i].HeroView.node.position
smc.hero_pos[i].x= ho.x
}
}
private on_do_add_hero(event: string, args: any) {
this.addHero(args.uuid)
}
heros_call(){
let hero:any =RandomManager.instance.getRandomByObjectList(smc.cards, 1);
this.addHero(hero[0].uuid)
this.hero_total -= 1
if(this.hero_total <= 0){
console.log("heros_call")
this.hcard_call()
}
}
hcard_call(){
let node =this.node.getChildByName("hcards")
let heros:any= ecs.query(ecs.allOf(HeroModelComp));
for(let i=0;i<heros.length;i++){
let hcard = ecs.getEntity<HCard>(HCard)
console.log("hcard:",hcard)
hcard.load(1001,0,node)
}
}
/** 添加玩家 */
private addHero(uuid:number=1001) {
let hero = ecs.getEntity<Hero>(Hero);
let scale = 1
let pos:Vec3 = v3(HeroSet.StartPos[smc.heros[uuid].type],BoxSet.GAME_LINE);
console.log("addHero:",pos)
hero.load(pos,scale,uuid);
}
private addMonster(uuid:number=1001) {
let monster = ecs.getEntity<Hero>(Hero);
let scale = -1
let index = -1
let pos:Vec3 = v3(-1*HeroSet.StartPos[smc.heros[uuid].type],BoxSet.GAME_LINE);
console.log("addMonster:",pos)
monster.load(pos,scale,uuid,index,false);
}
load_boss(){
let bs:any = RandomManager.instance.getRandomByObjectList(this.boss_list[this.monster_level],1)
var scene = smc.map.MapView.scene;
let pos:Vec3 = v3(260,BoxSet.GAME_LINE)
let layer = scene.entityLayer!.node!
let b = ecs.getEntity<Boss>(Boss);
let scale = -1
b.load(pos,scale,bs[0],layer);
this.boss_num -= 1
}
/** 视图层逻辑代码分离演示 */
/** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */
reset() {
this.node.destroy();
}

View File

@@ -24,223 +24,21 @@ const { ccclass, property } = _decorator;
@ccclass('MapMonsterComp')
@ecs.register('MapMonster', false)
export class MapMonsterComp extends CCComp {
scene: MapViewScene = null;
max_count: number = 99 ; //最大波次
cur_count: number = 1; //波次
boss_count: number = 10; //boss波次间隔
monster_level:number = 1; //怪物池等级
max_monster_level:number = 4; //最高怪物次等级
min_monster_num:number = 1; ///最小每次刷新怪物数量
max_monster_num:number = 1; //最大每次刷新怪物数量
refresh_timer: Timer = new Timer(5); // 刷新怪物定时器
refresh_cd: Timer = new Timer(0.5);
mission_up_timer: Timer = new Timer(30); //波次增加
boss_timer: Timer = new Timer(10);
boss_num:number = 1;
cur_mission:number = 1; //当前关卡方案
mission_list:any = []
boss_list:any = []
setp_timer: Timer = new Timer(0.3);
call_hero_timer: Timer = new Timer(0.3);
target_timer: Timer = new Timer(0.1);
setp_num:number = smc.vm_data.mission.once;
total:number = 0;
hero_total:number = 0;
reward:number = 0;
reward_num:number = 0;
game_over:boolean = false;
start_ys:any[] = [0,70,-70];
mon_index:number = 0
hero_index:number = 0
hero_x:number = 0;
@property(Node)
start_p: Node = null;
onLoad(){
// 监听全局事件
oops.message.on("other_add_monster", this.on_other_add_monster, this);
oops.message.on("do_add_hero", this.on_do_add_hero, this);
oops.message.on("mission_start", this.mission_start, this);
oops.message.on("mission_end", this.mission_end, this);
oops.message.on("normal_call", this.on_normal_call, this);
oops.message.on("better_call", this.on_better_call, this);
oops.message.on("mon_dead", this.on_mon_dead, this);
}
start() {
// this.scene = this.getComponent(MapViewScene);
// this.scene.node.active = true
// this.scene = this.getComponent(MapViewScene);
var scene = smc.map.MapView.scene;
this.start_p.parent=scene.mapLayer!.node!
this.set_start_point()
}
protected update(dt: number): void {
if(!smc.vm_data.mission.play||smc.vm_data.pause){
return
}
if(this.setp_timer.update(dt)){
if(this.total<=0) return
this.monster_refresh()
}
if(this.call_hero_timer.update(dt)){
if(this.hero_total <= 0) return
this.on_normal_call()
}
if(this.boss_timer.update(dt)){
if(this.boss_num <=0 ) return
// this.load_boss()
}
this.is_reward()
if (this.refresh_timer.update(dt)) {
this.setp_num=smc.vm_data.mission.once
}
if (this.mission_up_timer.update(dt)) {
// 刷新怪物定时器
this.cur_count += 1;
}
this.count_hero_pos()
this.count_mon_pos()
// if (this.game_timer.update(dt)) {
// smc.vm_data.game.g_time += 1;
// }
// this.shuaxin(dt)
}
mission_start(){
this.total=smc.vm_data.mission.m_less=smc.vm_data.mission.m_alive=smc.vm_data.mission.total;
this.hero_total=1
let num =RandomManager.instance.getRandomByObjectList(MissionNum,1)
this.cur_mission = num[0]
this.mission_list = MonsetList[this.cur_mission]
this.boss_list = BossList[this.cur_mission]
// console.log("当前关卡方案",this.cur_mission,this.mission_list)
this.refresh_timer= new Timer(smc.vm_data.mission.refresh_timer);
this.boss_num=1
this.boss_timer = new Timer(smc.vm_data.mission.boss_cd)
this.hero_x=0
this.hero_index=0
smc.vm_data.mission.coin = 0
}
mission_end(){
smc.vm_data.mission.play=false
let heros:any= ecs.query(ecs.allOf(HeroViewComp));
for(let i=0;i<heros.length;i++){
heros[i].HeroView.ent.destroy()
}
}
on_mon_dead(){
let coin =(GameSet.MON_COIN_ADD*smc.vm_data.mission.coin_reward_add*(1+Talents[1006].bonus*smc.vm_data.talent[1006].lv)).toFixed(0)
smc.vm_data.mission.coin += parseFloat(coin)
smc.vm_data.mission.reward_num += 1;
smc.vm_data.mission.reward_gold +=10+(1-smc.vm_data.mission.mission_lv)*1
smc.vm_data.mission.reward_exp +=10+(1-smc.vm_data.mission.mission_lv)*1
smc.vm_data.mission.m_alive -= 1;
if(smc.vm_data.mission.m_alive <= 0){
smc.vm_data.mission.victory = 1;
oops.message.dispatchEvent("minssion_victory");
}
}
on_normal_call(){
let hero:any =RandomManager.instance.getRandomByObjectList(smc.cards, 1);
this.addHero(hero[0].uuid)
this.hero_total -= 1
}
on_better_call(){
let hero:any =RandomManager.instance.getRandomByObjectList(smc.cards, 1);
console.log("better_call:",hero)
this.addHero(hero[0].uuid)
}
monster_refresh(){
if (this.setp_num <= 0){
return
}
let m:any = RandomManager.instance.getRandomByObjectList(this.mission_list[this.monster_level],1)
this.addMonster(m[0])
this.mon_index += 1
if(this.mon_index>2){
this.mon_index = 0
}
smc.vm_data.mission.m_less=this.total -= 1
// this.setp_num -= 1
}
is_reward(){
if(smc.vm_data.mission.reward_num < smc.vm_data.mission.reward) return
// this.do_reward()
smc.vm_data.mission.reward_num = 0
}
do_reward(){
console.log("do_reward")
oops.message.dispatchEvent("do_reward");
}
private on_other_add_monster(event: string, args: any) {
var scene = smc.map.MapView.scene;
let pos:Vec3 = v3(BoxSet.MONSTER_START,BoxSet.GAME_LINE)
let monster_layer = scene.entityLayer!.node!
this.addMonster(args.uuid)
}
set_start_point(){
// this.start_p.setPosition(-240,BoxSet.GAME_LINE+this.start_ys[this.hero_index]+30,0)
}
check_mon_count(){
let count = 0;
let list = ecs.query(ecs.allOf(MonModelComp));
count = list.length
return count;
}
count_mon_pos(){
let monsters:any= ecs.query(ecs.allOf(MonModelComp));
for(let i=0;i<monsters.length;i++){
if(monsters[i].HeroView == undefined) return
let mon:any = monsters[i].HeroView.node.position
smc.enemy_pos[i].x= mon.x
}
}
count_hero_pos(){
let heros:any= ecs.query(ecs.allOf(HeroModelComp));
for(let i=0;i<heros.length;i++){
if(heros[i].HeroView == undefined) return
let ho:any = heros[i].HeroView.node.position
smc.hero_pos[i].x= ho.x
}
}
private on_do_add_hero(event: string, args: any) {
this.addHero(args.uuid)
}
/** 添加玩家 */
private addHero(uuid:number=1001) {
let hero = ecs.getEntity<Hero>(Hero);
let scale = 1
let pos:Vec3 = v3(HeroSet.StartPos[smc.heros[uuid].type],BoxSet.GAME_LINE);
console.log("addHero:",pos)
hero.load(pos,scale,uuid);
this.set_start_point()
}
private addMonster(uuid:number=1001) {
let monster = ecs.getEntity<Hero>(Hero);
let scale = -1
let index = -1
let pos:Vec3 = v3(-1*HeroSet.StartPos[smc.heros[uuid].type],BoxSet.GAME_LINE);
console.log("addMonster:",pos)
monster.load(pos,scale,uuid,index,false);
}
load_boss(){
let bs:any = RandomManager.instance.getRandomByObjectList(this.boss_list[this.monster_level],1)
var scene = smc.map.MapView.scene;
let pos:Vec3 = v3(260,BoxSet.GAME_LINE)
let layer = scene.entityLayer!.node!
let b = ecs.getEntity<Boss>(Boss);
let scale = -1
b.load(pos,scale,bs[0],layer);
this.boss_num -= 1
}
/** 视图层逻辑代码分离演示 */