2016-10-15 1 views
0

私が始める前に、これに似た他の質問を見てみましたが、xmlが私にゲームビューが存在しないと言っている理由を伝えられません。私は間違って何かをしていることを知っている私は何を把握することはできません。GameViewにXMLテキストビューとボタンを実装する方法は?


私はXMLにいくつかのボタンとtextViewsを持っていたと私はcontentViewがgameViewとして設定されている私の活動でそれらを使用できるようにしたいです。これは実行可能ですか?

私のxmlには4つのボタンがあり、それらはすべて、RGBまたは黄色の(Color)を送信するonClickプロパティを持っています。ユーザーが何をクリックするかに応じて、回答を別のintとして設定したい。答えが正しい場合は、generateNewWordメソッドを使用して新しい色をポップアップします。しかし、私のxmlに私が「エラー

を取得するには、次のクラスが見つかりませんでした: - 。com.example.ali.colormatch2.surfaceview.Gameview、 私はGameViewクラスを持っているにもかかわらず

マイXMLファイル、activity_color_match.xml:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 

xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_color_match" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.ali.colormatch2.ColorMatch2"> 

<com.exmple.ali.colormatch2.surfaceview.GameView 
    android:id="@+id/gameView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<TextView 
    android:text="@string/mainColor" 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal" 
    android:textColor="@android:color/background_dark" 
    android:textSize="100dp" 
    android:layout_marginBottom="104dp" 
    android:textAppearance="@style/TextAppearance.AppCompat.Display3" 
    android:layout_above="@+id/button3" 
    android:layout_centerHorizontal="true" /> 

<Button 
    android:layout_width="150dp" 
    android:layout_height="60dp" 
    android:id="@+id/button" 
    android:background="#000080" 
    android:onClick="sendBlue" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<Button 
    android:layout_height="60dp" 
    android:id="@+id/button2" 
    android:background="#ffff00" 
    android:elevation="0dp" 
    android:layout_width="150dp" 
    android:onClick="sendYellow" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<Button 
    android:layout_width="150dp" 
    android:layout_height="60dp" 
    android:id="@+id/button3" 
    android:background="@android:color/holo_red_dark" 
    android:onClick="sendRed" 
    android:layout_above="@+id/button" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginBottom="19dp" /> 

<Button 
    android:layout_width="150dp" 
    android:layout_height="60dp" 
    android:id="@+id/button4" 
    android:background="@android:color/holo_green_dark" 
    android:onClick="sendGreen" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:layout_alignBottom="@+id/button3" /> 

<TextView 
    android:text="Score:" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:id="@+id/textView4" /> 

<TextView 

    android:text="@string/matchText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/textView3" 
    android:textAppearance="@style/TextAppearance.AppCompat.Body2" 
    android:textSize="25dp" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" /> 


</RelativeLayout> 

マイColorMatch2.java:

package com.example.ali.colormatch2; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.RelativeLayout; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.Random; 

public class ColorMatch2 extends Activity { 

// gameView will be the view of the game 
// It will also hold the logic of the game 
// and respond to screen touches as well 
GameView gameView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Initialize gameView and set it as the view 
    gameView = new GameView(this); 
    setContentView(gameView); 
    TextView textView3, textView2, textView4; 
    textView3 = (TextView) findViewById(R.id.textView3); 
    textView2 = (TextView) findViewById(R.id.textView2); 
    textView4 = (TextView) findViewById(R.id.textView4); 

} 

// GameView class will go here 

// Here is our implementation of GameView 
// It is an inner class. 
// Note how the final closing curly brace } 

// Notice we implement runnable so we have 
// A thread and can override the run method. 
class GameView extends SurfaceView implements Runnable { 

    // This is our thread 
    Thread gameThread = null; 

    // This is new. We need a SurfaceHolder 
    // When we use Paint and Canvas in a thread 
    // We will see it in action in the draw method soon. 
    SurfaceHolder ourHolder; 

    // A boolean which we will set and unset 
    // when the game is running- or not. 
    volatile boolean playing; 

    // A Canvas and a Paint object 
    Canvas canvas; 
    Paint paint; 

    // This variable tracks the game frame rate 
    long fps; 

    // This is used to help calculate the fps 
    private long timeThisFrame; 

    //My variables 
    int answer; 
    int correctAnswer; 
    int score = 0; 
    int randomInt2, randomInt1; 
    int count = 0; 
    boolean matchColor = true, matchText = false, firstTime = true; 



