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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1565閲覧

避けるゲーム作成中、落下物が上から下まで落ちたきりで戻ってこない

mijinnnko

総合スコア6

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/03/04 20:16

編集2020/03/07 05:14

前提・実現したいこと

android studioでkotlinの勉強中です。
現在、避けるゲームを作っていますが、1つわからないことがあり、kenを上から下に動かし、下まで行ったらまた上に戻り毎回違う位置から出てくるようにランダムな値を生成するといった文を作っていますが、現状、kenが上から下までいったきりで戻ってこなく、kenのY座標が0より小さくなったら画面の上に戻すということをしたいのですが、どういった文にすればいいのかわからず困っています。。
なにとぞ初心者でサイトにも慣れていませんがどなたかお知恵をいただければと思います。よろしくお願いします

MainActivity

1package com.example.ninja 2 3import android.content.Intent 4import android.graphics.Point 5import android.os.Bundle 6import android.os.Handler 7import android.support.v7.app.AppCompatActivity 8import android.view.MotionEvent 9import android.view.View 10import android.widget.FrameLayout 11import android.widget.ImageView 12import android.widget.TextView 13import com.example.ninja.R 14import com.example.ninja.ResultActivity 15import com.example.ninja.SoundPlayer 16import kotlinx.android.synthetic.main.activity_main.* 17import java.util.* 18 19class MainActivity : AppCompatActivity() { 20 21 // サイズ 22 private var frameside = 0 23 private var hitoSize = 0 24 private var screenWidth = 0 25 private var screenHeight = 0 26 // 位置 27 private var hitoX = 0f 28 private var kenX : Float = 0f 29 private var kenY : Float = 0f 30 31 // スピード 32 private var hitoSpeed = 0 33 private var kenSpeed = 0 34 35 // Score 36 private var score = 0 37 // Handler & Timer 38 private val handler = Handler() 39 private var timer: Timer? = Timer() 40 // Status 41 private var action_flg = false 42 private var start_flg = false 43 // Sound 44 private lateinit var soundPlayer: SoundPlayer 45 46 override fun onCreate(savedInstanceState: Bundle?) { 47 super.onCreate(savedInstanceState) 48 setContentView(R.layout.activity_main) 49 soundPlayer = SoundPlayer(this) 50 scoreLabel.text = "scoreLavel" 51 startLabel.text = "startLabel" 52 53 // Screen Size 54 val wm = windowManager 55 val display = wm.defaultDisplay 56 val size = Point() 57 display.getSize(size) 58 59 screenWidth = size.x 60 screenHeight = size.y 61 62 hitoSpeed = Math.round(screenWidth / 60f) 63 kenSpeed = Math.round(screenHeight / 60f) 64 65 ken.x = -100.0f 66 ken.y = -100.0f 67 68 scoreLabel.text = "Score : 0f" 69 } 70 71 fun changePos() { 72 hitCheck() 73 74 // ken 75 kenY += kenSpeed.toFloat() 76 if (kenY < 0) { 77 kenY = (screenHeight + 20).toFloat(); 78 kenX = 79 Math.floor(Math.random() * ( frameside-ken.width)).toFloat() 80 } 81 ken.x = kenX 82 ken.y = kenY 83 84 85 // hito 86 if (action_flg) { 87 hitoX -= hitoSpeed.toFloat() 88 } else { 89 hitoX += hitoSpeed.toFloat() 90 } 91 if (hitoX < 0) hitoX = 0f 92 if (hitoX > frameside - hitoSize) hitoX = frameside - hitoSize.toFloat() 93 hito.x = hitoX 94 scoreLabel!!.text = "Score : $score" 95 } 96 97 private fun hitCheck() { // Orange 98 val kenCenterX = kenX + ken!!.width / 2 99 val kenCenterY = kenY + ken!!.height / 2 100 if (hitStatus(kenCenterX, kenCenterY)) { 101 kenX = -10.0f 102 score += 10 103 soundPlayer.playHitSound() 104 } 105 106 } 107 108 private fun hitStatus(centerX: Float, centerY: Float): Boolean { 109 return if (0 <= centerX && centerX <= hitoSize && hitoX <= centerY && centerY <= hitoX + hitoSize 110 ) true else false 111 } 112 113 override fun onTouchEvent(event: MotionEvent): Boolean { 114 if (!start_flg) { 115 start_flg = true 116 val frame: FrameLayout = findViewById(R.id.frame); 117 frameside = frame.width; 118 119 hitoX = hito.x; 120 hitoSize = hito.height; 121 122 123 124 startLabel.visibility = View.GONE; 125 timer!!.schedule(object : TimerTask() { 126 override fun run() { 127 handler.post { changePos() } 128 } 129 }, 0, 20) 130 } else { 131 if (event.action == MotionEvent.ACTION_DOWN) { 132 action_flg = true 133 } else if (event.action == MotionEvent.ACTION_UP) { 134 action_flg = false 135 } 136 } 137 return true 138 } 139 140 override fun onBackPressed() {} 141}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:id="@+id/scoreLabel" android:layout_width="match_parent" android:layout_height="50dp" android:text="Score : 300" android:textSize="18sp" android:paddingLeft="10dp" android:gravity="center_vertical"/> <FrameLayout android:id="@+id/frame" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/startLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="タップしてスタート" android:textSize="20sp" android:layout_gravity="center"/> <ImageView android:id="@+id/hito" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center_vertical" android:src="@drawable/hito" /> <ImageView android:id="@+id/ken" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/ken"/> </FrameLayout> </LinearLayout>

試したこと

参考書、他サイト情報

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

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

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

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

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

jimbe

2020/03/05 03:03

件名で "ken" と言われても何のことか分かりません.
jimbe

2020/03/05 09:12

何を作っているのかさえ知らない人がご質問のリストを見て, "kenを画面の上から下に" とあった場合に, ご質問の内容がイメージできるでしょうか. また, 同じような問題に遭遇している方がその解決方法を探そうとした場合に, この件名で見つけられるでしょうか. 私は, 例えば「避けるゲーム作成中、落下物が上から下まで落ちたきりで戻ってこない」となっていると, 分かり易いように思います.
mijinnnko

2020/03/05 09:33

修正しました。ありがとうございます
jimbe

2020/03/05 10:18

MainActivity がコンパイルエラーになります. hitCheck で {} の対応が崩れています.
jimbe

2020/03/05 11:19

更新はありがたいですが, 余計な部分を増やさないでください. こちらで先のコードで動作確認・修正を行っていても, また最初から行わなくてはなりません. 増やされた syuri, yari, yumi がレイアウトにありませんのでコンパイルエラーになります.
guest

回答1

0

ベストアンサー

動作させてみましたが, 予想と違って ken が下から上にいきます.
また, hito がタッチの有無で上下に動きます.
あっているでしょうか.

そして肝心の「ken が戻ってこない」件に関しましては, 現在ご提示のコードでは繰り返し ken が(下から上に)流れていましたので, 問題自体が無くなったようです.

投稿2020/03/05 11:29

jimbe

総合スコア12543

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

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

mijinnnko

2020/03/05 12:49

kenを下からではなく上からにしたいです。 hitoについてはまだそのままで大丈夫です。
jimbe

2020/03/05 17:02

逆にするのであれば, 初期値と最終値, 計算の符号を逆にすれば良いのではないでしょうか.
mijinnnko

2020/03/06 04:51

初期値と最終値はどこの行で表してるのでしょうか?
jimbe

2020/03/06 14:19

このコードはご自身で作成されたものではないのですか?
mijinnnko

2020/03/06 15:14

自分で作ったものですが、参考書を使いながら作ってるので、初期値や最終値がわからないです
jimbe

2020/03/06 16:30

すると, 訳分からぬまま書いているということになります. 落下物の追加等の前に, まず各変数がどのような意味を持ち, いつどんな値になっているのかをしっかり理解するようにされては如何でしょう. でなければ, 自身のコードに何が書いてあるのかを他人に質問するという変な事が延々と続いてしまいます. ken の位置は, kenX/kenY によって決定されています. 縦方向の位置は kenY ですので, 特にこの変数の値に注目されると良いかと思います.
mijinnnko

2020/03/07 03:24

初期値や最終値らしきものを逆にしても、解決しません。 上から下には行きますが、下に行きっぱなしになります。戻ってこないです
jimbe

2020/03/07 04:19

その修正されたコードをご質問に追記して頂けますか.
jimbe

2020/03/07 07:14 編集

ありがとうございます. changePos() の部分で > // ken > kenY += kenSpeed.toFloat() > if (kenY < 0) { > kenY = (screenHeight + 20).toFloat(); は, 剣を下に移動させ, 画面の外に出たら上に戻す処理のはずですが keyY を + していったら, if 文はいつまで経っても成立しません. そして, 成立したとしても kenY に設定している値は画面の上方の値ではありません.
mijinnnko

2020/03/07 09:20

kenY += kenSpeed.toFloat()の部分をどうにかすればよろしいのでしょうか?
mijinnnko

2020/03/07 10:34

なかなか分からず戸惑っています。今回ばかり教えていただけると幸いでございます。
jimbe

2020/03/07 10:48

件のコードでは, 画面の下部のY座標を screenHeight という変数の値としています. (恐らくこれは間違いで, screenWidth/screenHeight としている所は全て onTouchEvent で取り出している frame.width/frame.height が正解かと思います) そして画面上部の位置は (view のサイズ 100 から) -100 です 従いまして, 該当箇所は // ken kenY += kenSpeed.toFloat() //移動してみて if (kenY > screenHeight ) { //画面の外(下)に見えなくなったら kenY = -100f //上に戻す となると思います.
mijinnnko

2020/03/07 13:15

おかげさまで解決できました。ありがとうございます。 今一度、1からもう一度見直しし理解するようにしていきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問