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

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

ただいまの
回答率

88.62%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 309

mijinnnko

score 6

前提・実現したいこと

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

package com.example.ninja

import android.content.Intent
import android.graphics.Point
import android.os.Bundle
import android.os.Handler
import android.support.v7.app.AppCompatActivity
import android.view.MotionEvent
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.example.ninja.R
import com.example.ninja.ResultActivity
import com.example.ninja.SoundPlayer
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity() {

    // サイズ
    private var frameside = 0
    private var hitoSize = 0
    private var screenWidth = 0
    private var screenHeight = 0
    // 位置
    private var hitoX = 0f
    private var kenX : Float = 0f
    private var kenY : Float = 0f

    // スピード
    private var hitoSpeed = 0
    private var kenSpeed = 0

    // Score
    private var score = 0
    // Handler & Timer
    private val handler = Handler()
    private var timer: Timer? = Timer()
    // Status
    private var action_flg = false
    private var start_flg = false
    // Sound
    private lateinit var soundPlayer: SoundPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        soundPlayer = SoundPlayer(this)
        scoreLabel.text = "scoreLavel"
        startLabel.text = "startLabel"

        // Screen Size
        val wm = windowManager
        val display = wm.defaultDisplay
        val size = Point()
        display.getSize(size)

        screenWidth = size.x
        screenHeight = size.y

        hitoSpeed = Math.round(screenWidth / 60f)
        kenSpeed = Math.round(screenHeight / 60f)

        ken.x = -100.0f
        ken.y = -100.0f

        scoreLabel.text = "Score : 0f"
    }

    fun changePos() {
        hitCheck()

        // ken
        kenY += kenSpeed.toFloat()
        if (kenY < 0) {
            kenY = (screenHeight + 20).toFloat();
            kenX =
                Math.floor(Math.random() * ( frameside-ken.width)).toFloat()
        }
        ken.x = kenX
        ken.y = kenY


        // hito
        if (action_flg) {
            hitoX -= hitoSpeed.toFloat()
        } else {
            hitoX += hitoSpeed.toFloat()
        }
        if (hitoX < 0) hitoX = 0f
        if (hitoX > frameside - hitoSize) hitoX = frameside - hitoSize.toFloat()
        hito.x = hitoX
        scoreLabel!!.text = "Score : $score"
    }

    private fun hitCheck() { // Orange
        val kenCenterX = kenX + ken!!.width / 2
        val kenCenterY = kenY + ken!!.height / 2
        if (hitStatus(kenCenterX, kenCenterY)) {
            kenX = -10.0f
            score += 10
            soundPlayer.playHitSound()
        }

    }

    private fun hitStatus(centerX: Float, centerY: Float): Boolean {
        return if (0 <= centerX && centerX <= hitoSize && hitoX <= centerY && centerY <= hitoX + hitoSize
        ) true else false
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        if (!start_flg) {
            start_flg = true
            val frame: FrameLayout = findViewById(R.id.frame);
            frameside = frame.width;

            hitoX = hito.x;
            hitoSize = hito.height;



            startLabel.visibility = View.GONE;
            timer!!.schedule(object : TimerTask() {
                override fun run() {
                    handler.post { changePos() }
                }
            }, 0, 20)
        } else {
            if (event.action == MotionEvent.ACTION_DOWN) {
                action_flg = true
            } else if (event.action == MotionEvent.ACTION_UP) {
                action_flg = false
            }
        }
        return true
    }

    override fun onBackPressed() {}
}

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>

試したこと

参考書、他サイト情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2020/03/05 19:18

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

    キャンセル

  • mijinnnko

    2020/03/05 19:32

    更新しました

    キャンセル

  • jimbe

    2020/03/05 20:19

    更新はありがたいですが, 余計な部分を増やさないでください.
    こちらで先のコードで動作確認・修正を行っていても, また最初から行わなくてはなりません.

    増やされた syuri, yari, yumi がレイアウトにありませんのでコンパイルエラーになります.

    キャンセル

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/07 19:34

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

    キャンセル

  • 2020/03/07 19:48

    件のコードでは, 画面の下部のY座標を screenHeight という変数の値としています. (恐らくこれは間違いで, screenWidth/screenHeight としている所は全て onTouchEvent で取り出している frame.width/frame.height が正解かと思います)
    そして画面上部の位置は (view のサイズ 100 から) -100 です
    従いまして, 該当箇所は

    // ken
    kenY += kenSpeed.toFloat() //移動してみて
    if (kenY > screenHeight ) { //画面の外(下)に見えなくなったら
    kenY = -100f //上に戻す

    となると思います.

    キャンセル

  • 2020/03/07 22:15

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

    キャンセル

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る