    // When the we initialize (call new()) on gameView 
    public GameView(Context context) { 
     // The next line of code asks the 
     // SurfaceView class to set up our object. 
     // How kind., 
     super(context); 

     // Initialize ourHolder and paint objects 
     ourHolder = getHolder(); 
     paint = new Paint(); 

     // Set our boolean to true - game on! 
     playing = true; 

    } 

    @Override 
    public void run() { 
     while (playing) { 

      // Capture the current time in milliseconds in startFrameTime 
      long startFrameTime = System.currentTimeMillis(); 

      // Update the frame 
      update(); 

      // Draw the frame 
      draw(); 

      // Calculate the fps this frame 
      // We can then use the result to 
      // time animations and more. 
      timeThisFrame = System.currentTimeMillis() - startFrameTime; 
      if (timeThisFrame > 0) { 
       fps = 1000/timeThisFrame; 
      } 

     } 

    } 


public void update() { 
     if (firstTime) { 
      generateNewWord(); 
      firstTime = false; 
     } 

     if (answer == correctAnswer) { 
      score++; 
      count++; 
      generateNewWord(); 
     } 
     //else { 
     // quit(); 
     // } 


     if (count % 5 == 0) { 
      if (matchColor) { 
       textView3.setText(getString(R.string.gameSetting2)); // might need to add context with this - check http://stackoverflow.com/questions/10698945/reference-string-resource-from-code 
       matchText = true; 
       matchColor = false; 
      } else if (matchText) { 
       textView3.setText(getString(R.string.gameSetting1)); 
       matchColor = true; 
       matchText = false; 
      } 
     } 
    } 


    public void generateNewWord() { 
     //randomly select between red, green, blue, yellow 
     Random rand = new Random(); 
     randomInt1 = rand.nextInt(4) + 1; // assigns randomInt a value between 1 - 4 
     randomInt2 = rand.nextInt(4) + 1; 

     if (randomInt1 ==1){ 
      textView2.setText(R.string.Red); 
     } 
     else if (randomInt1 ==2){ 
      textView2.setText(R.string.Green); 
     } 
     else if (randomInt1 == 3){ 
      textView2.setText(R.string.Blue); 
     } 
     else if (randomInt1 == 4){ 
      textView2.setText(R.string.Yellow); 
     } 


     //randomly select hex codes between rgby 
     if (randomInt2 ==1){ 
      textView2.setTextColor(0xffcc0000); 
     } 
     else if (randomInt2 ==2){ 
      textView2.setTextColor(0xff669900); 
     } 
     else if (randomInt2 == 3){ 
      textView2.setTextColor(0xff000080); 
     } 
     else if (randomInt2 == 4){ 
      textView2.setTextColor(0xffffff00); 
     } 

     if (matchColor) { 
      correctAnswer = randomInt2; 
     } 
     else if(matchText){ 
      correctAnswer = randomInt1; 
     } 
    } 

    // Draw the newly updated scene 
    public void draw() { 

     // Make sure our drawing surface is valid or we crash 
     if (ourHolder.getSurface().isValid()) { 
      // Lock the canvas ready to draw 
      canvas = ourHolder.lockCanvas(); 

      // Draw the background color 
      canvas.drawColor(Color.argb(255, 255, 255, 255)); 

      // Make the text a bit bigger 
      paint.setTextSize(30); 

      // Display the current score on the screen 
      canvas.drawText("Score:" + score, 20, 40, paint); 


      // Draw everything to the screen 
      ourHolder.unlockCanvasAndPost(canvas); 
     } 

    } 

    // If SimpleGameEngine Activity is paused/stopped 
    // shutdown our thread. 
    public void pause() { 
     playing = false; 
     try { 
      gameThread.join(); 
     } catch (InterruptedException e) { 
      Log.e("Error:", "joining thread"); 
     } 

    } 

