创建随机圈可以点击上像一个按钮按钮

2023-09-03 21:54:44 作者:爷丶有爷的范°

所以这里是我的predicament我似乎无法找到这个随时随地在互联网上。我的问题很简单。我创建了安卓游戏应用程序。本场比赛将产生随机的圈子,用户可以点击那么一旦用户不点击这些随机的圆圈会发生的一个动作在屏幕上。这是象按钮的功能,但是不同的,因为整圈就能被点击。我会后的随机数生成器生成的圈子,这不是主要的阶级,这是一个扩展视图一个单独的类。

 公共类DrawingView扩展视图{



公共DrawingView(上下文的背景下){
    超(上下文);
    // TODO自动生成构造函数存根

}
RectF rectf =新RectF(0,0,200,0);

私有静态最终诠释W = 100;
公共静态INT lastColor = Color.BLACK;
私人最终随机随机=新的随机();
私人最终涂料粉刷=新的油漆();
私人最终诠释半径= 230;
私人最终处理程序处理程序=新的处理程序();
公共静态INT redColor = Color.RED;
公共静态INT绿彩= Color.GREEN;
INT randomWidth =(INT)(random.nextInt(的getWidth() - 半径/ 2)+半径/ 2F);
INT randomHeight =(random.nextInt((int)的(的getHeight() - 半径/ 2 +半径/ 2F)));

私人最终可运行updateCircle =新的Runnable(){
    @覆盖
    公共无效的run(){
        lastColor = random.nextInt(2)== 1? redColor:绿彩;
        paint.setColor(lastColor);
        无效();
        handler.postDelayed(这一点,1000);

    }
};



@覆盖
保护无效onAttachedToWindow(){
    super.onAttachedToWindow();
    handler.post(updateCircle);
}

@覆盖
保护无效onDetachedFromWindow(){
    super.onDetachedFromWindow();
    handler.removeCallbacks(updateCircle);
}

@覆盖
保护无效的OnDraw(帆布油画){
    super.onDraw(画布);
    //你的其他在这里的东西

    canvas.drawCircle(randomWidth,randomHeight +半径/ 2F,半径,油漆);
}

    @覆盖
    公共布尔的onTouchEvent(MotionEvent事件){

        双R =的Math.sqrt(((randomWidth ^ 2)+(randomHeight ^ 2)));
        INT MAXX =(INT)(((randomWidth)*(randomWidth))+ R);
        INT其minX =(INT)((((randomWidth)*(randomWidth))) -  R);
        INT MAXY =(int)的(((randomHeight)*(randomHeight))+ R);
        INT MINY =(INT)((((randomHeight)*(randomHeight))) -  R);
        INT xOfRedCircle = IF(redColor == lastColor){

        };
        INT yOfRedCircle = IF(redColor == lastColor){

        };
        INT xOfGreenCircle = IF(绿彩== lastColor){

        };
        INT yOfGreenCircle = IF(绿彩== lastColor){

        };

        开关(event.getAction()){
            案例MotionEvent.ACTION_DOWN:
                randomWidth =(int)的event.getX();
                randomHeight =(int)的event.getY();
                无效();
                打破;
            案例MotionEvent.ACTION_POINTER_UP:


                打破;
        }

        返回true;

    }


}
 

}

告诉我,如果这甚至可以做或即时通讯将不得不彻底改变我的code在这里谢谢你是我的主类的话,可以帮助任何这是唯一$ C $词有那么这里是请无视我的意见是想学习这对我自己的每一次可怕的失败。

 公共类主要扩展活动{
    DrawingView伏;
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);


        的LinearLayout布局1 =新的LinearLayout(本);
        的FrameLayout游戏=新的FrameLayout(本);
        DrawingView V =新DrawingView(本);

        TextView中会将myText =新的TextView(本);

        // INT W = getResources()getInteger(DrawingView.redColor);
        //按钮redCircle =(按钮)findViewById(瓦特);



         //redCircle.setWidth(300);
         //redCircle.setText("Start游戏);


        layout1.addView(会将myText);
       // layout1.addView(redCircle);
        //redCircle.setLayoutParams(new的LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

        //game.addView(myText);
        game.addView(五);
        game.addView(布局1);
        的setContentView(游戏);
        //redCircle.setOnClickListener((OnClickListener)本);
    }
    公共无效的onClick(视图v){
        意向意图=新的意图(这一点,Main.class);
            startActivity(意向);

        //从游戏视角重新启动这项活动。添加this.finish();从堆栈中删除
   }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }

}
 

我在日志猫现在得到这些错误

  1月3号至31号:48:52.594:E / AndroidRuntime(2395):致命异常:主要
