更新无限地图

This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2023-11-03 02:57:38 +08:00
parent 996b0ecfac
commit ca5fa0cc92
504 changed files with 2213 additions and 359 deletions

View File

@@ -24,6 +24,7 @@ import { TableGRoleAttackBullet } from "../resources/config/ts/TableGRoleAttackB
import { TableGRoleAttackEffect } from "../resources/config/ts/TableGRoleAttackEffect";
import { TableGRoleSkill } from "../resources/config/ts/TableGRoleSkill";
import { TableGRoleSkillEffect } from "../resources/config/ts/TableGRoleSkillEffect";
import { TableGMap } from "../resources/config/ts/TableGMap";
let IP = "kyu.jisol.cn";
@@ -113,6 +114,7 @@ export class JNGConfig extends SystemBase{
{name:TableGRoleAttackEffect.TableName}, //角色攻击特效
{name:TableGRoleSkill.TableName}, //角色技能
{name:TableGRoleSkillEffect.TableName}, //角色技能特效
{name:TableGMap.TableName}, //游戏地图
].map((table) => {
return {
name:table.name,
@@ -133,9 +135,10 @@ export class JNGConfig extends SystemBase{
//角色初始器
export class JLoaderRole extends JLoaderSystem{
skData:{[id:number]:sp.SkeletonData} = {};
skData:{[id:number]:sp.SkeletonData} = {}; //角色Spine
bullets:{[id:number]:SpriteFrame} = {};
effects:{[id:number]:sp.SkeletonData} = {};
effects:{[id:number]:sp.SkeletonData} = {}; //Spine特效
maps:{[id:number]:SpriteFrame[]} = {}; //地图
async onInit(): Promise<any> {
await super.onInit();
@@ -175,6 +178,21 @@ export class JLoaderRole extends JLoaderSystem{
})
}))
}
//读取地图
for (const info of Object.values(TableGMap.getAllConfig())) {
this.maps[info.id] = await (Promise.all(["1","2","3"].map(index => `map${index}`).map(key => {
return new Promise<SpriteFrame>(r => {
if(info[key]){
this.bundle.load(info[key],SpriteFrame,(err,data) => {
r(data);
})
}
})
})))
}
}
@@ -191,5 +209,5 @@ export const app = {
}), //请求
battle : GBattleModeManager.getIns(), //战斗
config : new JNGConfig(),
role : new JLoaderRole("role"), //role包
battleRes : new JLoaderRole("battle"), //battle包
}

View File

