美文网首页
鸿蒙next 手游sdk重磅来袭

鸿蒙next 手游sdk重磅来袭

作者: xq9527 | 来源:发表于2024-08-15 10:00 被阅读0次

前言导读

各位同学大家好,有段时间没有更新博客, 最近在开发鸿蒙next手游sdk 所以就想分享一下 那么废话不多说我们正式开始。

效果图 :

image.png image.png image.png

具体实现

  • 对外接口
import { XPopup } from '@chinalike/popup'
/**
 * 创建人:xuqing
 * 创建时间:2024年7月28日21:59:59
 * 类说明:对外接口
 *
 *
 */
import { CustomCenterPopup } from '../components/popup/CustomCenterPopup'
import Logger from '../utils/Logger'
import { RoleInfo } from '../bean/RoleInfo'
import { ServiceInfo } from '../bean/ServiceInfo'
import { LoginCallback } from '../callback/LoginCallback'
import { DataStoreController } from './DataStoreController'
import { ExitCenterPopup } from '../components/popup/ExitCenterPopup'

export  class GameSdk {
  public  static instance: GameSdk | null = null



 public  static getInstance() {
    if (!GameSdk.instance) {
      GameSdk.instance = new GameSdk()
    }
    return GameSdk.instance
  }
  // 设置方法为私有
  private  constructor() {

  }
  public  init(){
    Logger.error("GameSdk --> init")
  }

  public  login(logincallback :LoginCallback) {
    DataStoreController.getInstance().setLoginCallback(logincallback);
    XPopup.Builder().asCustomPopup(new CustomCenterPopup()).show()
  }
  //区服上报
  public  servicelogin(servieinfo:ServiceInfo){
    Logger.error("servieinfo  -- > "+servieinfo.getSid());
    Logger.error("servieinfo  -- > "+servieinfo.getRole_id());
    Logger.error("servieinfo  -- > "+servieinfo.getRole_name());
    Logger.error("servieinfo  -- > "+servieinfo.getRole_level());
    Logger.error("GameSdk --> servicelogin")


  }
  // 登记变化上报
  public  updateroleinfo(roleinfo:RoleInfo){
    Logger.error("roleinfo  -- > "+roleinfo.getSid());
    Logger.error("roleinfo  -- > "+roleinfo.getRole_id());
    Logger.error("roleinfo  -- > "+roleinfo.getRole_name());
    Logger.error("roleinfo  -- > "+roleinfo.getRole_level());
    Logger.error("GameSdk --> updateroleinfo");
  }

  public  pay(){
    Logger.error("GameSdk --> pay")
  }

  public  exitgame(){
    XPopup.Builder().asCustomPopup(new ExitCenterPopup()).show()
    Logger.error("GameSdk --> exitgame")
  }

  public aboutToAppear(){

    Logger.error("GameSdk --> aboutToAppear")

  }

  public  onPageShow(){

    Logger.error("GameSdk --> onPageShow")

  }

  public aboutToDisappear(){
    Logger.error("GameSdk --> aboutToDisappear")

  }

  public  onPageHide(){

    Logger.error("GameSdk --> onPageHide")
  }

  onBackPress(){
    Logger.error("GameSdk --> onBackPress")

  }
}

回调接口

export  interface  LoginCallback{

  loginsuccess?: (data?:string) => void

