Processingで横スクロールアクションゲームをつくる【その3】

Processingで横スクロールアクションゲームをつくる【その3】

ゲームをつくろう!

Processingで横スクロールアクションゲームを作る企画の第3弾。

スーパーマリオを目指して取り組み始めたこの企画ですが、

【その1】では横移動のみ【その2】ではジャンプのみ実現しました。

カメのようなペースで進んでおりますが、今回も頑張って進めていきます。

横移動+ジャンプを実現

第三弾の今回は、横移動とジャンプを同時に行いたいとおもいます。

はい。今回もあんまり進みません。

奈落の底や敵キャラなどはまだまだ遠そうです。

以前作成したプログラムを組み合わせて実現させていきます。

での横移動は変位のみを考慮していましたが、ジャンプ中にも横移動をして放物線を描いてほしかったので、速度加速度を考慮します。

速度は変位を時間で割ったもの(微分したもの)であり、加速度は速度を時間で割ったもの(微分したもの)です。

ゲーム上では、左右に動くキーを入力したとき、それぞれの方向に加速度を与えています。

キー入力のProcessingコードはこちら。

上ボタンでのジャンプは【その2】と全く同じです。

void keyPressed() {
  println(x,y,vx,vy,ax,stagex,stagewid);
  if (key == CODED) {
    if (keyCode == LEFT) {
      ax = -1;
      posi = 0;
    } else if (keyCode == RIGHT) {
      ax = 1;
      posi = 1;
    } else if (keyCode == UP){
      if(y == floorHeight){
        vy = -1 * jump;
    }
  }
}
}

そしてdrawが呼び出されるたびに加速度、速度、変位を計算します。

vx += ax;
x += vx;

あとはキャラクターの動きを見ながらパラメータを微調整すれば完成です。

ジャンプしながら横移動ができるようになりました。

逆方向にもジャンプ。

縦横無尽に跳び回れます。

ようやく自由自在に動き回れるようになりました。

いつか敵キャラと戦えるようになるまで、気長にやっていきます。

ソースコード全体

コピペ自由です。

PImage hari1,hari2,hari3,hari4,stage;
int floorHeight,stagex,stagewid;;
int x,y,g,posi,jump;
float vx,vy,ax;

void setup()
{
  noStroke();
  size(800, 370);
  background(255, 255, 255, 255);
  stage = loadImage("longstage3.png");
  hari1 = loadImage("hari01.png");
  hari2 = loadImage("hari02.png");
  hari3 = loadImage("hari03.png");
  hari4 = loadImage("hari04.png");

//floor
floorHeight = 231;

x = 0;//x position
y = floorHeight;//y position
vx = 0;//x velocity
vy = 0;//y velocity
ax = 0;//y accel
g = 1;//gravity
posi = 1;//left or right
jump = 18;      // jump power ratio

stagex = 0;//stage position
stagewid = width * 3;//stage width
}

void draw()
{
//move horizontal
vx += ax;
//accel limit 3
if(5<vx){
  vx = 5;
}
if(vx<-5){
  vx = -5;
}

//deceleration
if(0<vx){
  vx = vx - 0.1;
}
if(vx<0){
  vx = vx + 0.1;
}

if(!keyPressed){
  ax = 0;
  if(abs(vx)<1){
    vx = 0;
  }
}

//move background
if(stagex<=0){
  x += vx;
    if(width/2<x){//center
      stagex += x-width/2;
      x=width/2;
    }
    if(x<0){
    x = 0;
    }
  }else if(stagewid<=stagex){
    if(x<width/2){
      stagex -= width/2-x;
      x=width/2;
    }
  if(width-16<x){
      x = width-16;
    }
  }else{
    stagex += vx;
    if(stagex<0){
      x += stagex;
      stagex = 0;
    }
  if(stagewid<stagex){
    x += stagex-stagewid;
    stagex = stagewid;
  }
}
drawBackground(stagex);

//move virtical
vy += g;
y += vy;
if(floorHeight<y){//floor limit
  y = floorHeight;
}

//draw haribo
if(posi!=0){//right
  if(((stagex+x)/5%2==0)){
    image(hari1, x, y+1);
  }else{
    image(hari2, x, y);
  }
}
else{//left
  if(((stagex+x)/5%2==0)){
    image(hari3, x, y+1);
  }else{
    image(hari4, x, y);
  }
}
}

void keyPressed() {
  println(x,y,vx,vy,ax,stagex,stagewid);
  if (key == CODED) {
    if (keyCode == LEFT) {
      ax = -1;
      posi = 0;
    } else if (keyCode == RIGHT) {
      ax = 1;
      posi = 1;
    } else if (keyCode == UP){
      if(y == floorHeight){
        vy = -1 * jump;
    }
  }
}
}

void drawBackground(float background)
{
  image(stage,-background,0);
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です