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

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

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

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

Kotlin

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

Q&A

解決済

1回答

1638閲覧

避けるゲームを作成中。最初からランダムな位置から降るようにしたい

mijinnnko

総合スコア6

Android Studio

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

Kotlin

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

1グッド

1クリップ

投稿2020/03/12 11:44

編集2020/03/14 15:15

前提・実現したいこと

android studioでkotlinの勉強中です。
現在、避けるゲームを作っていますが、最初左上から落下し、それからランダムな位置で出てくるようになってるのですが、それを最初からランダムな位置からスタートするようにしたいのですが、どうしても左上からになってしまい困ってます。お知恵をお願いします。

MainActivity

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

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>

試したこと

参考書、他サイト情報

s.k👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

このご質問は, プログラムがどう流れ, どの変数の変化が画面等にどう影響するのかを理解していない表れです.
kotlin の勉強も必要でしょうけれど, 言語よりも基本的な「プログラム」の勉強が必要に思えます.

onCreate 内に

kotlin

1kenX = (Math.random() * (frameHeight-ken.width)).toFloat()

を追加しては如何でしょうか.

投稿2020/03/12 17:48

jimbe

総合スコア12683

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

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

mijinnnko

2020/03/14 09:33

試しに入れてみましたが、ランダムにはならずずっと同じ方向に落ち続けます
jimbe

2020/03/14 10:55

> ずっと同じ方向に 方向はずっと上から下で良いのではないのですか? ランダムに左から右や下から上へ等にするのでしょうか. また, ご提示のコードだけでは, frameHeight が見つからずエラーになってしまうのですが, frameHeight はどちらで定義されて幾つになっているのでしょうか.
jimbe

2020/03/14 11:09

frameHeight を screenWidth にしては如何でしょうか.
mijinnnko

2020/03/14 15:16

上から下で間違いないのですが、現状、スタートすると必ず左上から落ちるのです。そこを最初からランダムの位置からスタートできるようにしたいです
mijinnnko

2020/03/14 15:17

コードは更新しました
jimbe

2020/03/14 17:12 編集

まず, 変数の名前を気にされたほうがよいかと思います. frameHeight は onTouchEvent で代入されていますが, Height と言う名前ににも関わらず frame.width です. そして hito!!.height が代入される変数名は (hitoHeight では無く) hitoSize です. これでは読むほうに無用な混乱を起こします. onCreate での kenX への代入ですが, changePos 内の代入文が frameHeight から screenHeight に変わっており, screenHeight は onCreate 内で代入されていますので, changePos 内の kenX=~ の代入文を onCreate 内 の screenHeight=~ の代入文の後にコピーすれば良いかと思います. ただ...これも screenHeight では無く screenWidth なのでは無いでしょうか?
mijinnnko

2020/04/08 02:47

ご連絡遅くなりました。学校を修了し勉強できる時間がなくなってしまったので、落ち着いたらもう一度、一から見直し試してみたいと思います。 ありがとうございました
jimbe

2020/04/08 04:13

> 学校を修了 とりあえずはおめでとう(?)ございます. 世間は大変なことになってしまいましたが, 無事再開されることを願っています.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問