  loginerror?: (error?:string) => void
}
  • 登录界面实现

    import { BaseCenterPopup } from '@chinalike/popup';
    import { CenterBean } from '../../model/entity/CenterBean';
    import prompt from '@ohos.promptAction';
    import { preferences } from '@kit.ArkData';
    import { DataStoreController } from '../../out/DataStoreController'
    let dataPreferences: preferences.Preferences | null = null;
    
    /**
     * 自定义中间弹窗
     */
    
    //线条样式
    @Extend(Line) function  lineStyle(){
      .width('100%')
      .height(1)
      .backgroundColor($r('app.color.line_color'))
    }
    //黑色字体样式
    @Extend(Text) function  blackTextStyle(){
      .fontColor($r('app.color.black_text_color'))
      .fontSize(18)
      .fontWeight(FontWeight.Medium)
    }
    @Extend(TextInput) function  inputStyle(){
      .placeholderColor($r('app.color.placeholder_color'))
      .height(45)
      .fontSize(18)
      .backgroundColor($r('app.color.background'))
      .width('100%')
      .padding({left:0})
      .margin({top:12})
      .background(null)
    }
    
    
    export class CustomCenterPopup extends BaseCenterPopup<CenterBean> {
      private data = new CenterBean("中间弹窗", "我是通过继承BaseCenterPopup实现弹窗", "没看明白", "学习了")
    
    
      constructor() {
        super(wrapBuilder(customPopupBuilder))
        this.setParams(this.data)
        this.data.dismiss = () => {
          this.dismiss()
        }
      }
    }
    
    @Builder
    function customPopupBuilder(data: CenterBean) {
    
      Column() {
        Text('登录界面')
          .fontSize(24)
          .fontWeight(FontWeight.Medium)
          .fontColor($r('app.color.title_text_color'))
    
    
        Row(){
          Text('账号').blackTextStyle()
          TextInput({placeholder:'请输入账号'})
            .maxLength(100)
            .inputStyle()
            .onChange((value:string)=>{
              DataStoreController.getInstance().setUsername(value);
    
            }).margin({left:20})
        }.justifyContent(FlexAlign.SpaceBetween)
        .width('100%')
        .margin({top:8})
        Line().lineStyle().margin({left:80})
    
        Row(){
          Text('密码').blackTextStyle()
          TextInput({placeholder:'请输入密码'})
            .maxLength(100)
            .type(InputType.Password)
            .inputStyle()
            .onChange((value:string)=>{
              DataStoreController.getInstance().setpasswroid(value);
            }).margin({left:20})
        }.justifyContent(FlexAlign.SpaceBetween)
        .width('100%')
        .margin({top:8})
        Line().lineStyle().margin({left:80})
    
    
        Button('登录',{type:ButtonType.Capsule})
          .width('90%')
          .height(40)
          .fontSize(16)
          .fontWeight(FontWeight.Medium)
          .backgroundColor($r('app.color.login_button_color'))
          .margin({top:47,bottom:12})
          .onClick(()=>{
            data?.login(DataStoreController.getInstance().getUsername(),
              DataStoreController.getInstance().getpasswroid(),{
                loginsuccess(datastr){
                  data.dismiss?.()
                },
                loginerror(errormsg){
                  prompt.showToast({
                    message:errormsg
                  })
                }
              })
          })
    
        Text('注册账号').onClick(()=>{
    
        }).fontColor($r('app.color.login_blue_text_color'))
          .fontSize(12)
          .fontWeight(FontWeight.Medium)
    
    
      }
    }
    
  • 退出游戏界面实现

    import { BaseCenterPopup } from '@chinalike/popup';
    import { CenterBean } from '../../model/entity/CenterBean';
    import { preferences } from '@kit.ArkData';
    import common from '@ohos.app.ability.common';
    let dataPreferences: preferences.Preferences | null = null;
    
    /**
     * 自定义中间弹窗
     */
    
    
    
    export class ExitCenterPopup extends BaseCenterPopup<CenterBean> {
      private data = new CenterBean("中间弹窗", "我是通过继承BaseCenterPopup实现弹窗", "没看明白", "学习了")
    
      constructor() {
        super(wrapBuilder(customPopupBuilder))
        this.setParams(this.data)
        this.data.dismiss = () => {
          this.dismiss()
        }
      }
    }
    
    
    @Builder
    function customPopupBuilder(data: CenterBean) {
    
      Column() {
        Text('退出游戏')
          .fontSize(24)
          .fontWeight(FontWeight.Medium)
          .fontColor($r('app.color.title_text_color'))
    
        Text('您确认要退出游戏吗?')
          .fontSize(16)
          .fontWeight(FontWeight.Medium)
          .fontColor($r('app.color.title_text_color'))
          .margin({top:40})
        Row() {
          Button('取消', { type: ButtonType.Capsule })
            .width('40%')
            .height(40)
            .fontSize(16)
            .fontWeight(FontWeight.Medium)
            .backgroundColor($r('app.color.login_button_color'))
    
            .margin({ top: 47, bottom: 12 ,right:5})
            .onClick(() => {
              data.dismiss?.()
            });
          Button('确认', { type: ButtonType.Capsule })
            .width('40%')
            .height(40)
            .fontSize(16)
            .fontWeight(FontWeight.Medium)
            .backgroundColor($r('app.color.login_button_color'))
            .margin({ top: 47, bottom: 12,left:5 })
            .onClick(() => {
              data.dismiss?.()
              const  mContext=getContext() as common.UIAbilityContext;
              mContext.terminateSelf()
            })
        }.width('100%')
        .height(50)
        .margin({bottom:20,top:20})
        .justifyContent(FlexAlign.Center)
      }
    }
    
  • 数据上报

    数据上报这里因为接口有点问题我们就只是打印看下数据 我们只需要针对服务端接口做一下http 请求即可

