แฟลชถูกทิ้งร้างอย่างช้าๆโดย Adobe ในความโปรดปรานของ HTML5 และ JavaScript; การสิ้นสุดของชีวิตอย่างเป็นทางการเป็นอย่างเป็นทางการสำหรับปี 2020 และนั่นคือที่ที่บทความนี้จะมีประโยชน์
เคล็ดลับที่อธิบายไว้ด้านล่างนี้เพื่อช่วยเหลือนักพัฒนาเกม HTML5 หลีกเลี่ยงข้อผิดพลาดทั่วไปเมื่อแปลงเกมแฟลชไปยังจาวาสคริปต์รวมถึงการทำให้กระบวนการพัฒนาทั้งหมดเป็นไปอย่างราบรื่นที่สุดเท่าที่จะทำได้ สิ่งที่คุณต้องมีคือความรู้พื้นฐานเกี่ยวกับ JavaScript WebGL และเฟรมเวิร์ก Phaser
การเปลี่ยนการออกแบบเกมของคุณจาก SWF ไปยัง JavaScript สามารถให้ผลผลิตได้ดีขึ้น ประสบการณ์การใช้งาน ซึ่งจะทำให้มันดูทันสมัย แต่จะทำอย่างไร? คุณต้องการตัวแปลงเกม JavaScript เฉพาะเพื่อกำจัดเทคโนโลยีที่ล้าสมัยนี้หรือไม่? การแปลงแฟลชเป็น HTML5 เป็นชิ้นส่วนของเค้ก - นี่คือสิ่งที่นักพัฒนาเกมจาวาสคริปต์ที่มีประสบการณ์ต้องพูดเกี่ยวกับเรื่องนี้
ชอบที่จะทำให้กระบวนการออกแบบของคุณง่ายขึ้น? สร้างเว็บไซต์ และขวา เว็บโฮสติ้ง ผู้ให้บริการสามารถรักษาได้อย่างนั้น
การแปลงเกมไปยังแพลตฟอร์มอื่นเป็นโอกาสที่ยอดเยี่ยมในการปรับปรุงแก้ไขปัญหาและเพิ่มผู้ชม ด้านล่างมีบางสิ่งที่สามารถทำได้ง่ายและคุ้มค่าที่จะพิจารณา:
เมื่อพูดถึงการพัฒนาเกม JavaScript อาจเป็นการล่อลวงให้ใช้ประโยชน์จาก HTML และ CSS สำหรับปุ่มในเกมวิดเจ็ตและองค์ประกอบ GUI อื่น ๆ คำแนะนำของเราคือระวังที่นี่ มันเป็นการโต้ตอบ แต่จริง ๆ แล้วการใช้ประโยชน์จากองค์ประกอบของ DOM นั้นน้อยกว่าเกมที่ซับซ้อนและสิ่งนี้จะมีความสำคัญมากขึ้นบนมือถือ หากคุณต้องการให้ได้ค่าคงที่ 60 FPS ในทุกแพลตฟอร์มจากนั้นจะต้องลาออกจาก HTML และ CSS
องค์ประกอบ GUI แบบไม่โต้ตอบเช่นบาร์สุขภาพแท่งกระสุนหรือเคาน์เตอร์คะแนนสามารถนำมาใช้ใน Phaser ได้อย่างง่ายดายโดยใช้ภาพปกติ (คลาส 'Phaser.Image') ใช้ประโยชน์จากคุณสมบัติ '.crop' สำหรับการตัดแต่งและ 'Phaser คลาส 'คลาสสำหรับฉลากข้อความที่เรียบง่าย
องค์ประกอบแบบอินเทอร์แอคทีฟเช่นปุ่มและกล่องกาเครื่องหมายสามารถดำเนินการได้โดยใช้คลาส 'Phaser.Button' ในตัว องค์ประกอบอื่น ๆ ที่ซับซ้อนมากขึ้นสามารถประกอบด้วยประเภทง่าย ๆ เช่นกลุ่มรูปภาพปุ่มและฉลากข้อความ
หากคุณต้องการแสดงข้อความด้วยแบบอักษรเวกเตอร์ที่กำหนดเอง (เช่น TTF หรือ OTF) คุณต้องตรวจสอบให้แน่ใจว่าฟอนต์นั้นถูกโหลดโดยเบราว์เซอร์แล้วก่อนแสดงข้อความใด ๆ Phaser V2.6 ไม่ได้ให้วิธีแก้ปัญหาสำหรับจุดประสงค์นี้ แต่สามารถใช้ห้องสมุดอื่นได้ - โหลดแบบอักษรเว็บ .
สมมติว่าคุณมีไฟล์ฟอนต์และรวมถึงตัวโหลดแบบอักษรเว็บในหน้าของคุณจากนั้นด้านล่างเป็นตัวอย่างง่ายๆของวิธีการโหลดแบบอักษร สร้างไฟล์ CSS อย่างง่ายที่จะถูกโหลดโดยโหลดแบบอักษรเว็บ (คุณไม่จำเป็นต้องใส่ไว้ใน HTML ของคุณ):
@ font-face {
// ชื่อนี้คุณจะใช้ใน JS
ตัวอักษรตระกูล: 'Gunplay';
// URL ไปยังไฟล์ฟอนต์สามารถเป็นญาติหรือสัมบูรณ์
SRC: URL (.. / ฟอนต์ / gunplay.ttf ') รูปแบบ (' trueType ');
อักษร - น้ำหนัก: 400;
}
ตอนนี้กำหนดตัวแปรทั่วโลกชื่อ Webfontconfig สิ่งที่ง่ายเหมือนเดิมจะพอเพียง:
var webfontconfig = {
'คลาส': เท็จ
'หมดเวลา': 0,
'ใช้งาน': ฟังก์ชั่น () {
// ตัวอักษรโหลดเรียบร้อยแล้ว ...
},
'กำหนดเอง': {
'ครอบครัว': ['Gunplay']
// URL ไปยัง CSS ที่กล่าวถึงก่อนหน้านี้
'URL': ['สไตล์ / fonts.css']
}
};
อย่าลืมใส่รหัสของคุณในการเรียกกลับ 'แอ็คทีฟ' ที่แสดงด้านบน และนั่นคือมัน!
ตอนนี้เราอยู่ในช่วงกลางของแฟลชของเราในการแปลง JavaScript - ถึงเวลาที่จะดูแล Shaders แล้ว หากต้องการเก็บข้อมูลท้องถิ่นใน ActionScript อย่างต่อเนื่องคุณจะใช้คลาส 'SharedObject' ใน JavaScript การเปลี่ยนที่เรียบง่ายคือ LocalStorage API ซึ่งช่วยให้การจัดเก็บสตริงสำหรับการเรียกคืนในภายหลังการโหลดหน้าเว็บที่รอดชีวิต
ข้อมูลการบันทึกนั้นง่ายมาก:
Var Progress = 15;
localstorage.setItem ('myGame.Progress' ความคืบหน้า);
โปรดทราบว่าในตัวอย่างข้างต้นตัวแปร 'ความคืบหน้า' ซึ่งเป็นตัวเลขจะถูกแปลงเป็นสตริง
การโหลดนั้นง่ายเกินไป แต่จำไว้ว่าค่าที่ดึงมาจะเป็นสตริงหรือเป็นโมฆะหากไม่มีอยู่
ความคืบหน้า var = parseint (localstorage.getitem ('myGame.Progress')) || 0;
ที่นี่เรามั่นใจว่าค่าส่งคืนเป็นตัวเลข หากไม่มีอยู่แล้ว 0 จะถูกกำหนดให้กับตัวแปร 'ความคืบหน้า'
นอกจากนี้คุณยังสามารถเก็บและดึงโครงสร้างที่ซับซ้อนมากขึ้นเช่น JSON:
Var Stats = {'เป้าหมาย': 13, 'ชนะ': 7, 'การสูญเสีย': 3, 'วาด': 1
};
localstorage.setItem ('myGame.stats', json.stringify (stats));
...
var stats = json.psse (localstorage.getitem ('myGame.stats')) || {};
มีบางกรณีเมื่อวัตถุ 'localStorage' ไม่สามารถใช้ได้ ตัวอย่างเช่นเมื่อใช้ไฟล์: // โปรโตคอลหรือเมื่อโหลดหน้าในหน้าต่างส่วนตัว คุณสามารถใช้คำสั่ง 'ลองและจับ' เพื่อให้แน่ใจว่ารหัสของคุณจะทำงานต่อไปและใช้ค่าเริ่มต้นซึ่งแสดงในตัวอย่างด้านล่าง:
ลอง {
Var Progress = localstorage.getitem ('myGame.Progress');
} catch (ข้อยกเว้น) {
// localstorage ไม่พร้อมใช้งานให้ใช้ค่าเริ่มต้น
}
อีกสิ่งหนึ่งที่ต้องจำก็คือข้อมูลที่เก็บไว้จะถูกบันทึกต่อโดเมนไม่ใช่ต่อ URL ดังนั้นหากมีความเสี่ยงที่หลาย ๆ เกมนั้นโฮสต์บนโดเมนเดียวจากนั้นจะดีกว่าที่จะใช้คำนำหน้า (เนมสเปซ) เมื่อบันทึก ในตัวอย่างข้างต้น 'MyGame' เป็นคำนำหน้าและคุณมักจะต้องการแทนที่ด้วยชื่อของเกม
หากเกมของคุณถูกฝังอยู่ใน iFrame แล้ว LocalStorage จะไม่คงอยู่บน iOS ในกรณีนี้คุณจะต้องเก็บข้อมูลในผู้ปกครอง iframe แทน
เมื่อ Phaser และ Pixijs แสดงความชื้นของคุณพวกเขาใช้ Shader ภายในที่เรียบง่าย มันไม่มีคุณสมบัติมากมายเพราะเหมาะสำหรับความเร็ว อย่างไรก็ตามคุณสามารถแทนที่ Shader เพื่อวัตถุประสงค์ของคุณ ตัวอย่างเช่นคุณสามารถใช้ประโยชน์จากการตรวจสอบการถอนเงินหรือสนับสนุนคุณสมบัติเพิ่มเติมสำหรับการเรนเดอร์ ด้านล่างเป็นตัวอย่างของวิธีการจัดหา Fragment SHATMENT ของคุณเองเป็น Phaser V2
ฟังก์ชั่นโหลดล่วงหน้า () {
this.load.shader ('filename.frag', 'shaders / filename.frag');
}
ฟังก์ชั่นสร้าง () {
var renderer = this.renderer;
var batch = renderer.spriteBatch;
batch.defaultshader =
ใหม่ pixi.abstractfilter (this.cache.getshader ('filename.frag'));
batch.setcontext (renderer.gl);
}
Shader เริ่มต้นที่กำหนดเองสามารถใช้เพื่อแทนที่วิธีการย้อมสีเริ่มต้นใน Phaser และ Pixijs ย้อมสีใน Phaser และ Pixijs ทำงานโดยการคูณพิกเซลพื้นผิวด้วยสีที่กำหนด การคูณสีเข้มขึ้นเสมอซึ่งเห็นได้ชัดว่าไม่ใช่ปัญหา; มันแตกต่างจากการย้อมสีแฟลช สำหรับหนึ่งในเกมของเราที่เราต้องการใช้ย้อมสีคล้ายกับ Flash และตัดสินใจว่าสามารถใช้ Shader ที่กำหนดเองได้ ด้านล่างเป็นตัวอย่างของ shader ชิ้นส่วนดังกล่าว:
// ตัวแปรโทนสีที่เฉพาะเจาะจงคล้ายกับการย้อมสีแฟลชที่เพิ่ม
// กับสีและไม่คูณ ลบสี
// จะต้องจัดหาให้กับ Shader นี้เพื่อทำงานอย่างถูกต้อง I.e. ตั้งค่า
// Sprite.tint to 0 เพื่อเปลี่ยนทั้ง Sprite เป็นสีขาว
ความแม่นยำ lowp ลอย;
varying vec2 vtexturecoord;
varying vec4 vcolor;
เครื่องแบบ sampler2d usampler;
โมฆะหลัก (เป็นโมฆะ) {
VEC4 F = Texture2D (usampler, vtexturecoord);
float a = clamp (vcolor.a, 0.00001, 1.0);
gl_fragcolor.rgb = f.rgb * vcolor.a + clamp (1.0 - vcolor.rgb / a, 0.0, 1.0) * vcolor.a * f.a;
gl_fragcolor.a = f.a * vcolor.a;
}
พิกเซล Shader Lightens นี้โดยการเพิ่มสีฐานให้กับสีอ่อน สำหรับการทำงานนี้คุณต้องจัดหาข้อความเชิงลบของสีที่คุณต้องการ ดังนั้นเพื่อให้ได้สีขาวคุณต้องตั้งค่า:
Sprite.tint = 0x000000; // สีนี้สไปรต์เป็นสีขาว
Sprite.tint = 0x00ffff; // นี้ให้สีแดง
การแทนที่ Shader เริ่มต้นสามารถใช้ประโยชน์ได้เพื่อช่วยในการดีบัก ด้านล่างเราได้อธิบายว่าสามารถตรวจจับการฟิกซ์เกินดัชนีได้อย่างไร
การถอนเงินเกิดขึ้นเมื่อพิกเซลจำนวนมากหรือทั้งหมดบนหน้าจอแสดงผลหลายครั้ง ตัวอย่างเช่นวัตถุจำนวนมากที่ใช้สถานที่เดียวกันและถูกแสดงผลอีกครั้ง จำนวนพิกเซลของ GPU สามารถแสดงต่อวินาทีต่อวินาทีได้รับการอธิบายว่าเป็นอัตราการเติม GPU เดสก์ท็อปที่ทันสมัยมีอัตราการเติมมากเกินไปสำหรับวัตถุประสงค์ 2D ปกติ แต่มือถือช้าลงมาก
มีวิธีการง่ายๆในการค้นหาจำนวนเท่าใดแต่ละพิกเซลบนหน้าจอเขียนโดยแทนที่ Shader Fragment Global เริ่มต้นใน Pixijs และ Phaser ด้วยอันนี้:
เป็นโมฆะหลัก (เป็นโมฆะ) {
GL_FRAGCOLOR.RGB + = 1.0 / 7.0;
}
พิกเซล Shader Lightens นี้ที่กำลังประมวลผล หมายเลข 7.0 หมายถึงจำนวนการเขียนที่จำเป็นในการเปลี่ยนพิกเซลสีขาว คุณสามารถปรับหมายเลขนี้ตามที่คุณต้องการ กล่าวอีกนัยหนึ่งพิกเซลที่เบาลงบนหน้าจอถูกเขียนหลายครั้งและพิกเซลสีขาวเขียนอย่างน้อยเจ็ดครั้ง
SHADER นี้ยังช่วยในการค้นหาทั้งวัตถุ 'มองไม่เห็น' ซึ่งด้วยเหตุผลบางอย่างยังคงมีการแสดงผลและสไปรต์ที่มีพื้นที่โปร่งใสมากเกินไปที่ต้องถอดออก (GPU ยังคงต้องดำเนินการพิกเซลโปร่งใสในพื้นผิวของคุณ)
เครื่องยนต์ฟิสิกส์เป็นมิดเดิลแวร์ที่รับผิดชอบในการจำลองร่างกายฟิสิกส์ (โดยปกติจะมีพลวัตของร่างกายที่เข้มงวด) และการชนของพวกเขา เครื่องยนต์ฟิสิกส์จำลองพื้นที่ 2D หรือ 3D แต่ไม่ใช่ทั้งคู่ เครื่องยนต์ฟิสิกส์ทั่วไปจะให้:
มีปลั๊กอิน Phaser ที่ทำงานได้ดีสำหรับจุดประสงค์นี้ Box2D ยังใช้ในเครื่องยนต์เกม Unity และ GameMaker Studio 2
ในขณะที่เครื่องยนต์ฟิสิกส์จะเพิ่มความเร็วในการพัฒนาของคุณมีราคาที่คุณต้องจ่าย: ลดประสิทธิภาพรันไทม์ การตรวจจับการชนและการคำนวณการคำนวณเป็นงานที่ใช้งาน CPU คุณอาจถูก จำกัด เฉพาะวัตถุแบบไดนามิกหลายโหลในฉากบนโทรศัพท์มือถือหรือใบหน้าประสิทธิภาพที่เสื่อมโทรมรวมถึงอัตราเฟรมลดลงต่ำกว่า 60 FPS
หากคุณมีเอฟเฟกต์เสียงเกมแฟลชภายในไฟล์. FLA จากนั้นส่งออกจาก GUI เป็นไปไม่ได้ (อย่างน้อยไม่ได้อยู่ใน Adobe Animate CC 2017) เนื่องจากการขาดตัวเลือกเมนูที่ให้บริการนี้ แต่มีอีกวิธีหนึ่ง - สคริปต์เฉพาะที่ทำเช่นนั้น:
ฟังก์ชั่น normalizefilename (ชื่อ) {
// แปลงชื่อ Camelcase เป็นชื่อ Snake_case
return name.replace (/ (a-z]) / g, '_ $ 1') แทนที่ (/ ^ _ /, '') .Tolowercase ();
}
ฟังก์ชั่น DisplayPath (เส้นทาง) {
// ทำให้เส้นทางไฟล์อ่านได้มากขึ้น
ส่งคืน Unescape (เส้นทาง) .replace ('ไฟล์: ///', '') .replace ('|', ':');
}
fl.outputpanel.clear ();
ถ้า (fl.getdocumentdom () library.getselectedItems () ความยาว & gt; 0)
// รับเฉพาะรายการที่เลือกเท่านั้น
var library = fl.getdocumentdom () library.getSelectedItems ();
อื่น
// รับรายการทั้งหมด
var library = fl.getdocumentdom () library.iteems;
// ขอให้ผู้ใช้สำหรับไดเร็กทอรีปลายทางการส่งออก
var root = fl.browereforfolderurl (เลือกโฟลเดอร์ ');
ข้อผิดพลาด var = 0;
สำหรับ (var i = 0; i & lt; library.length; i ++) {
var item = library [i];
ถ้า (item.itemtype! == 'เสียง')
ดำเนินการต่อ;
var path = root + '/';
ถ้า (item.originalcompressiontype === 'ดิบ')
พา ธ + = normalizefilename (item.name.split ('.') ) + '.wav';
อื่น
path + = normalizefilename (item.name);
ความสำเร็จของ var = item.exporttofile (เส้นทาง);
ถ้า (! สำเร็จ)
ข้อผิดพลาด + = 1;
fl.trace (DisplayPath (เส้นทาง) + ':' + (ความสำเร็จ? 'ตกลง': 'ข้อผิดพลาด'));
}
ข้อผิดพลาด fl.trace (ข้อผิดพลาด + '');
วิธีการใช้สคริปต์เพื่อส่งออกไฟล์เสียง:
มันจบแล้ว! ตอนนี้คุณควรมีไฟล์ WAV ในไดเรกทอรีที่ระบุ สิ่งที่เหลือให้ทำคือแปลงพวกเขาเป็นเช่น, mp3, ogg หรือ aac (หากคุณมีไฟล์เกมเพื่อให้ปลอดภัยอัพเกรดเป็นที่เหมาะสม การจัดเก็บเมฆ .)
รูปแบบ MP3 เก่าที่ดีกลับมาแล้วเนื่องจากสิทธิบัตรบางรายหมดอายุและตอนนี้ทุกเบราว์เซอร์สามารถถอดรหัสและเล่น MP3 สิ่งนี้ทำให้การพัฒนาง่ายขึ้นเล็กน้อยเนื่องจากในที่สุดก็ไม่จำเป็นต้องเตรียมสองรูปแบบเสียงแยกต่างหาก ก่อนหน้านี้ที่คุณต้องการเช่นไฟล์ OGG และ AAC ขณะนี้ MP3 จะพอเพียง
อย่างไรก็ตามมีสองสิ่งสำคัญที่คุณต้องจดจำเกี่ยวกับ MP3:
บทความนี้ได้รับการตีพิมพ์ครั้งแรกในฉบับที่ 277 ของนักออกแบบเว็บไซต์ Web Design Creative Web Design ซื้อปัญหา 277 ที่นี่ หรือ สมัครสมาชิกกับนักออกแบบเว็บไซต์ที่นี่ .
บทความที่เกี่ยวข้อง:
ในการสอนการวาดรูปนี้เราจะมุ่งเน้นไปที่ลำตัว..
Affinity Designer เป็นชุดเครื่องมือแก้ไขเวกเตอร์สำหรับ Ma..
เมื่อใดก็ตามที่เราพูดถึงการสร้างเว็บไซต์ที่..
นักออกแบบและโฆษณาจากทุกฟิลด์เป็นเหมือน Magpies ใน..