    // If SimpleGameEngine Activity is started then 
    // start our thread. 
    public void resume() { 
     playing = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 


    /*public void sendBlue(View view){ 
     answer = 2; 
    } 
    public void sendRed(View view){ 
     answer = 1; 
    } 
    public void sendYellow(View view){ 
     answer = 4; 
    } 
    public void sendGreen(View view){ 
     answer = 3; 
    }*/ 

    //@Override 
    public int getAnswer(MotionEvent motionEvent) { 

     public void sendBlue(View view){ 
      answer = 2; 
     } 
     public void sendRed(View view){ 
      answer = 1; 
     } 
     public void sendYellow(View view){ 
      answer = 4; 
     } 
     public void sendGreen(View view){ 
      answer = 3; 
     } 
     return answer; 
    } 

} 

// This is the end of our GameView inner class 

// More SimpleGameEngine methods will go here 

// This method executes when the player starts the game 
@Override 
protected void onResume() { 
    super.onResume(); 

    // Tell the gameView resume method to execute 
    gameView.resume(); 
} 

// This method executes when the player quits the game 
@Override 
protected void onPause() { 
    super.onPause(); 

    // Tell the gameView pause method to execute 
    gameView.pause(); 
} 

} 

また、私はおそらくsetTextVを使用して周りに得ることができることに注意したいのですが

public void draw() { 

     // Make sure our drawing surface is valid or we crash 
     if (ourHolder.getSurface().isValid()) { 
      // Lock the canvas ready to draw 
      canvas = ourHolder.lockCanvas(); 

      // Draw the background color 
      canvas.drawColor(Color.argb(255, 255, 255, 255)); 

      // Make the text a bit bigger 
      paint.setTextSize(30); 

      // Display the current score on the screen 
      canvas.drawText("Score:" + score, 20, 40, paint); 

      if (randomInt2 ==1){ 
       paint.setColor(Color.argb(255, 255, 0, 0));    } 
      else if (randomInt2 ==2){ 
       paint.setColor(Color.argb(255, 0, 191, 255));    } 
      else if (randomInt2 == 3){ 
       paint.setColor(Color.argb(255, 0, 128, 0));    } 
      else if (randomInt2 == 4){ 
       paint.setColor(Color.argb(255, 255, 255, 0));    } 


      paint.setTextSize(60); 

      if (randomInt1 ==1){ 
       canvas.drawText("Red" , 100, 100, paint); 
      } 
      else if (randomInt1 ==2){ 
       canvas.drawText("Green" , 100, 100, paint); 
      } 
      else if (randomInt1 == 3){ 
       canvas.drawText("Blue" , 100, 100, paint); 
      } 
      else if (randomInt1 == 4){ 
       canvas.drawText("Yellow" , 100, 100, paint); 
      } 

      // Draw everything to the screen 
      ourHolder.unlockCanvasAndPost(canvas); 
     } 

    } 

そして、ここに私のstringsファイルがあります:

<resources> 
<string name="app_name">ColorMatch</string> 
<string name="gameSetting1">Match the COLOR</string> 
<string name="gameSetting2">Match the TEXT</string> 
<string name="Red">Red</string> 
<string name="Green">Green </string> 
<string name="Blue">Blue</string> 
<string name="Yellow">Yellow</string> 
<string name="matchText">Test</string> 
<string name="mainColor">Test</string> 
<string name="score">Score:</string> 

</resources> 

次の私のdraw()メソッドを作るが、これはxmlファイルからボタンを使用することができるという問題が解決しないことにより、IEW編集:Nongthonbam Tonthoiのおかげで、私はXMLエラーを修正する方法を考え出しました。しかし、ボタンのコードの私の現在の別個のGameViewクラスでは、メソッドは決して使用されないと言います。これを修正するために追加する必要があるのは、ユーザーがボタンをクリックしてint答えの値を正しく変更するかどうかを確認するためです。

ボタンのコード。 getAnswerメソッド内であることからそれらを削除するだけでなく、私のGameViewクラスの残りの部分は同じです:に

<com.exmple.ali.colormatch2.surfaceview.GameView 

 public void sendBlue(View view){ 
     answer = 2; 
    } 
    public void sendRed(View view){ 
    answer = 1; 
    } 
    public void sendYellow(View view){ 
    answer = 4; 
    } 
    public void sendGreen(View view){ 
    answer = 3; 
    } 

答えて

0

は、この行を変更してみてください

<com.exmple.ali.colormatch2.GameView 
+0

私が試しました、それでも次のクラスが見つからないという同じエラーが表示されます。 Johnny

+0

GameViewを内部クラスにしないで、別のパブリッククラスにしてからcom.exmpleを実行します。アリ.Gam eView –

+0

ありがとう、それは正しいことであるようでした。 XMLではレンダリングエラーが発生しなくなりました。しかし、私はまだGameViewクラスの使用にいくつか問題があります。 – Johnny

関連する問題