public  servicelogin(servieinfo:ServiceInfo){
  Logger.error("servieinfo  -- > "+servieinfo.getSid());
  Logger.error("servieinfo  -- > "+servieinfo.getRole_id());
  Logger.error("servieinfo  -- > "+servieinfo.getRole_name());
  Logger.error("servieinfo  -- > "+servieinfo.getRole_level());
  Logger.error("GameSdk --> servicelogin")


}
public  updateroleinfo(roleinfo:RoleInfo){
  Logger.error("roleinfo  -- > "+roleinfo.getSid());
  Logger.error("roleinfo  -- > "+roleinfo.getRole_id());
  Logger.error("roleinfo  -- > "+roleinfo.getRole_name());
  Logger.error("roleinfo  -- > "+roleinfo.getRole_level());
  Logger.error("GameSdk --> updateroleinfo");
}

接入测试

import { RoleInfo } from '../bean/RoleInfo';
import { ServiceInfo } from '../bean/ServiceInfo';
import { GameSdk } from '../out/GameSdk';
import Logger from '../utils/Logger'


@Entry
@Component
struct Indextwo {
  @State message: string = 'Hello World';

  build() {
    Column(){
      Button('初始化')
        .height(45)
        .margin({top:45})
        .onClick(()=>{
          GameSdk.getInstance().init();
        })
      Button('登录')
        .height(45)
        .margin({top:45})
        .onClick(()=>{
          GameSdk.getInstance().login({
            loginsuccess(data){
              Logger.error("登录成功回调  --- > "+data)
            },
            loginerror(error){
              Logger.error("登录失败回调")
            }
          });
        })
      Button('区服登录上报')
        .height(45)
        .margin({top:45})
        .onClick(()=>{

          let serviceinfo:ServiceInfo=new ServiceInfo();
          serviceinfo.setSid("1");
          serviceinfo.setRole_id("1000");
          serviceinfo.setRole_name("漩涡鸣人");
          serviceinfo.setRole_level("3000");
          GameSdk.getInstance().servicelogin(serviceinfo);
        })
      Button('角色等级上报')
        .height(45)
        .margin({top:45})
        .onClick(()=>{
          let roleinfo:RoleInfo=new RoleInfo();
          roleinfo.setSid("1");
          roleinfo.setRole_id("1000");
          roleinfo.setRole_name("漩涡鸣人");
          roleinfo.setRole_level("3000");
          GameSdk.getInstance().updateroleinfo(roleinfo);
        })

      Button('支付')
        .height(45)
        .margin({top:45})
        .onClick(()=>{
          GameSdk.getInstance().pay();
        })
      Button('退出游戏')
        .height(45)
        .margin({top:45})
        .onClick(()=>{
          GameSdk.getInstance().exitgame();

        })

    }.width('100%')
    . height('100%')
  }

  aboutToAppear(){
    GameSdk.getInstance().aboutToAppear()
  }

  onPageShow?(){

    GameSdk.getInstance().onPageShow()

  }


  aboutToDisappear?(){
    GameSdk.getInstance().aboutToDisappear()

  }

  onPageHide?(){
    GameSdk.getInstance().onPageHide()
  }


  onBackPress?(){
    GameSdk.getInstance().onBackPress()

  }

}

测试接入登录回调数据

image.png

我们可以在控制台看到我们登录回调回来的数据返回,我们在游戏接入方拿到数据后只需要需要验证的数据去服务端验证登录接口即可

如何打包

  • 创建一个空的工程

[图片上传失败...(image-dc89f3-1723773586449)]

  • 创建一个静态库 选择new moduel

image.png
  • 然后选择 static library

image.png
  • 打包har

image.png

最后总结:

1 鸿蒙截止目前,不支持对App包进行二次重签名,从而无法实现二次重打包。如果SDK有变更,只能重新出Har给研发重新接入,并由研发出游戏包。 2 鸿蒙可以将代码和资源封装成Har,类似于Android的aar文件。研发可将Har文件放入工程,并进行依赖。 3 目前各大头部厂商都加速鸿蒙的原生app 开发我相信游戏行业也会跟进的所以我觉得各位是时候学习一波鸿蒙了。今天的文章就讲到这里有兴趣的同学可以继续研究 如果你觉得文章还不错麻烦给我三连 关注点赞和转发 如果了解更多鸿蒙开发的知识 可以关注坚果派公众号 。 谢谢

相关文章

网友评论

      本文标题:鸿蒙next 手游sdk重磅来袭

      本文链接:https://www.haomeiwen.com/subject/dfkekjtx.html