@@ -3,6 +3,7 @@ import { JNFrameInfo, JNSyncFrameEvent } from '../../extensions/ngame/assets/nga
import { app } from './App';
import { JNSyncAction } from '../../extensions/ngame/assets/ngame/sync/JNSyncAction';
import { Camera } from 'cc';
import GBaseMode from './battle/GBaseMode';
const { ccclass, property } = _decorator;
@ccclass('WorldCanvas')
@@ -13,8 +14,10 @@ export class WorldCanvas extends Component {
@property(Camera)
camera:Camera = null;
@property(Prefab)
prefab:Prefab = null;
@property([Prefab])
prefabs:Prefab[] = [];
index:number = 0;
async onLoad(){
@@ -40,7 +43,9 @@ export class WorldCanvas extends Component {
//创建世界
create(){
this.root.addChild(instantiate(this.prefab))
let world = instantiate(this.prefabs[this.index]);
world.getComponent(GBaseMode).camera = this.camera;
this.root.addChild(world)
this.scheduleOnce(() => {
app.sync.onStart();
});

View File

@@ -4,10 +4,14 @@ import { v3 } from "cc";
import { JNFrameInfo } from "../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame";
import { Node } from "cc";
import { Vec3 } from "cc";
import { Camera } from "cc";
export default class GBaseMode<T> extends GObject<T> {
//场景相机
camera:Camera;
get scene():Node{
return this.node;
}

View File

@@ -8,13 +8,14 @@ import GButtleBase from "../bullet/GButtleBase";
import { GFSMAnimBase } from "../fsm/GFSMAnimBase";
import GFSMBase from "../fsm/GFSMBase";
import GRoleDefault from "../role/GRoleDefault";
import GNode from "../common/GNode";
//攻击子弹类
export class GAttackBullet{
//创建子弹
static create<T extends GButtleBase<{}>>(GClass:{new():T},data:{}):T{
let bulletNode = new Node();
let bulletNode = GNode.create();
bulletNode.addComponent(UITransform);
let bullet = bulletNode.addComponent(GClass);
bullet.setData(data);

View File

@@ -8,7 +8,7 @@ import { v3 } from "cc";
import { bezier } from "cc";
import { v2 } from "cc";
import { Vec2 } from "cc";
import GEffectUtil from "../../effect/GEffectUtil";
import GEffectUtil from "../common/GEffectUtil";
import { TableGRoleAttackEffect } from "../../../../resources/config/ts/TableGRoleAttackEffect";
import GDetection from "../common/GDetection";
import { rect } from "cc";
@@ -25,9 +25,9 @@ export default class GAttackParabolicRemote implements GAttackBase{
let enemy = role.fsm.enemy;
if(!enemy) return;
let image:SpriteFrame = app.role.bullets[info.attackArgs[0]];
let image:SpriteFrame = app.battleRes.bullets[info.attackArgs[0]];
let bang = {
ske: app.role.effects[info.attackArgs[1]],
ske: app.battleRes.effects[info.attackArgs[1]],
info: TableGRoleAttackEffect.getConfig(info.attackArgs[1])
};
let bone = role.spine.findBone(info.attackArgs[2]);

View File

@@ -1,15 +1,15 @@
import { UITransform } from "cc";
import { Node } from "cc";
import { sp } from "cc";
import JNSkeleton from "../../../../extensions/ngame/assets/ngame/sync/frame/game/spine/JNFrameSkeleton";
import { GData } from "../../GData";
import JNSkeleton from "../../../../../extensions/ngame/assets/ngame/sync/frame/game/spine/JNFrameSkeleton";
import { GData } from "../../../GData";
import GNode from "./GNode";
export default class GEffectUtil {
//创建一个Spine特效
static create(spine:sp.SkeletonData):JNSkeleton{
let effectNode = new Node();
effectNode.layer = GData.layer.World;
let effectNode = GNode.create();
effectNode.addComponent(UITransform);
let ske = effectNode.addComponent(JNSkeleton);
ske.skeletonData = spine;

View File

@@ -2,7 +2,7 @@
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "2935c359-6cdd-4449-adae-57fc390c9e45",
"uuid": "c0673372-37f9-453a-b439-11234bc2d8a7",
"files": [],
"subMetas": {},
"userData": {}

View File

@@ -0,0 +1,14 @@
import { Node } from "cc";
import { GData } from "../../../GData";
import { UITransform } from "cc";
//Node 工具
export default class GNode{
static create():Node{
let mapNode = new Node();
mapNode.layer = GData.layer.World;
return mapNode;
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "4ab3e098-02a1-4274-8c17-bc2ac08f643b",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -4,6 +4,7 @@ import JNSkeleton from "../../../../../extensions/ngame/assets/ngame/sync/frame/
import { Node } from "cc";
import GBaseMode from "../../GBaseMode";
import { Vec2 } from "cc";
import GNode from "./GNode";
//Spine 工具
@@ -18,7 +19,7 @@ export default class GSpine{
//关闭当前角色原本的Spine
role.spine.enabled = false;
//添加新的spine
let spineNode = new Node();
let spineNode = GNode.create();
role.node.addChild(spineNode);
let another = spineNode.addComponent(JNSkeleton);
another.skeletonData = spine;
@@ -38,7 +39,7 @@ export default class GSpine{
//创建一个Spine
static onCreateSpine(spine:sp.SkeletonData):JNSkeleton{
let spineNode = new Node();
let spineNode = GNode.create();
let another = spineNode.addComponent(JNSkeleton);
another.premultipliedAlpha = false;
another.skeletonData = spine;

View File

@@ -1,7 +1,13 @@
import { _decorator, Component, Node } from 'cc';
import { JNGSyncBase } from '../../../../App';
import { app, JNGSyncBase } from '../../../../App';
import { SpriteFrame } from 'cc';
import { Camera } from 'cc';
import { TableGMap } from '../../../../../resources/config/ts/TableGMap';
import { Sprite } from 'cc';
import { UITransform } from 'cc';
import { v3 } from 'cc';
import { Vec2 } from 'cc';
import { size } from 'cc';
import GNode from '../GNode';
const { ccclass, property } = _decorator;
/**
@@ -16,25 +22,74 @@ export class GMapLoop extends JNGSyncBase<{}> {
repeat:number = 1;
//一块的地图宽度
mapWidth:number = 100;
//一块的地图高度
mapHeight:number = 100;
//是否初始化
isInit:boolean = false;
//世界坐标Y轴
worldY:number = 0;
//创建的地图列表{开始区块:地图图片}
createMaps:Map<number,Node> = new Map();
init(map:SpriteFrame,repeat:number){
init(map:SpriteFrame,repeat:number = 1,width:number = 0,height:number = 0){
this.map = map;
this.isInit = true;
this.repeat = repeat;
this.mapWidth = map.width;
this.mapWidth = width || this.map.width;
this.mapHeight = height || this.map.height;
}
//更新地图(世界坐标X)
UpdateMap(x:number){
UpdateMap(x:number,offsetX:number = 0,offsetY:number = 0){
//计算x在第几个区块
let blockIndex = Math.floor((x + offsetX) / this.mapWidth);
//生成区块的列表
let maps:number[] = [];
for (let index = 0; index < 1 + (this.repeat * 2); index++) {
maps.push(blockIndex + (index - this.repeat));
}
//生成
maps.forEach((blockIndex) => {
this.createMap(blockIndex,offsetX,offsetY);
})
//销毁其他地图
let keys = Array.from(this.createMaps.keys());
keys.forEach(key => {
if(maps.indexOf(key) < 0){
this.createMaps.get(key).destroy();
this.createMaps.delete(key);
}
})
}
//生成区块地图
createMap(blockIndex:number,offsetX:number = 0,offsetY:number = 0){
//计算区块开始位置
let start = (blockIndex * this.mapWidth) - offsetX;
if(!this.createMaps.get(blockIndex)){
//生成地图
let mapNode = GNode.create();
let uiTransform = mapNode.addComponent(UITransform);
uiTransform.anchorX = 0;
this.node.addChild(mapNode);
mapNode.worldPosition = v3(start,offsetY,0)
let mapImage = mapNode.addComponent(Sprite);
mapImage.spriteFrame = this.map;
mapImage.sizeMode = Sprite.SizeMode.CUSTOM;
uiTransform.contentSize = size(this.mapWidth,this.mapHeight);
this.createMaps.set(blockIndex,mapNode);
}else{
this.createMaps.get(blockIndex).worldPosition = v3(start,offsetY,0)
}
}
}

View File

@@ -82,7 +82,7 @@ export default abstract class GRoleBase<T> extends GObject<T>{
//初始化
protected init(role:TableGRole){
if(this.spine)
this.spine.skeletonData = app.role.skData[role.id];
this.spine.skeletonData = app.battleRes.skData[role.id];
}
//创建一个状态机

View File

@@ -27,7 +27,6 @@ export default class GRoleDefault extends GRoleBase<{}>{
//能量条
@property(ProgressBar)
energyVolume:ProgressBar;
//状态机
fsm:GFSMDefault;
@@ -43,10 +42,6 @@ export default class GRoleDefault extends GRoleBase<{}>{
if(this.isDie){
//死亡回调
this.killBack.forEach(fun => fun(this));
//死亡销毁
JNFrameTime.getInstance().setTimeout(() => {
this.node.destroy()
},3000)
}
}

View File

@@ -1,12 +0,0 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "82abb7d2-2e71-4d33-9853-644778b2abc3",
"files": [],
"subMetas": {},
"userData": {
"compressionType": {},
"isRemoteBundle": {}
}
}

View File

@@ -9,6 +9,12 @@ import { _decorator } from "cc";
import { instantiate } from "cc";
import { GPVPModePlayerEnum } from "./GPVPMode";
import { JNFrameInfo } from "../../../../extensions/ngame/assets/ngame/sync/frame/JNSyncFrame";
import { GMapLoop } from "../base/common/map/GMapLoop";
import { Node } from "cc";
import JNFrameTime from "../../../../extensions/ngame/assets/ngame/sync/frame/game/time/JNFrameTime";
import { TableGMap } from "../../../resources/config/ts/TableGMap";
import { app } from "../../App";
import { v3 } from "cc";
const { ccclass, property } = _decorator;
@@ -34,6 +40,21 @@ export default class GOnHookMode extends GBaseMode<{}>{
@property(Prefab)
rolePrefab: Prefab = null;
//场景地图
@property(GMapLoop)
map1:GMapLoop;
@property(GMapLoop)
map2:GMapLoop;
@property(GMapLoop)
map3:GMapLoop;
@property(Node)
objects: Node = null;
get scene():Node{
return this.objects;
}
//玩家信息
playerInfo:GOnHookInfo;
@@ -49,12 +70,30 @@ export default class GOnHookMode extends GBaseMode<{}>{
playerRoles: GRoleDefault[] = [];
//敌方宠物
enemyRoles: GRoleDefault[] = [];
offsetX:number = 0;
//地图信息
mapInfo:TableGMap;
onSyncInitSuccess():void{
//初始化战斗
console.log("GOnHookMode 模式初始化");
//调整相机
let camreaPos = this.camera.node.worldPosition;
this.camera.node.worldPosition = v3(0,100,camreaPos.z)
//初始化地图
this.mapInfo = TableGMap.getConfig(60001);
this.map1.init(app.battleRes.maps[60001][0],1);
this.map1.UpdateMap(0,this.camera.node.worldPosition.x,this.mapInfo.map1OffsetY);
this.map2.init(app.battleRes.maps[60001][1],1);
this.map2.UpdateMap(0,this.camera.node.worldPosition.x,this.mapInfo.map2OffsetY);
this.map3.init(app.battleRes.maps[60001][2],1,app.battleRes.maps[60001][1].width,app.battleRes.maps[60001][1].height);
this.map3.UpdateMap(0,this.camera.node.worldPosition.x,this.mapInfo.map3OffsetY);
this.playerInfo = { tactical: GTactical.getTactical().setOffset(this.playerPos), roles: GRoleUtil.getGRoles([10004,10004,10004,10004,10003,10003]) };
this.enemyInfo = { tactical: GTactical.getTactical(true).setOffset(this.enemyPos), roles: GRoleUtil.getGRoles([10002]) };
@@ -67,8 +106,6 @@ export default class GOnHookMode extends GBaseMode<{}>{
onSyncUpdate(dt: number,frame:JNFrameInfo, input?: {}){
}
//生成宠物
@@ -139,6 +176,11 @@ export default class GOnHookMode extends GBaseMode<{}>{
//角色死亡回调
onRoleKillBack(role:GRoleDefault){
//死亡销毁
JNFrameTime.getInstance().setTimeout(() => {
if(role.isValid)
role.node.destroy()
},3000)
//如果没有敌人则生成敌人
if(this.getOnesRole(GOnHookModePlayerEnum.ENEMY).filter(role => !!role.get()).length <= 0){
//生成敌人

View File

@@ -40,14 +40,14 @@ export default class GSkillCrazySquirrel extends GSkillCDBase{
let ah = parseInt(this.info.skillArgs[2]);
//出现松鼠丢炸弹
GSpine.onPlayAnotherSpine(this.role,app.role.effects[50001],"skill",{
GSpine.onPlayAnotherSpine(this.role,app.battleRes.effects[50001],"skill",{
end:() => {
//从天而降
let pos = enemy.v2World.add(v2(0,1000));
let end = enemy.v2World;
//生成火球
let spine = GSpine.onCreateSpine(app.role.effects[50002]);
let spine = GSpine.onCreateSpine(app.battleRes.effects[50002]);
this.role.mode.addGNode(spine.node,pos);
spine.setAnimation(0,"animation",true);
spine.node.angle = 90;
@@ -59,7 +59,7 @@ export default class GSkillCrazySquirrel extends GSkillCDBase{
.onComplete(() => {
let world = spine.node.worldPosition;
spine.node.destroy();
GSpine.onPlaySceneSpine(scene,v2(world.x,world.y),app.role.effects[50003],"animation");
GSpine.onPlaySceneSpine(scene,v2(world.x,world.y),app.battleRes.effects[50003],"animation");
console.log(GDetection.testAABBRole(rect(world.x,world.y,aw,ah)).length)
GDetection.testAABBRole(rect(world.x,world.y,aw,ah)).forEach(role =>{
role.onHit();

View File

@@ -2,6 +2,8 @@ import { _decorator, Component, Label, Node } from 'cc';
import { app, JNGLayerBase } from '../../App';
import { Toggle } from 'cc';
import { JNSyncAction } from '../../../../extensions/ngame/assets/ngame/sync/JNSyncAction';
import { director } from 'cc';
import { WorldCanvas } from '../../WorldCanvas';
const { ccclass, property } = _decorator;
@ccclass('HomeView')
@@ -34,6 +36,15 @@ export class HomeView extends JNGLayerBase {
app.socket.Send(JNSyncAction.NSyncFrameReset);
}
//前往PVP
onClickGoPVP(){
director.getScene().getComponentInChildren(WorldCanvas).index = 0;
}
//前往无尽
onClickGoOnHook(){
director.getScene().getComponentInChildren(WorldCanvas).index = 1;
}
}