この記事はシリーズの2回目です他の記事については、以下の投稿の目次をご覧ください
http://www.php.cn/html5-tutorial-354344.html
突然です。鍾馗老将軍が食料も水もなく、しばらく暗い戦場にいたことを思い出した。
戦場に来て見てみると、そんな心配は無用だったことが分かりました、老将軍はその場でまだ元気で活動的で、「私を陥れようとするな、私は一度死んでいる。」と叫び続けていました。 「」。
必死に二歩前に進もうとする老大将を見て、私は老大将を動かしてもらうことにしました。
ただし、最初に、戦場を明るくし、背景画像を準備してから、LBitmap オブジェクトを使用してゲーム内に表示し、元の黒い四角形をコメントアウトする必要があります。
//背景层 backLayer = new LSprite(); //backLayer.graphics.drawRect(1,"#000",[0,0,LGlobal.width,LGlobal.height],true,"#000"); baseLayer.addChild(backLayer); var background = new LBitmap(new LBitmapData(imglist["back"])); backLayer.addChild(background);
効果は以下の通りです
黄老将軍は久しぶりに見慣れた戦場を眺め、戦場にある「東」の旗を見て叫んだ。 「危うく気を失いそうになった、董卓、それが私に何の関係があるの!?」 実際、適切な写真を見つけるしかありません。次のステップはキャラクターを動かすことです。」もう動き始めていますが、動き回るだけでもう疲れ果ててしまいました。ところで、このおじさんはなぜそんなに怒っているのでしょうか...
私は彼に注意を払ってコードを書き続けるのが面倒なので、前のコードを中断して、一度に 1 つのアクションを実行してみましょう。ここではコア部分のみを書きます。完全なコードはすぐにダウンロードされます。
1. 歩き回る
ゲームでは、キーボードの各キーの状態が押されているかポップアップされているかを正確に判断する必要があるため、キーボードのキーの状態を保存する keyCtrl 配列を用意します。
押すときは
keyCtrl[e.keyCode] = true;
ポップアップするときは
keyCtrl[e.keyCode] = false;
このようにして、keyCtrl配列を通じて各キーの状態を取得することができます。
次に、Characterクラスのonframe関数内でmove関数を呼び出し、move関数内でキャラクターの現在の状態に基づいて、移動する移動ステップの長さを計算します。
Character.prototype.move = function (){ var self = this, mx = self.mx, my = self.my; if(self.action == ACTION.MOVE || self.action == ACTION.JUMP || self.action == ACTION.JUMP_ATTACK){ mx *= MOVE_STEP; my *= MOVE_STEP; }else if(self.action == ACTION.RUN){ mx *= MOVE_STEP*2; my *= MOVE_STEP*2; }else if(self.action == ACTION.HIT){ mx = MOVE_STEP*2*(self.direction == DIRECTION.RIGHT ? 1 : -1); my = 0; }else{ mx = my = 0; } if(mx == 0 && my == 0)return; self.x += mx; self.y += my; if(self.y < 250){ self.y = 250; }else if(self.y > 448){ self.y = 448; } };
上記のself.mx、self.myはPlayerクラスで計算されます
Player.prototype.move = function (){ var self = this, mx = 0, my = 0; if(keyCtrl[KEY.LEFT]){ mx = -1; }else if(keyCtrl[KEY.RIGHT]){ mx = 1; }else if(keyCtrl[KEY.UP]){ my = -1; }else if(keyCtrl[KEY.DOWN]){ my = 1; } self.mx = mx; self.my = my; self.callParent("move",arguments); };
callParent関数は、lufylegendエンジンの親クラスの関数を呼び出すメソッドで、最初のパラメータはメソッドです。親クラスの名前。Player は Character を継承するため、2 番目のパラメーターは固定パラメーター引数であり、Character オブジェクトの move 関数が呼び出されます。
次に、キーボードのキー押下の onkeydown リスニング機能で、キーに応じてキャラクターの状態を変更し、キャラクターが歩くことができるようにします。
2. ランニング
ランニングとは、左または右を2回連続で押すことを意味します。これには、次のトリックなどを考慮して、キーを格納するための配列keyListがあります。
キーが押されるたびに、現在の情報が配列にプッシュされ、不要なキー情報(2回前)が削除されます。var keyList = [{keyCode:0,time:0},{keyCode:0,time:0},{keyCode:0,time:0}];次に、キーシーケンスの情報に基づいて
var keyThis = {keyCode:e.keyCode,time:(new Date()).getTime()}; var keyLast01 = keyList[0]; var keyLast02 = keyList[1]; keyList.unshift(keyThis); keyList.pop();を実行するかどうかを判断します。 3.ジャンプキャラクターの動きがLAnimationを介しているため、制御を容易にするためにジャンプ画像を修正しました
オブジェクトが表示されるので、ジャンプ処理中にLAnimationオブジェクトのy座標を変更すればジャンプが実現できます
switch(e.keyCode){ case KEY.LEFT: if(keyLast01.keyCode == KEY.LEFT && keyThis.time - keyLast01.time < 200){ hero.setAction(ACTION.RUN,DIRECTION.LEFT); }else{ hero.setAction(ACTION.MOVE,DIRECTION.LEFT); } break; case KEY.RIGHT: if(keyLast01.keyCode == KEY.RIGHT && keyThis.time - keyLast01.time < 200){ hero.setAction(ACTION.RUN,DIRECTION.RIGHT); }else{ hero.setAction(ACTION.MOVE,DIRECTION.RIGHT); } break;上記のコードは、キャラクターがジャンプしたり、ジャンプ 攻撃するとき、対応する onjump 関数と onjump_attach 関数が呼び出されます。この 2 つの関数では、画像の再生回数に応じて LAnimation オブジェクトの y 座標が変更されます
Player.prototype.onframe = function (){ var self = this; self.callParent("onframe",arguments); if(self.action == ACTION.JUMP){ self.onjump(); }else if(self.action == ACTION.JUMP_ATTACK){ self.onjump_attack(); } };このようにして、ジャンプが完全に実現されます。
4.攻撃
Player.prototype.onjump = function (){
var self = this;
self.setLocation();
var index = self.anime.colIndex;
self.yArr = [0,-10,-20,-30,-40,-40,-30,-20,-10,0];
self.anime.y += self.yArr[index];
};
Player.prototype.onjump_attack = function (){
var self = this;
self.setLocation();
var index = self.anime.colIndex;
if(index >= self.yArr.length)return;
self.anime.y += self.yArr[index];
};
setTimeout関数? , 発動する必殺技もあるため、必殺技を発動するには攻撃ボタンとジャンプボタンを同時に押す必要がありますが、2つのボタンを同時に押すことは不可能です。ここでは、この間隔の最大値を 50 ミリ秒に設定しています。この 50 ミリ秒以内にもう一度ジャンプ キーを押すことができます。 5、連続攻撃通常攻撃が連続すると、3回ごとに特殊攻撃が出現しますsetTimeout("keylock = true;",50);
hero.setAction(ACTION.ATTACK,hero.direction);
もちろん、3回攻撃の場合は、この連続攻撃の時間を判断する必要があります。 1秒以内に設定すると連続攻撃と判定されます。
6.ジャンプ攻撃
case KEY.ATTACK:
if(keyLast01.keyCode == KEY.ATTACK && keyLast02.keyCode == KEY.ATTACK && keyThis.time - keyLast02.time < 1000){
keyList = [{keyCode:0,time:0},{keyCode:0,time:0},{keyCode:0,time:0}];
keylock = true;
hero.setAction(ACTION.BIG_ATTACK,hero.direction);
}
7、スキル攻撃アーケード三国志をプレイしたことのある友人は皆、下=>上=>攻撃を押すと特別な一般スキルが発動することを知っています。これも簡単です。攻撃ボタンは最初の2つのボタンを押すだけです。 case KEY.ATTACK:
if(keyLast01.keyCode == KEY.ATTACK && keyLast02.keyCode == KEY.ATTACK && keyThis.time - keyLast02.time < 1000){
keyList = [{keyCode:0,time:0},{keyCode:0,time:0},{keyCode:0,time:0}];
keylock = true;
hero.setAction(ACTION.BIG_ATTACK,hero.direction);
}else if(hero.action == ACTION.JUMP){
hero.setAction(ACTION.JUMP_ATTACK,hero.direction);
}else{
setTimeout("keylock = true;",50);
hero.setAction(ACTION.ATTACK,hero.direction);
}
8、究極のトリック 画面が周囲の敵でいっぱいの場合はどうすればよいですか?ズームインしてください。
在攻击键按下的时候,判断一下跳跃键是不是同时被按下了。
if(keyLast01.keyCode == KEY.JUMP && keyThis.time - keyLast01.time < 50){ keylock = true; hero.setAction(ACTION.BIG_SKILL,hero.direction); }
当然,在跳跃键按下的时候,也需要判断一下攻击键是不是被按下了。
if(keyLast01.keyCode == KEY.ATTACK && keyThis.time - keyLast01.time < 50){ keylock = true; hero.setAction(ACTION.BIG_SKILL,hero.direction); }
绝招发动的时候,其他按键是无效的,所以键按键上锁keylock=true;
比较特殊的是,绝招图片的动作比较多,全都合到一行上的话,图片太长,所以我分成了5行。
其他的动作图片都是一行,所以这里需要做些特殊处理,就是当一行图片播放完之后,马上开始播放下一行图片,知道全部动作都播放完为止。
处理过程是,首先在动作改变的时候,加上侦听函数
self.anime.addEventListener(LEvent.COMPLETE,self.overAction);
这样,当一组动作播放完毕之后,会调用overAction函数
下面是Character对象的overAction函数
Character.prototype.overAction = function (anime){ var self = anime.parent; self.anime.removeEventListener(LEvent.COMPLETE,self.overAction); var lastAction = self.action; var animeAction = anime.getAction(); self.setAction(ACTION.STAND,self.direction); self.overActionRun(lastAction,animeAction); }; Character.prototype.overActionRun = function (lastAction,animeAction){ };
LAnimation对象的getAction函数是获取当前的属性,包括播放的图片序号和镜像等,具体请参照lufylegend引擎的API文档,接着在Player对象中重写overActionRun函数。
Player.prototype.overActionRun = function (lastAction,animeAction){ var self = this; self.callParent("overActionRun",arguments); keylock = false; if(lastAction == ACTION.BIG_SKILL && animeAction[0] < 3){ keylock = true; self.setAction(ACTION.BIG_SKILL,self.direction); self.anime.setAction(animeAction[0]+1); self.anime.onframe(); } };
animeAction[0]是播放图片的行序号,根据行序号的值,判定是否继续播放下一行动作,绝招处理完成。
最后,整合一下上面的处理,onkeydown函数的完整代码如下。
function onkeydown(e){ if(keylock || keyCtrl[e.keyCode])return; var keyThis = {keyCode:e.keyCode,time:(new Date()).getTime()}; var keyLast01 = keyList[0]; var keyLast02 = keyList[1]; keyCtrl[e.keyCode] = true; keyList.unshift(keyThis); keyList.pop(); switch(e.keyCode){ case KEY.LEFT: if(keyLast01.keyCode == KEY.LEFT && keyThis.time - keyLast01.time < 200){ hero.setAction(ACTION.RUN,DIRECTION.LEFT); }else{ hero.setAction(ACTION.MOVE,DIRECTION.LEFT); } break; case KEY.RIGHT: if(keyLast01.keyCode == KEY.RIGHT && keyThis.time - keyLast01.time < 200){ hero.setAction(ACTION.RUN,DIRECTION.RIGHT); }else{ hero.setAction(ACTION.MOVE,DIRECTION.RIGHT); } break; case KEY.UP: hero.setAction(ACTION.MOVE,hero.direction); break; case KEY.DOWN: hero.setAction(ACTION.MOVE,hero.direction); break; case KEY.ATTACK: if(keyLast01.keyCode == KEY.ATTACK && keyLast02.keyCode == KEY.ATTACK && keyThis.time - keyLast02.time < 1000){ keyList = [{keyCode:0,time:0},{keyCode:0,time:0},{keyCode:0,time:0}]; keylock = true; hero.setAction(ACTION.BIG_ATTACK,hero.direction); }else if(keyLast01.keyCode == KEY.JUMP && keyThis.time - keyLast01.time < 50){ keylock = true; hero.setAction(ACTION.BIG_SKILL,hero.direction); }else if(hero.action == ACTION.JUMP){ hero.setAction(ACTION.JUMP_ATTACK,hero.direction); }else if(keyLast01.keyCode == KEY.UP && keyLast02.keyCode == KEY.DOWN && keyThis.time - keyLast02.time < 300){ keylock = true; hero.setAction(ACTION.SKILL,hero.direction); }else{ setTimeout("keylock = true;",50); hero.setAction(ACTION.ATTACK,hero.direction); } break; case KEY.JUMP: if(keyLast01.keyCode == KEY.ATTACK && keyThis.time - keyLast01.time < 50){ keylock = true; hero.setAction(ACTION.BIG_SKILL,hero.direction); }else if(keyCtrl[KEY.DOWN]){ hero.setAction(ACTION.HIT,hero.direction); }else{ hero.setAction(ACTION.JUMP,hero.direction); } break; } }
测试连接如下:
http://lufy.netne.net/lufylegend-js/act02/index.html
下面是各个动作的按键,大家可以测试一下
走动:A向左,D向右,W向上,S向下
跑:按两下走动
跳:K
攻击:J
连续攻击:攻击多次
跳跃攻击:K => J
撞击:S+K
技能攻击:S => W => J
绝招:J+K
老将军既然已经能跑能跳了,便冲着我大喊:“马忠在哪儿?”。要知道找个素材那可是比登天还难啊,我上哪里给他找马忠去啊,下次还是先给他整几个炮灰让他先过过瘾吧。
上面说的可能有点乱,现在给出本次源码下载,喜欢的可以看一下。
http://fsanguo.comoj.com/download.php?i=act02.rar
注意:该附件只包含本次文章源码,lufylegend.js引擎请到http://lufylegend.com/lufylegend进行下载。
以上就是[HTML5游戏开发]挑战横版ACT(二):秀身手勇猛如当年的内容,更多相关内容请关注PHP中文网(www.php.cn)!

H5(HTML5)は、新しい要素とAPIを介してWebコンテンツと設計を改善します。 1)H5はセマンティックタグ付けとマルチメディアサポートを強化します。 2)キャンバスとSVGを導入し、Webデザインを濃縮します。 3)H5は、新しいタグとAPIを介してHTML機能を拡張することにより機能します。 4)基本的な使用には、それを使用したグラフィックの作成が含まれ、高度な使用法にはwebstorageapiが含まれます。 5)開発者は、ブラウザの互換性とパフォーマンスの最適化に注意を払う必要があります。

