èåŸã«ã¯ãã©ãŠã¶ããŒã¹ã®2Dããã²ãŒã ããããããããŸããããã®ãããªãããžã§ã¯ãã¯åããŠã§ããgamedevã§ã¯ããŸã ééããŠããªãåé¡ã解決ããããšã¯ãéåžžã«ãšããµã€ãã£ã³ã°ã§èå³æ·±ããã®ã«ãªãå¯èœæ§ããããŸããäž»ãªç®çã¯ã欲æãšã¢ãããŒã·ã§ã³ããããªãããéšåã®ç åã«è¡ãè©°ãŸããå®éã«ã²ãŒã ãå§ããããšã§ã¯ãªãã®ã§ãæéãç¡é§ã«ããã«éçºãå§ããŸãããïŒ
äžèšã§èšãã°ãã²ãŒã
çŸåšããµãã€ãã«ãã¡ã€ããå¯äžã®ã²ãŒã ã¢ãŒãã§ãã埩掻ããã«2é»ãã6é»ã®æŠéã§ãæåŸã«çãæ®ã£ããã¬ã€ã€ãŒãåè ãšèŠãªãããx3ãã€ã³ããšãŽãŒã«ããåãåããŸãã
ã¢ãŒã±ãŒãã³ã³ãããŒã«ïŒãã¿ã³WãAãDãŸãã¯ç§»åããç¢å°ãæµã®è¹ã«çºç ²ããã¹ããŒã¹ããŒãçãå¿ èŠã¯ãããŸãããèŠéãããšã¯ã§ããŸããããã¡ãŒãžã¯ã©ã³ãã æ§ãšã·ã§ããã®è§åºŠã«äŸåããŸãã倧ããªãã¡ãŒãžã«ã¯ããç®æšéãã®ãã¡ãã«ãä»éããŸãã24æéãš7æ¥éïŒã¢ã¹ã¯ã¯æé00:00ã«ãªã»ããïŒã§ãã¬ã€ã€ãŒã®è©äŸ¡ã§1äœã«ãªããæ¯æ¥ã®ã¿ã¹ã¯ïŒ3ã€ã®ãã¡ã®1ã€ãé çªã«çºè¡ãããïŒãå®äº
ããããšã§ããŽãŒã«ããç²åŸããŸããæŠéçšã®éããããŸãããå°ãªãã§ãã
éã䜿ãè¹ã«é»ãåžã24æéèšçœ®ããŸãã巚倧ãªè§Šæã§æµã®è¹åºãéã¶ã¯ã©ãŒã±ã³ãèµ·ããèœåãè¿œå ããèšç»:)
PVPã
æè¡ã¹ã¿ãã¯
Three.jsã¯ããã©ãŠã¶ã§3Dãæäœããããã®æã人æ°ã®ããã©ã€ãã©ãªã®1ã€ã§ãããåªããããã¥ã¡ã³ããšããŸããŸãªäŸãå«ãŸããŠããŸãããŸããç§ã¯ä»¥åã«Three.jsã䜿çšããŸãã-éžæã¯æçœã§ãã
ã²ãŒã ãšã³ãžã³ãäžè¶³ããŠããã®ã¯ãé¢é£ããçµéšããªããäœããåŠç¿ãããã®ã§ããããšã«ãããã¹ãŠãããŸãæ©èœãããšãã欲æ±ãåå ã§ã
ãNode.jsã¯ã·ã³ãã«ã§ãé«éã§ã䟿å©ã§ããç§ã¯Javaã代æ¿ãšèŠãªããWebãœã±ãããå«ãããã€ãã®ããŒã«ã«å®éšãè¡ããŸããããVPSã§Javaãå®è¡ããã®ãé£ãããã©ããããããŠèŠã€ããããšã¯ããŸããã§ãããå¥ã®ãªãã·ã§ã³-Goããã®æ§æã¯ç§ãèœèãããŸã-ãã®ç 究ã§ã¯1ã€ã®ã€ãªã¿ãé²ãã§ããŸããã
Webãœã±ããã®å ŽåãNode.jsã®wsã¢ãžã¥ãŒã«ã䜿çšããŸãã
PHPãšMySQLããŸãæçœã§ã¯ãããŸããããåºæºã¯åãã§ã-ãããã®ãã¯ãããžãŒã®çµéšããããããè¿ éãã€ç°¡åã«ã
ããã¯æ¬¡ã®ããã«ãªã
ãŸãããŸãWebããŒãžãã¯ã©ã€ã¢ã³ãã«è¿ããããããã³ãŸããªAJAXèŠæ±ã®ããã«PHPãå¿ èŠã§ãããã»ãšãã©ã®å Žåãã¯ã©ã€ã¢ã³ãã¯åŒãç¶ãWebãœã±ãããä»ããŠNode.jsäžã®ã²ãŒã ãµãŒããŒãšéä¿¡ããŸãã
ã²ãŒã ãµãŒããŒãããŒã¿ããŒã¹ã«ãªã³ã¯ããããªãã£ãã®ã§ããã¹ãŠãPHPãçµç±ããŸããç§ã®æèŠã§ã¯ãããã«ã¯ãã©ã¹ããããŸãããããããéèŠãã©ããã¯ããããŸãããããšãã°ãå¿ èŠãªãã©ãŒã ã®æ¢è£œã®ããŒã¿ãNode.jsã«éããããããNode.jsã¯ããŒã¿ããŒã¹ã§ã®åŠçãè¿œå ã®ã¯ãšãªã«æéãè²»ããããšãªããããéèŠãªããšã«å¯ŸåŠããŸãããã¬ã€ã€ãŒã®ã¢ã¯ã·ã§ã³ãããã€ãžã§ã¹ããããéšå±ã®ã²ãŒã äžçã®ç¶æ ãå€æŽããŸãã
æåã®ã¢ãã«
éçºã¯ã·ã³ãã«ã§æãéèŠãªããšããå§ãŸããŸããããµãŒããŒã®èŠ³ç¹ããæµ·æŠã説æããã²ãŒã äžçã®ç¹å®ã®ã¢ãã«ã§ãããã¬ãŒã³ãã£ã³ãã¹2Dã¯ãã¢ãã«ãç»é¢ã«è¡šç€ºããã®ã«çæ³çã§ãã
æåã«ãç§ã¯éåžžã®ãããŒã¬ãããç©çåŠãèšå®ããè¹äœã®æ¹åã«å¯ŸããŠç°ãªãæ¹åãžã®è¹ã®åãã«å¯Ÿããç°ãªãæµæãèæ ®ããŸããããããããµãŒããŒã®ããã©ãŒãã³ã¹ãå¿é ããŠãç§ã¯éåžžã®ç©çãæãåçŽãªç©çã«çœ®ãæããŸãããè¹ã®èŒªéã¯èŠèŠçã«ã®ã¿æ®ã£ãŠããŸãããç©ççã«ã¯è¹ã¯æ £æ§ããæããªãäžžããªããžã§ã¯ãã§ããæ £æ§ã®ä»£ããã«ãå¶éãããåæ¹å éããããŸãã
ã·ã§ãããšãããã¯ãè¹ã®æ¹åãšã·ã§ããã®æ¹åã®ãã¯ãã«ã䜿çšããåçŽãªæäœã«éå®ãããŸããããã«ã·ã§ã«ã¯ãããŸãããæ£èŠåããããã¯ãã«ã®å ç©ãã¿ãŒã²ãããŸã§ã®è·é¢ãèæ ®ããŠèš±å®¹å€ã«åãŸãå Žåããã¬ãŒã€ãŒããã¿ã³ãæŒããå Žåã«ã·ã§ãããšããããçºçããŸãã
ã²ãŒã ã®äžçã¢ãã«ãã¬ã³ããªã³ã°ããè¹ãã·ã§ããã®åããåŠçããããã®ã¯ã©ã€ã¢ã³ãåŽã®JavaScriptã§ãããNode.jsãµãŒããŒã«ã»ãšãã©å€æŽããã«ç§»æ€ããŸããã
ã²ãŒã ãµãŒããŒ
Node.js WebSocketãµãŒããŒã¯ã3ã€ã®ã¹ã¯ãªããã®ã¿ã§æ§æãããŠããŸãã
- main.js-ãã¬ãŒã€ãŒããWSã¡ãã»ãŒãžãåä¿¡ããéšå±ãäœæãããã®ãã·ã³ã®ã®ã¢ãå転ãããã¡ã€ã³ã¹ã¯ãªãã
- room.js-ã«ãŒã å ã®ã²ãŒã ãã¬ã€ãæ åœããã¹ã¯ãªããïŒã²ãŒã ã¯ãŒã«ãã®æŽæ°ãã«ãŒã å ã®ãã¬ãŒã€ãŒãžã®æŽæ°ã®éä¿¡
- funcs.js-ãã¯ã¿ãŒãæäœããããã®ã¯ã©ã¹ãããã€ãã®ãã«ããŒé¢æ°ãããã³äºéã«ãªã³ã¯ããããªã¹ããå®è£ ããã¯ã©ã¹ãå«ãŸããŸã
éçºãé²ãã«ã€ããŠãæ°ããã¯ã©ã¹ãè¿œå ãããŸããããããã®ã»ãšãã©ãã¹ãŠãã²ãŒã ãã¬ã€ã«çŽæ¥é¢é£ããroom.jsãã¡ã€ã«ã«ãªã£ãŠããŸããã¯ã©ã¹ãåå¥ã«ïŒåå¥ã®ãã¡ã€ã«ã§ïŒåŠçããã®ã䟿å©ãªå ŽåããããŸãããã¯ã©ã¹ãå€ãããªãéãïŒãªãŒã«ã€ã³ã¯ã³ãªãã·ã§ã³ãæªããããŸããïŒïŒäžã«ã¹ã¯ããŒã«ããŠãå¥ã®ã¯ã©ã¹ã®ã¡ãœãããåãå ¥ãããã©ã¡ãŒã¿ãŒãèŠããŠãããšäŸ¿å©ã§ãïŒã
ã²ãŒã ãµãŒããŒã¯ã©ã¹ã®çŸåšã®ãªã¹ãïŒ
- WaitRoom-ãã¬ã€ã€ãŒãæŠéã®éå§ãåŸ æ©ããŠããéšå±ãæŽæ°ãéä¿¡ããåå以äžã®ãã¬ã€ã€ãŒãæŠéã®æºåãã§ãããšãã²ãŒã ã«ãŒã ã®äœæãéå§ããç¬èªã®ãã£ãã¯ã¡ãœããããããŸãã
- Room â , : /, ,
- Player â «» :
- Ship â : , , ,
- PhysicsEngine â ,
- PhysicsBody â
Room
let upd = {p: [], t: this.gamet};
let t = Date.now();
let dt = t - this.lt;
let nalive = 0;
for (let i in this.players) {
this.players[i].tick(t, dt);
}
this.physics.run(dt);
for (let i in this.players) {
upd.p.push(this.players[i].getUpd());
}
this.chronology.addLast(clone(upd));
if (this.chronology.n > 30) this.chronology.remFirst();
let updjson = JSON.stringify(upd);
for (let i in this.players) {
let pl = this.players[i];
if (pl.ship.health > 0) nalive++;
if (pl.deadLeave) continue;
pl.cl.ws.send(updjson);
}
this.lt = t;
this.gamet += dt;
if (nalive <= 1) return false;
return true;
ã¯ã©ã¹ã®ä»ã«ããŠãŒã¶ãŒããŒã¿ã®ååŸãæ¯æ¥ã®ã¿ã¹ã¯ã®æŽæ°ãå ±é ¬ã®ååŸãã¹ãã³ã®è³Œå ¥ãªã©ã®æ©èœããããŸãããããã®é¢æ°ã¯åºæ¬çã«httpsãªã¯ãšã¹ããPHPã«éä¿¡ããPHPã¯1ã€ä»¥äžã®MySQLã¯ãšãªãå®è¡ããŠçµæãè¿ããŸãã
ãããã¯ãŒã¯ã®é 延
ãããã¯ãŒã¯é 延ã®è£åã¯ããªã³ã©ã€ã³ã²ãŒã éçºã®éèŠãªéšåã§ãããã®ãããã¯ã«ã€ããŠãç§ã¯ããHabréã«é¢ããäžé£ã®èšäºãç¹°ãè¿ãèªã¿ãŸãããåžè¹ã®æŠãã®å Žåãé 延è£åã¯ç°¡åã§ããã劥åããå¿ èŠããããŸãã
è£éã¯åžžã«ã¯ã©ã€ã¢ã³ãã§å®è¡ãããŸã-ããŒã¿ãæ¢ã«ååŸãããŠãã2ã€ã®ç¬éã®éã®ã²ãŒã äžçã®ç¶æ ã®èšç®ãããããªæéã®äœè£ããããããçªç¶ã®ãžã£ã³ãã®å¯èœæ§ãäœããªãããããã¯ãŒã¯ã®å€§å¹ ãªé 延ãšæ°ããããŒã¿ã®æ¬ åŠã«ãããè£éã¯å€æ¿ã«çœ®ãæããããŸããå€æ¿ã¯ããŸãæ£ç¢ºãªçµæã«ã¯ãªããŸããããããã»ããµã«ãšã£ãŠã¯å®äŸ¡ã§ãããè¹ã®åãããµãŒããŒã§ã©ã®ããã«å®è£ ãããŠãããã«äŸåããŸããããã¡ãããç¶æ³ãæãããšãã§ããŸãã
ã©ã°ã®åé¡ã解決ããå Žåãã²ãŒã ãšãã®ããŒã¹ã«å€§ããäŸåããŸããã¹ã ãŒãºãªã¢ãã¡ãŒã·ã§ã³ãšç¹å®ã®æç¹ã§ã®ã²ãŒã ã®äžçã®ç¶æ ãžã®ç»åã®æ£ç¢ºãªå¯Ÿå¿ãåªå ããŠããã¬ã€ã€ãŒã®ã¢ã¯ã·ã§ã³ã«å¯Ÿããè¿ éãªå¿çãç ç²ã«ããŸããå¯äžã®äŸå€ã¯ããã¿ã³ãæŒããšããã«å€§ç ²ã®æå°ãè¡ãããããšã§ããæ®ãã¯å®å®ã®æ³åãšè¹ã®ä¹çµå¡ããã®ã©ã é ã®äœå°ã«ãããã®ã§ã:)
ããã³ããšã³ã
æ®å¿µãªãããã¯ã©ã¹ãã¡ãœããã®æ確ãªæ§é ãéå±€ã¯ãããŸããããã¹ãŠã®JSã¯ãããæå³ã§åçã®ç¬èªã®æ©èœãæã€ãªããžã§ã¯ãã«åå²ãããŸããç§ã®ä»¥åã®ãããžã§ã¯ãã®ã»ãšãã©ãã¹ãŠã¯ããããè«ççã§ãããããã¯ãæåã®ç®æšããã²ãŒã ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšèŠèŠçã³ã³ããŒãã³ãã«æ³šæãæãããšãªãããµãŒããŒãšãããã¯ãŒã¯ã®çžäºäœçšã§ã²ãŒã ã®äžçã¢ãã«ããããã°ããããšã§ãã£ãããã§ããããŸãã3Dãè¿œå ãããšãã«ãæåéãæ¢åã®ãã¹ãããŒãžã§ã³ã«è¿œå ããŸããã倧ãŸãã«èšãã°ã2Dã®drawShipé¢æ°ããŸã£ããåã3Dã«çœ®ãæããŸããããå奜çãªæ¹æ³ã§æ§é å šäœãä¿®æ£ããå°æ¥ã®å€æŽã®åºç€ãæºåãã䟡å€ã¯ãããŸããã
3Dè¹
Three.jsã¯ãããŸããŸãªåœ¢åŒã®æ¢è£œã®3Dã¢ãã«ã®äœ¿çšããµããŒãããŠããŸãããã¯ã¹ãã£ãšã¢ãã¡ãŒã·ã§ã³ãåã蟌ããGLTF / GLB圢åŒãèªåã§éžæããŸãããéçºè ã¯ããã¹ãŠã®ãã¯ã¹ãã£ãããŒããããŠãããããšçåã«æããªãã§ãã ããã
ãããŸã§3Dãšãã£ã¿ãæ±ã£ãããšã¯ãããŸãããè«ççãªã¹ãããã¯ãå€§ç ²ã®æå°ã®ã¢ãã¡ãŒã·ã§ã³ãåã蟌ãŸããåžè¹ã®3Dã¢ãã«ãäœæããã¿ã¹ã¯ãšã®ããªãŒã©ã³ã¹äº€æã®å°é家ã«é£çµ¡ããããšã§ãããããããèªåã§å®æããã¹ãã·ã£ãªã¹ãã¢ãã«ã®å°ããªå€æŽã«æµæããããšã¯ã§ãããBlenderã§ã¢ãã«ããŒãããäœæããããšã«ãªããŸããããã¯ã¹ãã£ãã»ãšãã©ãªãäœããªãŽã³ã¢ãã«ãäœæããã®ã¯ç°¡åã§ãå°é家ã®æ¢è£œã®ã¢ãã«ããªããã°ãç¹å®ã®ã¿ã¹ã¯ã«å¿ èŠãªãã®ïŒå°ãªããšãé埳çã«:)ã3Dãšãã£ã¿ãŒã§èª¿ã¹ãããšã¯å°é£ã§ãã
ã·ã§ãŒããŒã®ç¥ãžã®ã·ã§ãŒããŒ
ã·ã§ãŒããŒãå¿ èŠãªäž»ãªçç±ã¯ãã¬ã³ããªã³ã°äžã«ãããªã«ãŒãäžã®ãªããžã§ã¯ãã®ãžãªã¡ããªãæäœã§ããããšã§ããããã«ãããããã©ãŒãã³ã¹ãåäžããŸããThree.jsã§ã¯ãç¬èªã®ã·ã§ãŒããŒãäœæã§ããã ãã§ãªããããã€ãã®äœæ¥ãè¡ãããšãã§ããŸãã
è¹ãåçæ°Žé¢ããŸãã¯éçæµ·åºãžã®ãã¡ãŒãžãã¢ãã¡ãŒã·ã§ã³åããããã®ããŒãã£ã¯ã«ã·ã¹ãã ãäœæãããšãã«äœ¿çšããã¡ã«ããºã ãŸãã¯æ¹æ³ã¯åãã§ããç¹å¥ãªShaderMaterialã¯ããã®ã·ã§ãŒããŒïŒãã®GLSLã³ãŒãïŒã䜿çšããããã®ç°¡ç¥åãããã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããBufferGeometryã䜿çšãããšãä»»æã®ããŒã¿ãããžãªã¡ããªãäœæã§ããŸã...
空ã®ç©ºçœãåããããªæ¹æ³ã§3Dãªããžã§ã¯ããäœæãã³ããŒãè£è¶³ãå€æŽããã®ã«äŸ¿å©ãªã³ãŒãæ§é ïŒ
ã³ãŒãã衚瀺
let vs = `
attribute vec4 color;
varying vec4 vColor;
void main(){
vColor = color;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
// gl_PointSize = 5.0; // for particles
}
`;
let fs = `
uniform float opacity;
varying vec4 vColor;
void main() {
gl_FragColor = vec4(vColor.xyz, vColor.w * opacity);
}
`;
let material = new THREE.ShaderMaterial( {
uniforms: {
opacity: {value: 0.5}
},
vertexShader: vs,
fragmentShader: fs,
transparent: true
});
let geometry = new THREE.BufferGeometry();
//let indices = [];
let vertices = [];
let colors = [];
/* ... */
//geometry.setIndex( indices );
geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );
geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 4 ) );
let mesh = new THREE.Mesh(geometry, material);
è¹ã®æå·
è¹ã®æå·ã®ã¢ãã¡ãŒã·ã§ã³ã¯ããµã€ãºãšè²ãå€åãã移åããç²åã§ããããã®åäœã¯å±æ§ãšGLSLã·ã§ãŒããŒã³ãŒãã«ãã£ãŠæ±ºãŸããŸããããŒãã£ã¯ã«ïŒãžãªã¡ããªãšãããªã¢ã«ïŒã®çæã¯äºåã«çºçããŸãããã®åŸãåè¹ããšã«æå·ããŒãã£ã¯ã«ã®ç¬èªã®ã€ã³ã¹ã¿ã³ã¹ïŒã¡ãã·ã¥ïŒãäœæãããŸãïŒãžãªã¡ããªã¯ãã¹ãŠã«å ±éã§ããããããªã¢ã«ãè€è£œãããŸãïŒãããªãã®æ°ã®ããŒãã£ã¯ã«å±æ§ããããŸãããäœæãããã·ã§ãŒããŒã¯ããã£ãããšç§»åãã倧ããªãã¹ãã¯ã©ãŠããæ¥éã«é£æ£ãããããªãããã³ç«ã®ããŒãã£ã¯ã«ãåæã«å®è£ ããŸãããããã®ã¢ã¯ãã£ããã£ã¯ãè¹ãžã®æå·ã®åºŠåãã«ãã£ãŠç°ãªããŸãã
æµ·
æµ·ãShaderMaterialã䜿çšããŠå®è£ ãããŸããåé ç¹ã¯æ£åŒŠæ³¢ã«æ²¿ã£ãŠ3æ¹åãã¹ãŠã«ç§»åããã©ã³ãã ãªæ³¢ã圢æããŸããå±æ§ã¯ãéåã®åæ¹åã®æ¯å¹ ãšæ£åŒŠæ³¢ã®äœçžãå®çŸ©ããŸãã
æ°Žã®è²ãå€æ§åããã²ãŒã ãããé¢çœã楜ãããã®ã«ããããã«ãåºãšå³¶ãè¿œå ããããšã«ããŸãããäžéšã®è²ã¯ãé«ã/æ·±ãã«äŸåããæ°Žé¢ãç §ãããæãé åãšæããé åãäœæããŸãã
æµ·åºã¯2段éã§äœæãããé«ããããããäœæãããŸããæåã«ã島ã®ãªãåºãã°ã©ãã£ã«ã«ãšãã£ã¿ãŒã§äœæããïŒç§ã®å ŽåãããŒã«ã¯ã¬ã³ããªã³ã°->é²ãšã¬ãŠã¹ãŒããïŒã次ã«å³¶ã¯jsFiddleã§Canvas JSãªã³ã©ã€ã³ã䜿çšããŠã©ã³ãã ãªé åºã§è¿œå ãããŸããåãæããŠãŒãããŸããããã€ãã®å³¶ã¯äœãã§ããããããéããŠããªãã¯æµãæã€ããšãã§ããŸããä»ã¯äžå®ã®é«ããæã£ãŠããŸããã·ã§ããã¯ããããééããŸãããé«ããããèªäœã«å ããŠãåºåã§ã¯ããµãŒããŒäžã®ç©çã®ã¢ã€ã©ã³ãïŒäœçœ®ãšãµã€ãºïŒã«é¢ããjson圢åŒã®ããŒã¿ãåãåããŸãã
次ã¯äœã§ããïŒ
ã²ãŒã ã®éçºã«ã¯å€ãã®èšç»ããããŸããäž»ãªãã®ã¯æ°ããã²ãŒã ã¢ãŒãã§ããå°ãããã®-WebGLãšJSã®ããã©ãŒãã³ã¹å¶éãèæ ®ããŠãæ°Žã®åœ±/åå°ãèãåºããŸããç§ã¯ãã§ã«ã¯ã©ãŒã±ã³ãç®èŠããããæ©äŒã«ã€ããŠè¿°ã¹ãŸãã:)圌ãã®èç©ãããçµéšã«åºã¥ãéšå±ãžã®ãã¬ãŒã€ãŒã®çµ±åã¯ãŸã å®è£ ãããŠããŸãããæãããªããããããã»ã©é«ããªãåªå é äœã®æ¹åã¯ãæµ·åºãšå³¶ã®ããã€ãã®ããããäœæããŠãæ°ããæŠãã®ããã«ãããã®1ã€ãã©ã³ãã ã«éžæããããšã§ãã
ã·ãŒã³ããã¡ã¢ãªã«ãç¹°ãè¿ãæç»ãããã¹ãŠã®ããŒã¿ã1ã€ã®ç»åã«çµåããããšã§å€ãã®èŠèŠå¹æãäœæã§ããŸãïŒå®éãåŸåŠçãšåŒã¶ããšãã§ããŸãïŒããã¯ã©ã€ã¢ã³ãããŸã ãã©ãŠã¶ã§ããããããã®æ¹æ³ã§ã¯ã¯ã©ã€ã¢ã³ãã®è² è·ãå¢å ããããšã¯ãããŸããããã€ãã£ãã¢ããªã§ã¯ãªãããã¶ããããæ¥ãç§ã¯ãã®ã¹ãããã決å®ããŸãã
ãŸããç§ãçããã®ãé£ãããšæã質åããããŸããå®äŸ¡ãªä»®æ³ãµãŒããŒã«äœäººã®ãªã³ã©ã€ã³ãã¬ãŒã€ãŒãèããããšãã§ããããå°ãªããšãç¹å®ã®æ°ã®é¢å¿ã®ãããã¬ãŒã€ãŒãåéããããšãå¯èœãã©ãããããã³ãã®æ¹æ³ã§ãã
ã€ãŒã¹ã¿ãŒãšãã°
ããã»ã©å€ãã®ææ ãäžããå€ãã³ã³ãã¥ãŒã¿ã²ãŒã ãèŠããããªã人ã¯ããŸããïŒä»ãŸã§äœåºŠãäœåºŠãäœåºŠãã²ãŒã Corsairs 2ïŒå¥åSea Dogs 2ïŒãåçããã®ã倧奜ãã§ããç§ã¯ã²ãŒã ã«ç§å¯ãè¿œå ããããåŸãããã³ã«ã»ã¢2ããæ瀺çãã€éæ¥çã«é£æ³ãããŸãããã¹ãŠã®ã«ãŒããæããã«ããããã§ã¯ãããŸãããããã³ããäžããŸããç§ã®ã€ãŒã¹ã¿ãŒãšãã°ã¯ãæµ·ãæ¢çŽ¢ããŠãããšãã«èŠã€ããããšãã§ããç¹å®ã®ãªããžã§ã¯ãã§ãïŒç¡éã®æµ·ãã¯ããã«è¶ããŠèªè¡ããå¿ èŠã¯ãããŸããããªããžã§ã¯ãã¯åŠ¥åœãªç¯å²å ã§ãããèŠã€ãã確çã¯é«ããããŸããïŒãã€ãŒã¹ã¿ãŒãšãã°ã¯æå·ããè¹ãå®å šã«ä¿®åŸ©ããŸãã
ã©ããã
ãããããããªïŒ2å°ã®ããã€ã¹ãããã¹ãïŒïŒ
ã²ãŒã ãžã®ãªã³ã¯ïŒhttps : //sailfire.pw
ãåãåãããã©ãŒã ããããã¡ãã»ãŒãžã¯é»å ±ã§ç§ã«éä¿¡ãããŸãïŒhttps :
//sailfire.pw/feedback/ãã¥ãŒã¹ãã¢ããããŒãã«é ããªãããã«ããã人ãžã®ãªã³ã¯ïŒVK Publicãé»å ±ãã£ãã«