質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

2回答

893閲覧

p5.play ジャンプ処理 velocityを0にできない

kuxxxxrx

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2020/08/24 12:11

お世話になっております。
p5.playにて、 上から落ちてくるsprite(果物)を下のsprite(カゴ)で受取るゲームを作成しております。
そこで、下の受け取る方のSprite(カゴ)をジャンプ処理させたいのですが、
if文が効かずか、床(canvasの下)を突き抜けて落ちて行ってしまいます。
(velocityを使っているのですが、heightが0になった時でvelocityが0になりません)

また我儘承知の上ですが、まだ知識があまりないため、できるかぎり以下の【該当コード】のような形式で教えていただけると嬉しいです。
もちろん、そもそもコードの書き方が全く違うということも考えられるのですが…。
コードが見づらいと思いますが、どうぞご教授ください。

【やろうとしていること】
スペースを押したときに、ジャンプ(position.y -=30)して、
そのまま下に落ちる処理(velocity +=0.2)をしています。
if文で、heightより大きくなれば(下に落ちすぎれば)velocityを0にして止める、
という考えの元作成しました。
【該当コード(と思われるところ)のみ】

if(keyDown('space')){ character.position.y -=30; character.velocity.y +=0.2; if(character.position.y > height-70){ character.velocity.y = 0; } }

【全文コード】

var character; var characterImage; var apple; var appleGroup; var mushroom; var mushroomGroup; var score=0; var positionX; var positionY; var gameMode; var timer = 1000; //画像の変数 var appleImage; var mushroomImage; function preload(){ appleImage = loadImage('image/apple.png'); mushroomImage = loadImage('image/mushroom.png'); characterImage = loadImage('image/basket.png'); } function setup(){ createCanvas(1500,800); createCharacter(); createObject(); updateSprites(false); gameMode='gameStart'; } function draw(){ background(200, 220, 230); countTimer(); setupText(); characterControl(); drawSprites(); } function createObject(){ //リンゴを作る appleGroup = new Group; for(var i=0; i<20; i++){ positionX = random(80,width-80); positionY = random(-500*(i/5),-100); apple = createSprite(positionX,positionY); apple.addImage(appleImage); apple.scale=0.5; appleGroup.add(apple); appleGroup[i].velocity.y += random(0.5,2); } //マッシュルームを作る mushroomGroup = new Group; for(var i=0; i<15; i++){ positionX = random(80,width-80); mushroom = createSprite(positionX,random(-500*(i/5),-100)); mushroom.addImage(mushroomImage); mushroom.scale=0.8; mushroomGroup.add(mushroom); mushroomGroup[i].velocity.y += random(0.5,2); } } function characterControl(){ if(keyDown('right')){ if(character.position.x<width-80){ character.position.x +=10; }else{ character.position.x +=0; } }else if(keyDown('left')){ if(character.position.x > 80){ character.position.x -=10; }else{ character.position.x +=0; } } if(keyDown('space')){ character.position.y -=30; character.velocity.y +=0.2; if(character.position.y > height-70){ character.velocity.y = 0; } } character.overlap(appleGroup,catchApple); character.overlap(mushroomGroup,catchMushroom); } //採ったときの、消去/スコア function catchApple(character,apple){ apple.remove(); score +=50; } function catchMushroom(character,mushroom){ mushroom.remove(); score -=100; } //キャラクタークリエイト //コライダー(当たり判定)の可視化 function createCharacter(){ character = createSprite(width/2,height-70); character.addImage(characterImage); character.setCollider('circle',0,0,20); character.debug = true; } //テキスト function setupText(){ if(gameMode == 'gameStart' || gameMode=='gameStop'){ textSize(50); fill(255); text('クリックでゲームかいし!',width/2,height/2); } if(gameMode == 'gameStart' || gameMode=='gameStop' || gameMode=='gamePlaying'){ fill(255); textSize(30); text('SCORE : '+score,1200,100); text(gameMode,1200,150); text(floor(timer/100),1200,200); } } //ゲームモードの入れ替え function mouseClicked(){ if(gameMode=='gameStart' || gameMode=='gameStop'){ gameMode='gamePlaying'; updateSprites(true); }else if(gameMode=='gamePlaying'){ gameMode='gameStop'; updateSprites(false); } } //タイマー function countTimer(){ if(gameMode=='gameStart' || gameMode=='gameStop'){ }else if(gameMode=='gamePlaying'){ timer--; } if(timer < 1){ gameMode='gameFinish'; gameFinish(); } } function gameFinish(){ updateSprites(false); fill(255); textSize(40); text('GAME FINISH',width/2,height/2); text('SCORE'+score,width/2,height/2+50); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

p5.jsは得意じゃないんですが、そのコードだと、「スペースキーを押している間だけ」

JavaScript

1 character.velocity.y +=0.2; 2 if(character.position.y > height-70){ 3 character.velocity.y = 0; 4 }

が実行されることになるんじゃないですか? 逆にいえば、スペースを押していなければ着地出来ないけれど、スペースキーを押している限りyが増えていくということになっていませんか。

「ジャンプ」っぽい動きかどうかというのはともかく、とにかく着地するためには着地のチェックのif文をキー押しのif文の外に出してみたらどうでしょう。

JavaScript

1 if(keyDown('space')){ 2 character.velocity.y = 0.2; 3 character.position.y -=30; 4 } 5 if(character.velocity.y>0){ //ジャンプ中 6 character.velocity.y +=0.2; 7 if(character.position.y > height-70){ 8 character.velocity=height-70; //地面にめり込んでいたら地表に引っ張り出す 9 character.velocity.y = 0;//ジャンプ強制停止 10 } 11 }

とか。

投稿2020/08/24 13:23

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

if(keyDown('space')){ }はスペースを押している間しか入らないので、おそらくcharacter.velocity.y = 0;には到達できないんじゃないでしょうか。

js

1 if(keyDown('space')){ 2 character.position.y -=30; 3 character.velocity.y +=0.2; 4 } 5 if(character.position.y > height-70){ 6 character.velocity.y = 0; 7 }

こうなら止まりますね。

投稿2020/08/24 13:13

編集2023/07/23 04:44
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問