H5は多くの新しい機能と機能をもたらし、Webページのインタラクティブ性と開発効率を大幅に改善します。 1。SEOの強化などのセマンティックタグ。 2.マルチメディアサポートは、オーディオとビデオの再生とタグを簡素化します。 3. Canvas Drawingは、動的なグラフィックスの描画ツールを提供します。 4.ローカルストレージは、LocalStorageとSessionStorageを介してデータストレージを簡素化します。 5. Geolocation APIは、ロケーションベースのサービスの開発を促進します。

HTML5は5つの重要な改善をもたらします。1。セマンティックタグにより、コードの明確性とSEO効果が向上します。 2.マルチメディアサポートは、ビデオとオーディオの埋め込みを簡素化します。 3。フォームエンハンスメントは、検証を簡素化します。 4.オフラインおよびローカルストレージにより、ユーザーエクスペリエンスが向上します。 5。キャンバスとグラフィック機能は、Webページの視覚化を強化します。

HTML5のコア機能には、セマンティックタグ、マルチメディアサポート、オフラインストレージ、ローカルストレージ、フォームエンハンスメントが含まれます。 1。コードの読みやすさとSEO効果を改善するためのセマンティックタグなど。 2.ラベルでマルチメディアの埋め込みを簡素化します。 3。アプリケーションキャッシュやLocalStorageなどのオフラインストレージとローカルストレージは、ネットワークのない操作とデータストレージをサポートします。 4.フォームエンハンスメントでは、処理と検証を簡素化するための新しい入力タイプと検証プロパティを導入します。

