시작하기 전에 이와 비슷한 다른 질문을 시도했지만 XML에서 게임 뷰가 존재하지 않는다고 말하는 이유를 알 수 없습니다. 나는 내가 무엇을 잘못하고 있는지를 안다. 나는 무엇을 알아낼 수 없다. GameView에 XML 텍스트 뷰 및 버튼을 구현하는 방법은 무엇입니까?
나는 내 XML의 일부 버튼과 textViews을했고 나는있는 contentView가 gameView로 설정되어 내 활동에 사용할 수 있어야합니다. 이게 가능합니까?
내 xml에는 네 개의 버튼이 있으며 RGB 또는 노란색 중 하나를 보낼 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를 사용하여 주위를 얻을 수 있습니다 싶습니다 내 무승부() 메소드는 다음을함으로써 iew, 그러나 이것은 XML 파일에서 버튼을 사용 할 수있는 문제가 해결되지 않습니다
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);
}
}
그리고 여기 내 문자열이 파일은 다음과 같습니다
<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>
을 편집 : 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;
}
을, 하지만 여전히 다음과 같은 클래스를 찾을 수 없다는 오류가 발생합니다.
Johnny
GameView를 내부 클래스로 만들고 별도의 public 클래스로 만들고 com.exmple을 수행하지 마십시오. 알았어 .Gam eView –
감사합니다. 그 일이 옳은 것처럼 보였습니다. 이제 XML에서 렌더링 오류가 발생하지 않습니다. 그러나 GameView 클래스를 사용할 때 여전히 몇 가지 문제가 있습니다. – Johnny