一月3号至31日:48:52.594:E / AndroidRuntime(2395):工艺:com.Tripps.thesimplegame,PID:2395
一月3号至31日:48:52.594:E / AndroidRuntime(2395):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.Tripps.thesimplegame / com.Tripps.thesimplegame.Main}:java.lang.IllegalArgumentException异常:N &所述; = 0:-115
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.ActivityThread.access $ 800(ActivityThread.java:144)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1278)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.os.Handler.dispatchMessage(Handler.java:102)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.os.Looper.loop(Looper.java:135)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.ActivityThread.main(ActivityThread.java:5221)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在java.lang.reflect.Method.invoke(本机方法)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在java.lang.reflect.Method.invoke(Method.java:372)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):java.lang.IllegalArgumentException异常:产生的原因N'LT; = 0:-115
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在java.util.Random.nextInt(Random.java:182)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在com.Tripps.thesimplegame.DrawingView< INIT>(DrawingView.java:37)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在com.Tripps.thesimplegame.Main.onCreate(Main.java:30)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.Activity.performCreate(Activity.java:5933)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
一月3号至31日:48:52.594:E / AndroidRuntime(2395):10 ...更多
 
关于VB的一些问题1要求在窗体中建立一个按钮和一个图片框,当单击按钮时,程序

解决方案

从概念上讲,你没有一个棘手的问题。您绘制在屏幕上的圆。你想知道,如果用户感动了。

您需要捕获的触摸事件(如的onTouchEvent),然后拿到X,Y事件的坐标。它看起来像您知道圆是在屏幕上,它有一个中心和半径。你只需要确定触摸事件的圆圈内发生。

这里唯一奇怪的是,通常当一个对象是感动它处理的触摸事件。你的情况,你有容器是一个指标是什么将过程的情况下,用户内部的图。而你所要做的计算,以确定该事件是成功的。

这是一个高层次的解释,因为你已经问了一个相当高的水平的问题。您需要发布更多code,问更具体的问题来获得较低水平的答案在这一点上。

编辑:

您已经修改了code,包括你的的onTouchEvent - 告诉你,用户触摸屏幕。你需要做的数学在函数来确定触摸事件发生的内部的圈子。

既然你有圆的位置和半径,你应该能够使用代数来确定边界(就像你知道的中心,所以你可以看到,如果有一个X,Y位置就是里面的触摸事件发生半径)

首先,考虑在象限。是对触摸事件的X值大于或小于该中心X.然后同与Y轴。然后确定该内半径通过计算在该象限中的最大/最小X值和Y值的触摸事件的发生。

这应该帮助...对不起这不是越快。

编辑2:

半径距离市中心的距离 - 所以,如果你知道的中心,那么你可以决定的半径。以确定该触摸事件的XY是内部的半径,然后计算从X的Y值,和从Y X值...

在换句话说,你应该知道,R =开方(X ^ 2 + Y ^ 2)对吧?因此,如果圆的中心是在(XX,YY)然后记得MAX(X值)= XX + r和最小(X值)= XX - R(占屏幕边缘)。

所以,如果你们(事件的Y值)比YY-R,但低于YY + R,那么它的可以是圆的半径之内。您可以检查的X值,看看它们也是圆内...

那是足够的指导?我想帮助你理解 - 但这是一个非常复杂的(但基本)的概念。如果你能得到这一点,那么很多其他事情会变得更加直观。

so here is my predicament i cannot seem to find this anywhere on the internet. My question is simple. I am creating a game app for android. The game will generate random circles on the screen that a user can click on then once the user does click on one of these random circles an action will occur. This is just like the function of the button, but different because the whole circle will be able to be clicked. i will post the random number generator that generates the circles this is not the main class this is a seperate class that extends view.

public class DrawingView extends View {



public DrawingView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub

}
RectF rectf = new RectF(0, 0, 200, 0);

private static final int w = 100;
public static int lastColor = Color.BLACK;
private final Random random = new Random();
private final Paint paint = new Paint();
private final int radius = 230;
private final Handler handler = new Handler();
public static int redColor = Color.RED;
public static int greenColor = Color.GREEN;
int randomWidth =(int) (random.nextInt(getWidth()-radius/2) + radius/2f);
int randomHeight = (random.nextInt((int) (getHeight()-radius/2 + radius/2f)));

private final Runnable updateCircle = new Runnable() {
    @Override 
    public void run() {
        lastColor = random.nextInt(2) == 1 ? redColor : greenColor;
        paint.setColor(lastColor);
        invalidate();
        handler.postDelayed(this, 1000);

    }
};



@Override 
protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    handler.post(updateCircle);
}

