おまたせ!ゲレゲレだよ!
すんません!金曜から諸事情により更新できませんでしたー!
今日からまたがんばる!
さて、それでは行ってみましょう!
吉里吉里でオンライン対戦マリオブラザーズを作ろう!
第7回です!
ということで、前回に引き続きクラス設計なんですが。
とりあえず前回の図に従って今までのコードをクラス化してみましょう。
基本的には、
・機能単位でまとめてクラスにする
・似た機能は共通機能を基本クラスにして、拡張版は継承を使う
・大きく分けるとオブジェクトとオブジェクト管理クラス、ウィンドウクラス
で、大体こんな感じになりますかねー。
**********************************************************************
//メインウィンドウクラス
class MainWindow extends Window
{
var primlayer;
var timer;
var objectManager;
function MainWindow()
{
super.Window();
// 下敷き(プライマリレイヤ)
add(primlayer = new Layer(this, null));
primlayer.left = primlayer.top = 0;
//ウィンドウのサイズを設定(800x600pix)
primlayer.imageWidth = 800;
primlayer.imageHeight = 600;
primlayer.setSizeToImageSize();
setInnerSize(primlayer.width, primlayer.height);
Plugins.link("wuvorbis.dll");//ogg再生用プラグイン読み込み→吉里吉里では必要、syntheでは不要
//オブジェクトマネージャーをインスタンス化
objectManager = new ObjectManager(this, primlayer);
//60FPS相当のスパンで登録されているオブジェクトの状態更新処理を行う
timer = new Timer(objectManager, "update");
timer.interval = 16;//約60fps
timer.enabled = true;
//ウィンドウ表示
visible = true;
}
}
class ObjectManager
{
var objects = new Array();
var win = null;
var par = null;
function ObjectManager(window, parent)
{
//ここで最初に必要なものを設定&登録
//背景
//点数とか
//プレイヤーキャラクタ
add(new player(window,parent,"test2.png",100,570,50,30,0,0,50,30,100,0,0,1));
//敵キャラ
//地面
//障害物
}
function add(obj)
{
//オブジェクトの登録
objects.add(obj);
}
function update()
{
for(var i=0; i< objects.count; i++){
objects[i].update();
}
}
}
class Object
{
var imageLayer;
var win;
var par;
var x;
var y;
var w;
var h;
var uvx;
var uvy;
var uvw;
var uvh;
var abs;
function Object(window, parent, imgfile, _x, _y, _w, _h, _uvx, _uvy, _uvw, _uvh, _abs)
{
win = window;
par = parent;
x = _x;
y = _y;
w = _w;
h = _h;
uvx = _uvx;
uvy = _uvy;
uvw = _uvw;
uvh = _uvh;
abs = _abs;
imageLayer = new Layer(win, par);
imageLayer.loadImages(imgfile);
imageLayer.setPos(x, y);
imageLayer.setSize(w, h);
imageLayer.imageLeft = uvx;
imageLayer.imageTop = uvy;
imageLayer.visible = false;
imageLayer.absolute = abs;
}
function show(){
imageLayer.visible = true;
}
function hide(){
imageLayer.visible = false;
}
function update()
{
}
}
class character extends Object
{
var dir;
var status;
var life;
var imageCounter;
var speed;
var ay;
function character(window, parent, imgfile, _x, _y, _w, _h, _uvx, _uvy, _uvw, _uvh, _abs, _dir, _status, _life, _imageCounter)
{
dir = _dir; //キャラクターの向き 0:→ 1:←
status = _status; //キャラクター状態 0:通常
life = _life; //キャラクター生命値
speed = 4; //キャラクターの横方向への移動速度
ay = 0; //キャラクターの縦方向への移動速度
imageCounter = _imageCounter; //アニメーションのコマ数
super.Object(window, parent, imgfile, _x, _y, _w, _h, _uvx, _uvy, _uvw, _uvh, _abs);
}
}
class player extends character
{
var jump;
function player(window, parent, imgfile, _x, _y, _w, _h, _uvx, _uvy, _uvw, _uvh, _abs, _dir, _status, _life)
{
jump = 0;
super.character(window, parent, imgfile, _x, _y, _w, _h, _uvx, _uvy, _uvw, _uvh, _abs, _dir, _status, _life);
show();
}
function update()
{
//キーボードで入力されたキーを取得して画像の位置を移動
//←キーが押されてたら
if(System.getKeyState(VK_LEFT)){
//キャラがウィンドウの左端を超えてなければ右に移動
if(x > 0){
x -= speed;
}
//超えてたらそのまま
else{
x = 0;
}
}
//→キーが押されてたら
else if(System.getKeyState(VK_RIGHT)){
//キャラがウィンドウの右端を超えてなければ左に移動
if(x < (win.primlayer.imageWidth - imageLayer.width)){
x += speed;
}
//超えてたらそのまま
else{
x = win.primlayer.imageWidth - imageLayer.width;
}
}
//spaceキーが押されたら
if(System.getKeyState(VK_SPACE)){
//ジャンプ中でなければ
if(jump!=1){
jump = 1;
ay += 30;
}
}
//ジャンプ中
if(jump == 1){
//上昇中
if(ay > 0){
y = y - ay;
ay -= 2;
}
//下降中
else{
//着地前
if(y < 570){
y = y - ay;
ay -= 2;
}
//着地
else{
ay = 0;
y = 570;
jump=0;
}
}
}
//位置更新
imageLayer.setPos(x, y);
//画像のアニメーション
//uvをずらしてパラパラマンガ
//アニメーション(3コマ)は16fpsだと速すぎる
//20分の1くらいがいい感じ?
if(jump == 0){//ジャンプ中は止める
imageCounter++;
if(imageCounter > 20){
if(imageLayer.imageTop>-60){
imageLayer.imageTop -= 30;
}else{
imageLayer.imageTop = 0;
}
imageCounter = 0;
}
}
}
}
**********************************************************************
はい、そんなわけで、いつも通りこのコードもそのまま使えるですよ。
というわけで、動かしてみた人はわかると思いますが、できたものは第5回と同じものになります。
クラスという単位でバラバラにされてますが、コード自体は第5回の物とほとんど同じですよね。
ちょっと違うのは、ObjectManagerの存在でしょうか。
今まではMainWindowに直接持たせていた画像(キャラクタ)と、その動きに関する処理などを
objectクラスとしてまとめたので、それを操作するクラスですね。
部品とその使い手の関係になります。
できたもの自体は変わらないのですが、この構造にすることであとあと拡張がしやすくなってくるわけです。
というわけで、次回はオブジェクトを増やしてみる!にします!
ではでは本日はこれにて。