H5は、さまざまな新機能と機能を提供し、フロントエンド開発の機能を大幅に向上させます。 1.マルチメディアサポート:メディアを埋め込んで要素を埋め込み、プラグインは必要ありません。 2。キャンバス:要素を使用して、2Dグラフィックとアニメーションを動的にレンダリングします。 3。ローカルストレージ:ユーザーエクスペリエンスを改善するために、ローカルストレージとセッションストレージを介して永続的なデータストレージを実装します。

H5とHTML5は異なる概念です。HTML5は、新しい要素とAPIを含むHTMLのバージョンです。 H5は、HTML5に基づくモバイルアプリケーション開発フレームワークです。 HTML5はブラウザを介してコードを解析およびレンダリングしますが、H5アプリケーションはコンテナを実行し、JavaScriptを介してネイティブコードと対話する必要があります。

HTML5の重要な要素には、最新のWebページの構築に使用される、、,,,,などが含まれます。 1.ヘッドコンテンツを定義します。2。リンクをナビゲートするために使用されます。3。独立した記事のコンテンツを表します。4。ページコンテンツを整理します。5。サイドバーコンテンツを表示します。

HTML5とHTML5の略語であるHTML5とH5の間に違いはありません。 1.HTML5はHTMLの5番目のバージョンであり、Webページのマルチメディア関数とインタラクティブ機能を強化します。 2.H5は、HTML5ベースのモバイルWebページまたはアプリケーションを参照するためによく使用され、さまざまなモバイルデバイスに適しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ホットトピック