@Override 
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    handler.removeCallbacks(updateCircle);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // your other stuff here

    canvas.drawCircle(randomWidth, randomHeight + radius/2f, radius, paint);
}

    @Override
    public boolean onTouchEvent (MotionEvent event) {

        double r = Math.sqrt(((randomWidth^2)+(randomHeight^2)));
        int maxX = (int) (((randomWidth)*(randomWidth)) + r);
        int minX = (int) ((((randomWidth)*(randomWidth))) - r);
        int maxY = (int) (((randomHeight)*(randomHeight)) + r);
        int minY = (int) ((((randomHeight)*(randomHeight))) - r);
        int xOfRedCircle = if(redColor == lastColor){

        };
        int yOfRedCircle = if(redColor == lastColor){

        };
        int xOfGreenCircle = if(greenColor == lastColor){

        };
        int yOfGreenCircle = if(greenColor == lastColor){

        };

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN : 
                randomWidth = (int) event.getX();
                randomHeight = (int) event.getY();
                invalidate(); 
                break;
            case MotionEvent.ACTION_POINTER_UP :


                break;
        }

        return true;

    }


}

}

tell me if this can even be done or if im going to have to completely change my code thank you here is my main class if that helps any this is the only other code i have so here it is please disregard the comments i was trying to learn this on my own and horribly failed each time

public class Main extends Activity {
    DrawingView v;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);


        LinearLayout layout1 = new LinearLayout (this);
        FrameLayout game = new FrameLayout(this);
        DrawingView v = new DrawingView (this);

        TextView myText = new TextView(this);

        //int w = getResources().getInteger(DrawingView.redColor);
        //Button redCircle = (Button) findViewById(w);



         //redCircle.setWidth(300);
         //redCircle.setText("Start Game");


        layout1.addView(myText);
       // layout1.addView(redCircle); 
        //redCircle.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        //game.addView(myText);
        game.addView(v);
        game.addView(layout1);
        setContentView(game);
        //redCircle.setOnClickListener((OnClickListener) this);
    }
    public void onClick(View v) {
        Intent intent = new Intent(this, Main.class);
            startActivity(intent);

        // re-starts this activity from game-view. add this.finish(); to remove from stack
   }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

i get these errors now in the log cat

03-31 01:48:52.594: E/AndroidRuntime(2395): FATAL EXCEPTION: main
03-31 01:48:52.594: E/AndroidRuntime(2395): Process: com.Tripps.thesimplegame, PID: 2395
03-31 01:48:52.594: E/AndroidRuntime(2395): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Tripps.thesimplegame/com.Tripps.thesimplegame.Main}: java.lang.IllegalArgumentException: n <= 0: -115
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.os.Looper.loop(Looper.java:135)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.main(ActivityThread.java:5221)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at java.lang.reflect.Method.invoke(Native Method)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at java.lang.reflect.Method.invoke(Method.java:372)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
03-31 01:48:52.594: E/AndroidRuntime(2395): Caused by: java.lang.IllegalArgumentException: n <= 0: -115
03-31 01:48:52.594: E/AndroidRuntime(2395):     at java.util.Random.nextInt(Random.java:182)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.Tripps.thesimplegame.DrawingView.<init>(DrawingView.java:37)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.Tripps.thesimplegame.Main.onCreate(Main.java:30)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.Activity.performCreate(Activity.java:5933)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
03-31 01:48:52.594: E/AndroidRuntime(2395):     ... 10 more

解决方案

Conceptually, you do not have a difficult problem. You are drawing a circle on a screen. You want to know if the user "touched" it.

You need to capture the touch event (i.e. "onTouchEvent") and then get the X,Y coordinates of the event. It looks like you know where the circle is on the screen, which has a center and radius. You just need to determine if the touch event occurred within the circle.

The only odd thing here is that usually when an object is "touched" it processes the touch event. In your case, you have a drawing inside the container that is an indicator to the user of what will "process" the event. And you have to do the calculation to determine if the event was successful.

This is a high-level explanation because you have asked a fairly high level question. You need to post more code and ask more specific questions to get a lower level answer at this point.

EDIT:

You've modified your code to include your onTouchEvent - that tells you where the user touched the screen. You need to do the math in that function to determine if the touch event occurred "inside" the circle.

Since you have the location and radius of the circle, you should be able to use algebra to determine the border (like you know the center, so you can see if the touch event occurred with an X,Y position that is inside the radius)

First, think in quadrants. Is the touch event X value greater than or less than the center X. And then the same with the Y axis. Then determine if the touch event occurred inside the radius by calculating the greatest/least X value and Y value in that quadrant.

That should help ... sorry it wasn't sooner.

EDIT 2:

Radius is the distance from the center - so, if you know the center, then you can determine the radius. To determine if the X.Y of the touch event is "inside" the radius, then calculate the Y value from the X, and the X value from the Y...

In other words, you should know that r = sqrt(x^2 + y^2) right? So, if the center of the circle is at (XX, YY) then remember that MAX(X value) = XX + r and MIN(X value) = XX - r (accounting for the edge of the screen).

So, if Ye (Y value of the event) is greater than YY-r but less than YY+r, then it could be within the radius of the circle. You can check the X values to see if they are also within the circle...

Is that enough guidance? I'm trying to help you understand - but this is a very complex (yet "basic") concept. If you can get this, then a lot of other things will become more intuitive..

 
精彩推荐
图片推荐