This commit is contained in:
DESKTOP-5RP3AKU\Jisol 2023-11-10 03:56:07 +08:00
parent 9157e123b6
commit 620bcd3e53
36 changed files with 3246 additions and 32 deletions

Binary file not shown.

View File

@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "6d6e0f57-5d1a-437c-9b38-c80559719a80",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -0,0 +1,13 @@
{
"ver": "1.1.49",
"importer": "prefab",
"imported": true,
"uuid": "927f03cf-a5b6-4572-a362-57b33d1f69e3",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "NoviceNamingView"
}
}

View File

@ -0,0 +1,13 @@
{
"ver": "1.1.49",
"importer": "prefab",
"imported": true,
"uuid": "d9bca169-7a8d-4581-90b2-487db4a4dabb",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "NoviceSelectPetView"
}
}

View File

@ -23,8 +23,11 @@ import { JsonAsset } from "cc";
import { GAction } from "./consts/GActionEnum";
import { StorageData, StorageEnum } from "./consts/GData";
import { JAPI, JAPIConfig } from "../../extensions/ngame/assets/ngame/util/JAPI";
import { API } from "./consts/API";
import { AppData } from "./AppData";
let IP = "localhost";
let APIPath = `https://api.pet.jisol.cn`
let WsPath = `wss://api.pet.jisol.cn/websocket`
//重写UI
class JNGLayer extends JNLayer{
@ -43,12 +46,12 @@ class JNGSocket extends JNSocket{
//获取Token
let token = StorageData.get(StorageEnum.Token);
if(token){
resolve(`ws://${IP}:8080/websocket/${token}`)
resolve(`${WsPath}/${token}`)
return;
}
const loginResolve = (token:string) => {
resolve(`ws://${IP}:8080/websocket/${token}`);
resolve(`${WsPath}/${token}`);
}
//如果没有Token则弹出登入页面
app.layer.Open(GUI.Login,loginResolve);
@ -232,20 +235,22 @@ export const app = {
event : EventDispatcher.getIns(), //通知
proto : NGameMessage.getIns(), //消息
api : JAPI.create({
baseURL: `http://${IP}:8080`,
baseURL: `${APIPath}`,
}), //请求
// api : {}, //请求
battle : GBattleModeManager.getIns(), //战斗
config : new JNGConfig(), //配置文件
battleRes : new JLoaderBattle("battle"), //battle包
data : new AppData(), //游戏基础信息
loading: new Loading({
[JNGConfig.loading]:{title:"加载配置文件"},
[JLoaderBattle.loading]:{title:"加载战斗资源"},
[JLoaderBattle.loadingInit]:{title:"初始化战斗资源"},
[AppData.loading]:{title:"初始化信息"},
}),
}
app.api.addInterceptor((config:JAPIConfig) => {
app.api.addRequestInterceptors((config:JAPIConfig) => {
//设置Token
config.headers["Token"] = StorageData.get(StorageEnum.Token);
return true;

View File

@ -0,0 +1,42 @@
import SystemBase from "../../extensions/ngame/assets/ngame/system/SystemBase";
import { app } from "./App";
import { API, NewsContext, PlayerInfoOV } from "./consts/API";
//数据类 (用于初始化游戏信息)
export class AppData extends SystemBase{
static loading = "AppData";
//玩家信息
static PLAYER_INFO:string = "PLAYER_INFO";
get loadings():{[key:string]:Function}{
return {
[AppData.PLAYER_INFO]:API.GetPlayerInfo, //玩家信息
}
}
data:{[key:string]:any} = {};
async onInit(): Promise<any> {
app.loading.setCurrent(AppData.loading);
//加载信息
let keys = Object.keys(this.loadings);
for (let index = 0; index < keys.length; index++) {
this.data[keys[index]] = (await this.loadings[keys[index]]());
}
app.loading.ok(AppData.loading);
}
//获取玩家信息
getPlayerInfo():PlayerInfoOV{
return this.data[AppData.PLAYER_INFO];
}
}

View File

@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "edb3bebb-69b2-4a49-aaa8-3b3c53988f46",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -1,15 +1,15 @@
import { app } from "../App";
import { GUI } from "../ui/UIConfig";
const http = app.api;
const RData = (data:any) => {
const RData = (data:any,isTips:boolean = true) => {
if(data.data.state == 200){
return data.data.data;
}else{
//弹出提示
if(isTips){
app.layer.Open(GUI.Tips,{text:data.data.msg});
return null;
}
return data.data.data;
}
}
@ -27,12 +27,22 @@ export interface UserLoginVO{
token:string, //token
user:UserVO, //玩家信息
}
export interface PlayerInfoOV{
playerId:number, //玩家Id
userId: number, //用户Id
playerName:string, //玩家名
playerCreateTime:number, //玩家创建时间
novice: false, //是否过引导
}
export const API = {
UserRegister : async () => RData(await http.post(`/user/register`)) as UserVO, //玩家注册
UserLogin : async (account:string,password:string) => RData(await http.post(`/user/login`,{userId:account,userPass:password})) as UserLoginVO, //玩家登录
GetPlayerInfo : async () => (await http.get(`/game/player/info`)).data as NewsContext, //获取玩家信息
UserRegister : async () => RData(await app.api.post(`/user/register`)) as UserVO, //玩家注册
UserLogin : async (account:string,password:string) => RData(await app.api.post(`/user/login`,{userId:account,userPass:password})) as UserLoginVO, //玩家登录
GetPlayerInfo : async () => RData(await app.api.get(`/game/player/info`),false) as NewsContext, //获取玩家信息
/********** 新手引导接口 *****************/
SavePlayerInfo : async (playerName:string,novice:boolean = true) => (await app.api.post(`/game/player/info/save`,{playerName,novice})).data as NewsContext, //保存玩家信息
}

View File

@ -1,5 +1,6 @@
export enum GAction {
TOKEN_EXPIRED = 1001, //Token过期
NOT_CREATE_PLAYER_INFO = 2001, //没有玩家信息 - 前往引导页面
}

View File

@ -23,6 +23,7 @@ export class StorageData {
}
export const GData = {
//层级
layer: {
World: 1,
}

View File

@ -3,6 +3,9 @@ import { _decorator } from "cc";
import { JNGLayerBase, app } from "../../App";
import { Label } from "cc";
import { GUI } from "../UIConfig";
import { API } from "../../consts/API";
import { GAction } from "../../consts/GActionEnum";
import NoviceManager from "../Novice/NoviceManager";
const { ccclass, property } = _decorator;
@ccclass('LoadingView')
@ -29,9 +32,10 @@ export default class LoadingView extends JNGLayerBase {
async onSuccess(){
//打开主页
await app.layer.Open(GUI.Home);
await NoviceManager.getIns().onStart();
//关闭加载页
await app.layer.Open(GUI.Home);
app.layer.Close(GUI.Loading);
}

View File

@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "22b638a6-c17e-4935-adb5-b5309777f71c",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -0,0 +1,20 @@
import Singleton from "../../../../extensions/ngame/assets/ngame/util/Singleton";
import { app } from "../../App";
import { GUI } from "../UIConfig";
export default class NoviceManager extends Singleton{
//新手引导执行
async onStart(){
if(!(app.data.getPlayerInfo().novice)){
//如果没有过引导则打开引导页面
await app.layer.OpenToClose(GUI.NoviceNamingView);
}
console.log("新手引导结束");
}
}

View File

@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "8b5cc1e0-3fa2-4ee3-b93b-2da9878f9c8c",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -0,0 +1,24 @@
import { _decorator, Component, Node } from 'cc';
import { app, JNGLayerBase } from '../../App';
import { EditBox } from 'cc';
import { API } from '../../consts/API';
const { ccclass, property } = _decorator;
@ccclass('NoviceNamingView')
export class NoviceNamingView extends JNGLayerBase {
@property(EditBox)
text:EditBox;
//保存名称
async onSave(){
if(this.text.string){
await API.SavePlayerInfo(this.text.string);
//关闭页面
app.layer.CloseNode(this.node);
}
}
}

View File

@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "ccac142a-85d0-4cc2-9f66-e71110e1d69d",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -0,0 +1,9 @@
import { _decorator, Component, Node } from 'cc';
import { JNGLayerBase } from '../../App';
const { ccclass, property } = _decorator;
@ccclass('NoviceSelectPetView')
export class NoviceSelectPetView extends JNGLayerBase {
}

View File

@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "0bc93bda-24b6-4fb9-809c-d5d4ebbf22ec",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -13,6 +13,10 @@ export enum GUI{
Loading = "Loading", //加载页面
Tips = "Tips", //提示
/** 新手引导 */
NoviceNamingView = "NoviceNamingView", //新手引导页面 - 取名
NoviceSelectPetView = "NoviceSelectPetView", //新手引导页面 - 选择宠物
Home = "Home", //主页面
}
@ -21,7 +25,7 @@ export enum GUI{
const UISystemConfig:{ [key: string]: JNLayerInfo; } = {
[GUI.Tips]:{
layer:GLayer.Tips,
uri: "prefab/ui/System/Tips/TipsView",
uri: "prefab/ui/系统页面/Tips/TipsView",
anims:{
front:JNLayerAnim.BackOutOpen,
back:JNLayerAnim.BackInClose
@ -29,7 +33,7 @@ const UISystemConfig:{ [key: string]: JNLayerInfo; } = {
},
[GUI.Login]:{
layer:GLayer.Popup,
uri: "prefab/ui/System/LoginView",
uri: "prefab/ui/系统页面/LoginView",
anims:{
front:JNLayerAnim.BackOutOpen,
back:JNLayerAnim.BackInClose
@ -37,7 +41,7 @@ const UISystemConfig:{ [key: string]: JNLayerInfo; } = {
},
[GUI.Loading]:{
layer:GLayer.View,
uri: "prefab/ui/Loading/LoadingView",
uri: "prefab/ui/加载页面/LoadingView",
anims:{
back:JNLayerAnim.Smaller,
backInfo:{key:"position",start:v3(0,0,0),end:v3(-720,0,0)}
@ -45,10 +49,32 @@ const UISystemConfig:{ [key: string]: JNLayerInfo; } = {
},
}
//新手引导页面
const UINoviceConfig:{ [key: string]: JNLayerInfo; } = {
[GUI.NoviceNamingView]:{
layer:GLayer.Popup,
uri: "prefab/ui/新手引导页面/NoviceNamingView",
anims:{
front:JNLayerAnim.BackOutOpen,
back:JNLayerAnim.BackInClose
}
},
[GUI.NoviceSelectPetView]:{
layer:GLayer.Popup,
uri: "prefab/ui/新手引导页面/NoviceSelectPetView",
anims:{
front:JNLayerAnim.BackOutOpen,
back:JNLayerAnim.BackInClose
}
},
}
export const UIConfig:{ [key: string]: JNLayerInfo; } = {
[GUI.Home]:{
layer:GLayer.View,
uri: "prefab/ui/Home/HomeView",
uri: "prefab/ui/主页/HomeView",
anims:{
front:JNLayerAnim.Enlarge,
back:JNLayerAnim.Smaller,
@ -56,6 +82,7 @@ export const UIConfig:{ [key: string]: JNLayerInfo; } = {
backInfo:{key:"position",start:v3(0,0,0),end:v3(-720,0,0)}
},
},
...UISystemConfig
...UISystemConfig, //系统页面
...UINoviceConfig, //新手引导页面
}

View File

@ -8,17 +8,18 @@ import cn.jisol.game.service.PlayerService;
import cn.jisol.game.service.impl.PlayerServiceImpl;
import cn.jisol.ngame.util.NewsContext;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
/**
* 新手API
*/
@Api(value = "JNGameDemo - API", tags = {"PET - API"})
@RestController
@RequestMapping("/game/player")
@ResponseBody
@ -28,18 +29,56 @@ public class PlayerController {
PlayerServiceImpl playerService;
//获取玩家信息
@ApiImplicitParams({})
@ApiOperation(value = "获取玩家信息")
@GetMapping("/info")
public NewsContext<Player> getPlayerInfo(@CurrentUser User user){
Player info = playerService.getOne(Wrappers.lambdaQuery(Player.class).eq(Player::getUserId,user.getUserId()));
if (Objects.isNull(info)){
//玩家没有进入过游戏 前往 新手引导
return NewsContext.onMessage("前往新手引导",null, HttpCode.NOT_CREATE_PLAYER_INFO);
}else{
try{
info = Player.builder().userId(user.getUserId()).playerName("冒险者").build();
playerService.saveOrUpdate(info);
}catch (Exception ignored){}
assert playerService != null;
info = playerService.getOne(Wrappers.lambdaQuery(Player.class).eq(Player::getUserId,user.getUserId()));
}
if (info.isNovice()){
return NewsContext.onSuccess("获取成功",info);
}else{
//前往 新手引导
return NewsContext.onMessage("前往新手引导",info, HttpCode.NOT_CREATE_PLAYER_INFO);
}
}
//设置玩家信息
@ApiImplicitParams({})
@ApiOperation(value = "设置玩家信息")
@PostMapping("/info/save")
public NewsContext<Player> savePlayerInfo(@CurrentUser User user,@RequestBody Player player){
//获取玩家信息
Player info = playerService.getOne(Wrappers.lambdaQuery(Player.class).eq(Player::getUserId,user.getUserId()));
//如果没有玩家信息则初始化信息
if (Objects.isNull(info)){
info = Player.builder().userId(user.getUserId()).build();
}
info.setPlayerName(player.getPlayerName());
info.setNovice(player.isNovice());
//保存信息
if(playerService.saveOrUpdate(info)){
return NewsContext.onSuccess("保存成功",info);
}else{
return NewsContext.onFail("保存失败",info);
}
}
}

View File

@ -1,18 +1,19 @@
package cn.jisol.game.entity.game;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
@Builder
@Data
@TableName("`player`")
public class Player {
@TableId(type = IdType.AUTO)
private Long playerId; //游戏玩家Id
private String userId; //玩家Id
private Long userId; //玩家Id
private String playerName; //游戏玩家名称
private Long playerCreateTime; //玩家创建时间
private Date playerCreateTime; //玩家创建时间
private boolean isNovice; //玩家是否过了新手引导
}

View File

@ -6,6 +6,9 @@ spring:
password: sThsBwjfDcaw2wJR
url: jdbc:mysql://kyu.jisol.cn:3306/pet_jisol_cn?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
jackson:
serialization:
write-dates-as-timestamps: true
mybatis-plus:
configuration: