アクションゲームをつくろう!
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;
あとはキャラクターの動きを見ながらパラメータを微調整すれば完成です。
ジャンプしながら横移動ができるようになりました。
逆方向にもジャンプ。
縦横無尽に跳び回れます。
ようやく自由自在に動き回れるようになりました。
いつか敵キャラと戦えるようになるまで、気長にやっていきます。
Processingのソースコード全体
コピペ自由です。
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);
}
(Visited 1,747 times, 1 visits today)