Compare commits

...

2 Commits

Author SHA1 Message Date
tiendat3699 86b3b434ec feat: pad controller 2024-07-26 10:07:42 +07:00
tiendat3699 aa6dcfad2c feat: modify for smart ads 2024-07-15 09:25:19 +07:00
16 changed files with 5227 additions and 2215 deletions

Binary file not shown.

View File

@ -0,0 +1,12 @@
{
"ver": "1.0.1",
"importer": "ttf-font",
"imported": true,
"uuid": "b1f7797d-3e59-499d-821f-1fffde502106",
"files": [
".json",
"Nunito-ExtraBold.ttf"
],
"subMetas": {},
"userData": {}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
import {
_decorator,
Camera,
CCFloat,
clamp,
Component,
EventMouse,
Input,
input,
IVec2Like,
Node,
Vec2,
Vec3,
} from 'cc';
import P4PSDK, { EventType } from '../P4PSDK';
const { ccclass, property } = _decorator;
@ccclass('Bar')
export default class Bar extends Component {
@property(CCFloat)
private yOffset: number = 350;
@property(CCFloat)
private minX: number = 0;
@property(CCFloat)
private maxX: number = 100;
@property(Camera)
private camera: Camera;
private _screenPoint: Vec2 = new Vec2();
private _worldPoint: Vec3 = new Vec3();
protected onLoad(): void {
input.on(Input.EventType.MOUSE_MOVE, this.onMouseMove, this);
P4PSDK.broadCast.on(EventType.OnMouse, this.onMouse, this);
}
private onMouseMove(event: EventMouse): void {
event.getLocation(this._screenPoint);
this.updateWorldPoint();
}
private onMouse(position: IVec2Like): void {
this._screenPoint = new Vec2(position.x, position.y);
this.updateWorldPoint();
}
private updateWorldPoint(): Vec3 {
this.camera.screenToWorld(this._screenPoint.toVec3(), this._worldPoint);
this._worldPoint.x = clamp(this._worldPoint.x, this.minX, this.maxX);
this._worldPoint.y = this.yOffset;
this._worldPoint.z = 0;
return this._worldPoint;
}
protected update(dt: number): void {
this.node.setWorldPosition(this.node.getWorldPosition().lerp(this._worldPoint, 30 * dt));
}
}

View File

@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "3eb45051-a94a-4100-b478-7137efd07fa9",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -12,10 +12,12 @@ import {
Vec3, Vec3,
} from 'cc'; } from 'cc';
import ControllerSide from '../Enum/ControllerSide'; import ControllerSide from '../Enum/ControllerSide';
import GameState from '../Enum/GameState';
import TimeConfig from '../Enum/TimeConfig'; import TimeConfig from '../Enum/TimeConfig';
import GameEvent from '../Events/GameEvent'; import GameEvent from '../Events/GameEvent';
import AudioManager from '../Manager/AudioManager'; import AudioManager from '../Manager/AudioManager';
import { EventManger } from '../Manager/EventManger'; import { EventManger } from '../Manager/EventManger';
import P4PSDK, { EventType } from '../P4PSDK';
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
@ccclass('Flipper') @ccclass('Flipper')
@ -38,13 +40,14 @@ export class Flipper extends Component {
private _isAnimationPlaying; private _isAnimationPlaying;
protected onLoad(): void { protected onLoad(): void {
input.on(Input.EventType.KEY_DOWN, this.onKeyInputDown, this);
input.on(Input.EventType.KEY_UP, this.onKeyInputUp, this);
EventManger.instance.on(GameEvent.ControlTouchStart, this.onTouchStart, this); EventManger.instance.on(GameEvent.ControlTouchStart, this.onTouchStart, this);
EventManger.instance.on(GameEvent.ControlTouchEnd, this.onTouchEnd, this); EventManger.instance.on(GameEvent.ControlTouchEnd, this.onTouchEnd, this);
EventManger.instance.on(GameEvent.GameStateChange, this.gameStateChange, this);
} }
protected start(): void { protected start(): void {
input.on(Input.EventType.KEY_DOWN, this.onKeyInputDown, this);
input.on(Input.EventType.KEY_UP, this.onKeyInputUp, this);
this._animation.play(); this._animation.play();
} }
@ -56,8 +59,53 @@ export class Flipper extends Component {
} }
} }
private gameStateChange(state: GameState) {
if (state == GameState.Init) {
P4PSDK.broadCast.on(EventType.OnKeyDown, this.onSDKKeyDown, this);
P4PSDK.broadCast.on(EventType.OnKeyUp, this.onSDKKeyUp, this);
}
}
//#region Input Handler //#region Input Handler
private onSDKKeyDown(key: number) {
switch (key) {
case KeyCode.KEY_A:
case KeyCode.ARROW_LEFT:
if (this.side == ControllerSide.Left) this.activeFlipper();
this._timer = 0;
if (this._animation.getState(this._animation.defaultClip.name).isPlaying) {
this._animation.stop();
}
break;
case KeyCode.KEY_D:
case KeyCode.ARROW_RIGHT:
if (this.side == ControllerSide.Right) this.activeFlipper();
this._timer = 0;
if (this._isAnimationPlaying) {
this._animation.stop();
}
break;
default:
break;
}
}
private onSDKKeyUp(key: number) {
switch (key) {
case KeyCode.KEY_A:
case KeyCode.ARROW_LEFT:
if (this.side == ControllerSide.Left) this.deActiveFlipper();
break;
case KeyCode.KEY_D:
case KeyCode.ARROW_RIGHT:
if (this.side == ControllerSide.Right) this.deActiveFlipper();
break;
default:
break;
}
}
private onKeyInputDown(event: EventKeyboard) { private onKeyInputDown(event: EventKeyboard) {
switch (event.keyCode) { switch (event.keyCode) {
case KeyCode.KEY_A: case KeyCode.KEY_A:
@ -116,7 +164,7 @@ export class Flipper extends Component {
//#endregion //#endregion
private activeFlipper(): void { private activeFlipper(): void {
AudioManager.playSfx(this._activeSound, { volume: 0.5 }); // AudioManager.playSfx(this._activeSound, { volume: 0.5 });
this._hingeJoint.motorSpeed = this._motorSpeedActive; this._hingeJoint.motorSpeed = this._motorSpeedActive;
} }
private deActiveFlipper(): void { private deActiveFlipper(): void {

View File

@ -12,7 +12,6 @@ import {
Vec2, Vec2,
Vec3, Vec3,
} from 'cc'; } from 'cc';
import { EDITOR, PREVIEW } from 'cc/env';
import Timer, { TimerType } from '../Base/Timer'; import Timer, { TimerType } from '../Base/Timer';
import { BoosterBase } from '../Booster/BoosterBase'; import { BoosterBase } from '../Booster/BoosterBase';
import BoosterType from '../Enum/BoosterType'; import BoosterType from '../Enum/BoosterType';
@ -98,13 +97,12 @@ export class GameManager extends Singleton<GameManager>() {
} }
protected async start(): Promise<void> { protected async start(): Promise<void> {
await P4PSDK.init(this.onBoughtTicket, this); await P4PSDK.init();
if (P4PSDK.getGameTime()) { if (P4PSDK.gameTime) {
this._timePlay = P4PSDK.getGameTime(); this._timePlay = P4PSDK.gameTime;
} }
P4PSDK.setCallAPI(this._callAPI);
await P4PSDK.authenticate();
this.changeGameState(GameState.Init); this.changeGameState(GameState.Init);
this.Ready();
} }
protected update(dt: number): void { protected update(dt: number): void {
@ -114,8 +112,8 @@ export class GameManager extends Singleton<GameManager>() {
} }
private onBoughtTicket() { private onBoughtTicket() {
this.gameRelive(); // this.gameRelive();
EventManger.instance.emit(GameEvent.TicketUpdate, P4PSDK.getUserTicket()); // EventManger.instance.emit(GameEvent.TicketUpdate, P4PSDK.getUserTicket());
} }
private async changeGameState(state: GameState) { private async changeGameState(state: GameState) {
@ -306,27 +304,29 @@ export class GameManager extends Singleton<GameManager>() {
private _minusTicketLoading = false; private _minusTicketLoading = false;
public async replay(): Promise<void> { public async replay(): Promise<void> {
if (this._minusTicketLoading) return; // if (this._minusTicketLoading) return;
this._minusTicketLoading = true; // this._minusTicketLoading = true;
if (!PREVIEW && !EDITOR) { // if (!PREVIEW && !EDITOR) {
const checkGameScoreTicket = await P4PSDK.checkGameScoreTicket(); // const checkGameScoreTicket = await P4PSDK.checkGameScoreTicket();
if (checkGameScoreTicket) { // if (checkGameScoreTicket) {
const success = await P4PSDK.minusTicket('revive'); // const success = await P4PSDK.minusTicket('revive');
if (success) { // if (success) {
this.gameRelive(); // this.gameRelive();
} else { // } else {
P4PSDK.callPayPalModal(); // P4PSDK.callPayPalModal();
} // }
} else { // } else {
this.gameOver(); // this.gameOver();
} // }
} else { // } else {
this.gameRelive(); // this.gameRelive();
} // }
this._minusTicketLoading = false; // this._minusTicketLoading = false;
} }
public async play() { public async play() {
await P4PSDK.startGame();
const coin = await P4PSDK.getUserCoin();
this._timer.time = this._timePlay; this._timer.time = this._timePlay;
this._score = 0; this._score = 0;
this._currentBallInGame = 0; this._currentBallInGame = 0;
@ -335,8 +335,7 @@ export class GameManager extends Singleton<GameManager>() {
await Utils.delay(TimeConfig.DelayPLay); await Utils.delay(TimeConfig.DelayPLay);
this._timer.startCount(); this._timer.startCount();
this.spawnBall(true); this.spawnBall(true);
await P4PSDK.minusTicket('auth'); EventManger.instance.emit(GameEvent.TicketUpdate, coin);
EventManger.instance.emit(GameEvent.TicketUpdate, P4PSDK.getUserTicket());
} }
public async gameRelive() { public async gameRelive() {

View File

@ -1,48 +1,92 @@
export type postMessageType = 'paypal_modal' | 'game_tournament'; export interface IObject {
[key: string]: any;
}
export type minusTicketType = 'auth' | 'revive'; export interface IUserInfo {
id: string;
displayName: string;
promoCode: string;
isSubscriber: boolean;
avatarLink: string;
}
export interface IParticipationInfo {
id: string;
totalScore: number;
myRank: number;
gameStates: IObject;
}
export interface ILogger {
log(...data: (number | string | boolean | undefined | null)[]): void;
info(...data: (number | string | boolean | undefined | null)[]): void;
warn(...data: (number | string | boolean | undefined | null)[]): void;
error(...data: (number | string | boolean | undefined | null)[]): void;
addBadge(badge: string, style?: { color?: string; backgroundColor?: string }): ILogger;
}
export interface IAnalyticsModule {
logger: ILogger;
}
export interface IDataModule {
getItem<T>(key: string): T | null;
setItem(key: string, value: any): void;
removeItem(key: string): void;
clear(): void;
}
export interface IBroadCast {
emit(eventType: EventType | string, data?: any): void;
on<K extends keyof EventMap>(eventType: K | string, listener: EventMap[K], thisArg?: any): void;
off<K extends keyof EventMap>(eventType: K | string, listener: EventMap[K], thisArg?: any): void;
}
export enum EventType {
OnKeyDown = 'OnKeyDown',
OnKeyUp = 'OnKeyUp',
OnMouse = 'OnMouse',
OnMouseDown = 'OnMouseDown',
OnMouseUp = 'OnMouseUp',
OnGameStart = 'OnGameStart',
OnGameEnd = 'OnGameEnd',
}
export interface EventMap {
[EventType.OnKeyDown]: (key: number) => void;
[EventType.OnKeyUp]: (key: number) => void;
[EventType.OnMouse]: (position: IVector2) => void;
[EventType.OnMouseDown]: (button: number) => void;
[EventType.OnMouseUp]: (button: number) => void;
[EventType.OnGameStart]: () => void;
[EventType.OnGameEnd]: (score: number) => void;
[event: string]: (data: any) => void;
}
interface IVector2 {
x: number;
y: number;
}
export interface SDK { export interface SDK {
setCallAPI(value: boolean): void; previousScore: number;
getEnv(): string; currentScore: number;
getUserTicket(): number; totalScore: number;
getTopScore(): number; userRank: number;
getLatestScore(): number; isUseApi: boolean;
getGameScore(): number; tournamentData: IDataModule;
getUserId(): string; userData: IDataModule;
getGameTime(): number | null; gameData: IDataModule;
getTicketNeedToContinue(): number; analytics: IAnalyticsModule;
init(buyTicketCallBack: () => any, thisArg?: any): void; broadCast: IBroadCast;
gameTime: number;
updateScore(score: number): void; updateScore(score: number): void;
authenticate(): Promise<boolean>; init(): Promise<void>;
checkGameScoreTicket(): Promise<boolean>; getUserInfo(): Promise<IUserInfo>;
buyMoreTicket(): void; getLeaderBoard(start: number, count: number): Promise<IParticipationInfo[]>;
postScoreToServer(): void; startGame(): Promise<boolean>;
minusTicket(type: minusTicketType): Promise<boolean>; endGame(): Promise<boolean>;
callPayPalModal(): void; getUserCoin(): Promise<number>;
canRelive(): boolean;
spinGacha(id: string): Promise<Reward>;
getLeaderBoard(): Promise<PlayerInfo[]>;
}
export enum Env {
development,
staging,
production,
}
export interface PlayerInfo {
userId: string;
displayName: string;
score: number;
}
export interface Reward {
id: string;
name: string;
description: string;
quantity: number;
thumbnailLink: string;
} }
enum InitState { enum InitState {
@ -50,54 +94,72 @@ enum InitState {
Initialized, Initialized,
} }
export default class P4PSDK { (window as any).P4P = {
private static _initState: InitState = InitState.UnInitialized; isUseApi: true,
private static _sdk: SDK; };
//#region PUBLIC METHOD class _P4PSDK implements SDK {
private _initState: InitState = InitState.UnInitialized;
private _sdk: SDK;
public static getEnv(): Env { private get sdk() {
return Env[this._sdk?.getEnv() as keyof typeof Env]; if (this._initState !== InitState.Initialized || !this._sdk) {
throw new Error('P4P SDK is not initialized yet. Please call P4PSDK.init() first.');
}
return this._sdk;
} }
public static getUserTicket(): number { public get tournamentData(): IDataModule {
return this._sdk?.getUserTicket(); return this.sdk.tournamentData;
}
public get userData(): IDataModule {
return this.sdk.userData;
}
public get gameData(): IDataModule {
return this.sdk.gameData;
}
public get analytics(): IAnalyticsModule {
return this.sdk.analytics;
}
public get broadCast(): IBroadCast {
return this.sdk.broadCast;
}
public get previousScore(): number {
return this.sdk.previousScore;
}
public get currentScore(): number {
return this.sdk.currentScore;
}
public get totalScore(): number {
return this.sdk.totalScore;
}
public get userRank(): number {
return this.sdk.userRank;
}
public get isUseApi(): boolean {
return this.sdk.isUseApi;
}
public set isUseApi(value: boolean) {
(window as any).P4P.isUseApi = value;
}
public get gameTime(): number {
return this.sdk.gameTime;
} }
public static getTopScore(): number { private async loadSDK(): Promise<void> {
return this._sdk?.getTopScore();
}
public static getLatestScore(): number {
return this._sdk?.getLatestScore();
}
public static getGameScore(): number {
return this._sdk?.getGameScore();
}
public static getUserId(): string {
return this._sdk.getUserId();
}
public static getGameTime(): number | null {
return this._sdk.getGameTime();
}
public static getTicketNeedToContinue(): number {
return this._sdk?.getTicketNeedToContinue();
}
private static async loadSDK(): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const tag = document.createElement('script'); const tag = document.createElement('script');
tag.type = 'module'; tag.type = 'module';
tag.src = 'https://firebasestorage.googleapis.com/v0/b/play-now-1aef8.appspot.com/o/SDK%2Fsdk.js?alt=media'; tag.src = 'https://storage.googleapis.com/play-now-1aef8.appspot.com/SDKTEST/sdk.js';
tag.async = true; tag.async = true;
tag.onload = async () => { tag.onload = async () => {
console.log('P4P SDK loaded'); this._sdk = (globalThis as any).P4P.SDK;
this._sdk = (window as any).P4P.SDK; if (this._sdk) {
resolve(); await this._sdk.init();
resolve();
} else {
reject('P4P SDK is undefined');
}
}; };
tag.onerror = (e) => { tag.onerror = (e) => {
console.error('Failed to load P4PSDK JS. Please check your internet connection.'); console.error('Failed to load P4PSDK JS. Please check your internet connection.');
@ -107,55 +169,39 @@ export default class P4PSDK {
}); });
} }
public static setCallAPI(value: boolean) { public async init(): Promise<void> {
this._sdk?.setCallAPI(value);
}
public static async init(buyTicketCallBack: () => any, thisArg?: any): Promise<void> {
if (this._initState == InitState.Initialized) return; if (this._initState == InitState.Initialized) return;
await this.loadSDK(); await this.loadSDK();
this._sdk.init(buyTicketCallBack, thisArg);
this._initState = InitState.Initialized; this._initState = InitState.Initialized;
} }
public static updateScore(score: number) { public setIsUseApi(value: boolean) {
this._sdk?.updateScore(score); (window as any).P4P.isUseApi = value;
} }
public static async authenticate(): Promise<boolean> { public updateScore(score: number): void {
return this._sdk?.authenticate(); this.sdk.updateScore(score);
} }
public static async checkGameScoreTicket(): Promise<boolean> { public getUserInfo(): Promise<IUserInfo> {
return this._sdk?.checkGameScoreTicket(); return this.sdk.getUserInfo();
} }
public static buyMoreTicket() { public getLeaderBoard(start: number, count: number) {
this._sdk?.buyMoreTicket(); return this.sdk.getLeaderBoard(start, count);
} }
public static async postScoreToServer() { public startGame(): Promise<boolean> {
this._sdk?.postScoreToServer(); return this.sdk.startGame();
} }
public endGame(): Promise<boolean> {
public static async minusTicket(type: minusTicketType): Promise<boolean> { return this.sdk.endGame();
return this._sdk?.minusTicket(type);
} }
public getUserCoin(): Promise<number> {
public static callPayPalModal() { return this.sdk.getUserCoin();
this._sdk?.callPayPalModal();
} }
public static canRelive(): boolean {
return this._sdk?.canRelive();
}
public static async spinGacha(id: string): Promise<Reward> {
return this._sdk?.spinGacha(id);
}
public static async getLeaderBoard(): Promise<PlayerInfo[]> {
return this._sdk?.getLeaderBoard();
}
//#endregion
} }
const P4PSDK: SDK = new _P4PSDK();
export default P4PSDK;

View File

@ -48,11 +48,12 @@ export class GameOverPanel extends Component {
EventManger.instance.on(GameEvent.GameStateChange, this.onGameStateChange, this); EventManger.instance.on(GameEvent.GameStateChange, this.onGameStateChange, this);
} }
public show(end: boolean): void { public async show(end: boolean): Promise<void> {
this._ticketMinus.string = P4PSDK.getTicketNeedToContinue().toString(); // this._ticketMinus.string = P4PSDK.getTicketNeedToContinue().toString();
const currentScore = P4PSDK.getLatestScore(); const currentScore = P4PSDK.previousScore;
const gameScore = P4PSDK.getGameScore(); const gameScore = P4PSDK.currentScore;
this.topScore.string = P4PSDK.getTopScore().toString(); const top = await P4PSDK.getLeaderBoard(0, 1);
// this.topScore.string = top.length > 0 ? top[0].totalScore.toString() : '0';
this.yourScore.string = currentScore.toString(); this.yourScore.string = currentScore.toString();
this.playCollectEffect(gameScore, currentScore); this.playCollectEffect(gameScore, currentScore);
this.scheduleOnce(this.endGame, 60); this.scheduleOnce(this.endGame, 60);
@ -79,7 +80,7 @@ export class GameOverPanel extends Component {
this._quitBtn.active = false; this._quitBtn.active = false;
if (this._active) { if (this._active) {
await Utils.delay(1); await Utils.delay(1);
P4PSDK.postScoreToServer(); P4PSDK.endGame();
} }
break; break;
case GameState.Relive: case GameState.Relive:
@ -161,7 +162,7 @@ export class GameOverPanel extends Component {
.start(); .start();
if (!this._end) return; if (!this._end) return;
await Utils.delay(1); await Utils.delay(1);
P4PSDK.postScoreToServer(); P4PSDK.endGame();
} }
} }
} }

View File

@ -0,0 +1,17 @@
import { _decorator, Component, Label, Node } from 'cc';
import P4PSDK from '../P4PSDK';
const { ccclass, property } = _decorator;
@ccclass('LeaderBoard')
export default class LeaderBoard extends Component {
@property(Node)
private items: Node[] = [];
protected async onLoad(): Promise<void> {
const LeaderBoard = await P4PSDK.getLeaderBoard(0, 5);
LeaderBoard.forEach((info, i) => {
this.items[i].getChildByName('Score').getComponent(Label).setString(info.totalScore);
});
}
}

View File

@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "9bedefa1-9567-4550-8128-fd27c9a8091d",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@ -1,5 +1,6 @@
import { import {
_decorator, _decorator,
CCBoolean,
Component, Component,
EventKeyboard, EventKeyboard,
EventTouch, EventTouch,
@ -17,6 +18,7 @@ import TimeConfig from '../Enum/TimeConfig';
import GameEvent from '../Events/GameEvent'; import GameEvent from '../Events/GameEvent';
import { EventManger } from '../Manager/EventManger'; import { EventManger } from '../Manager/EventManger';
import { GameManager } from '../Manager/GameManager'; import { GameManager } from '../Manager/GameManager';
import P4PSDK, { EventType } from '../P4PSDK';
import Utils from '../Utilities'; import Utils from '../Utilities';
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
@ -31,20 +33,25 @@ export class TutorialController extends Component {
private _tapLEffect: ParticleSystem; private _tapLEffect: ParticleSystem;
@property({ type: ParticleSystem, visible: true }) @property({ type: ParticleSystem, visible: true })
private _tapREffect: ParticleSystem; private _tapREffect: ParticleSystem;
@property(CCBoolean)
private playOnStart: boolean;
@property(CCBoolean)
private enableTutorial: boolean = true;
private _timer = 0; private _timer = 0;
private _showed = false; private _showed = false;
private _canShow = true; private _canShow = true;
private _playing = false; private _playing = false;
protected onLoad(): void { protected onLoad() {
this.node.on(Input.EventType.TOUCH_START, this.onTouchStart, this); this.node.on(Input.EventType.TOUCH_START, this.onTouchStart, this);
input.on(Input.EventType.KEY_UP, this.onKeyInputUpStart, this); input.on(Input.EventType.KEY_UP, this.onKeyInputUpStart, this);
P4PSDK.broadCast.on(EventType.OnKeyDown, this.onSDKKeyInputStart, this);
EventManger.instance.on(GameEvent.GameStateChange, this.onGameStateChange, this); EventManger.instance.on(GameEvent.GameStateChange, this.onGameStateChange, this);
}
protected start() {
this.playTutorial(); this.playTutorial();
if (this.playOnStart) {
this.startGame();
}
} }
protected update(dt: number): void { protected update(dt: number): void {
@ -74,6 +81,7 @@ export class TutorialController extends Component {
} }
private async playTutorial() { private async playTutorial() {
if (!this.enableTutorial) return;
if (this._canShow) { if (this._canShow) {
this._tapL.setActive(true); this._tapL.setActive(true);
this._tapR.setActive(true); this._tapR.setActive(true);
@ -115,9 +123,11 @@ export class TutorialController extends Component {
this.stopTutorial(); this.stopTutorial();
this.node.off(Input.EventType.TOUCH_START, this.onTouchStart, this); this.node.off(Input.EventType.TOUCH_START, this.onTouchStart, this);
input.off(Input.EventType.KEY_UP, this.onKeyInputUpStart, this); input.off(Input.EventType.KEY_UP, this.onKeyInputUpStart, this);
P4PSDK.broadCast.off(EventType.OnKeyDown, this.onSDKKeyInputStart, this);
this.node.on(Input.EventType.TOUCH_START, this.onTouch, this); this.node.on(Input.EventType.TOUCH_START, this.onTouch, this);
input.on(Input.EventType.KEY_UP, this.onKeyInputUp, this); input.on(Input.EventType.KEY_UP, this.onKeyInputUp, this);
P4PSDK.broadCast.on(EventType.OnKeyDown, this.onSDKKeyInput, this);
GameManager.instance.play(); GameManager.instance.play();
} }
@ -130,6 +140,19 @@ export class TutorialController extends Component {
this.startGame(); this.startGame();
} }
private onSDKKeyInputStart(key: number) {
switch (key) {
case KeyCode.KEY_A:
case KeyCode.ARROW_LEFT:
case KeyCode.KEY_D:
case KeyCode.ARROW_RIGHT:
this.startGame();
break;
default:
break;
}
}
private onKeyInputUpStart(event: EventKeyboard) { private onKeyInputUpStart(event: EventKeyboard) {
switch (event.keyCode) { switch (event.keyCode) {
case KeyCode.KEY_A: case KeyCode.KEY_A:
@ -155,4 +178,17 @@ export class TutorialController extends Component {
break; break;
} }
} }
private onSDKKeyInput(key: number) {
switch (key) {
case KeyCode.KEY_A:
case KeyCode.ARROW_LEFT:
case KeyCode.KEY_D:
case KeyCode.ARROW_RIGHT:
this.stopTutorial();
break;
default:
break;
}
}
} }

View File

@ -65,9 +65,10 @@ export class UIController extends Component {
private async onGameStateChange(state: GameState) { private async onGameStateChange(state: GameState) {
switch (state) { switch (state) {
case GameState.Init: case GameState.Init:
const coin = await P4PSDK.getUserCoin();
this.playButton.interactable = true; this.playButton.interactable = true;
this.loadingScreen.active = false; this.loadingScreen.active = false;
this._ticketLabel.string = P4PSDK.getUserTicket().toString(); this._ticketLabel.string = coin.toString();
this._scoreLabel.string = '0'; this._scoreLabel.string = '0';
break; break;
case GameState.Ready: case GameState.Ready:

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,134 @@
{
"ver": "1.0.26",
"importer": "image",
"imported": true,
"uuid": "220aee0b-1bec-404e-89c3-a309ef059864",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "220aee0b-1bec-404e-89c3-a309ef059864@6c48a",
"displayName": "thanh pad",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "220aee0b-1bec-404e-89c3-a309ef059864",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "220aee0b-1bec-404e-89c3-a309ef059864@f9941",
"displayName": "thanh pad",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimType": "auto",
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 438,
"height": 68,
"rawWidth": 438,
"rawHeight": 68,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-219,
-34,
0,
219,
-34,
0,
-219,
34,
0,
219,
34,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
68,
438,
68,
0,
0,
438,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-219,
-34,
0
],
"maxPos": [
219,
34,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "220aee0b-1bec-404e-89c3-a309ef059864@6c48a",
"atlasUuid": ""
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "220aee0b-1bec-404e-89c3-a309ef059864@f9941"
}
}