banner
raye~

Raye's Journey

且趁闲身未老,尽放我、些子疏狂。
medium
tg_channel
twitter
github
email
nintendo switch
playstation
steam_profiles

pixi.jsでWeChatミニゲームを開発する-問題の解決

biaoti11

pixi.js 開発ウィーチャットゲーム#

私が使用している pixi.js はバージョン 5.2.1 で、リソースの読み込み API はグローバルなシングルトンオブジェクト PIXI.Loader.shared に変更されました。

ウィーチャットゲームプロジェクトを実行する際、画像リソースの読み込みは以下のように記述されます:

let loader = PIXI.Loader.shared
loader.add('bg', 'static/textures/bg.png');

しかし、ウィーチャット開発者ツールは常に indexOf メソッドが存在しないというエラーを報告しています。そのため、エラーメッセージを追跡し、エラースタックの直前にある crossOrigin メソッドの呼び出し前に if 文の判定があることがわかりました。

source の型を判定し、HTMLImageElement を継承していない場合、source を文字列として扱い、後続のメソッドに入り、indexOf メソッドを呼び出してエラーが発生します。

しかし、問題は source が既に画像オブジェクトであるため、当然 indexOf メソッドは存在しないということです。そのため、エラーが発生します。

Untitled

ではなぜ instanceof 判定が失敗するのでしょうか。そこで、ブラウザ環境でテストしてみます。

Untitled 1

コンソールに入力すると、明らかに true が返されます。

Untitled 2

では、ウィーチャット環境ではなぜ false が返されるのでしょうか。おそらくアダプタの問題だと思われます。

私が使用しているアダプタは他の人が修正した @iro/wechat-adapter です(ウィーチャットが提供する元のバージョンには多くの問題があります)。以下のコードの一部が問題があることに気づきました:

export class HTMLImageElement extends wx.createImage().constructor {

}

私のテストの結果、wx.createImage().construcotr そのものが HTMLImageElement であることがわかりました。ここで extends が追加されると、プロトタイプチェーンに余分なレイヤーが追加され、問題が発生します。

プロトタイプチェーンに詳しくない方は、次の図を見て簡単に理解してください(私の理解では、instanceof と extends は本質的にはプロトタイプチェーンの検索です)。

Untitled 3

したがって、単純に等しい値に変更するだけで十分であり、extends は必要ありません。

export const HTMLImageElement = wx.createImage().constructor

コードを一時的に変更したい場合は、git clone してローカルに保存し、コードを変更してからプロジェクトの依存関係をローカルに指定するだけです。

"@iro/wechat-adapter": "file:/Users/rayepeng/Documents/OpenSource/MyFrontEndCode/wechat-adapter/src/",

これでプロジェクトは正常に実行されます。

注:修正後の wechat-adapter パッケージは既に公開されています:https://www.npmjs.com/package/@rayepeng/wechat-adapter

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。