管道游戏 - PipeObject类中的PipeObject不能应用于给定的类型 [英] Pipe Game - PipeObject in class PipeObject cannot be applied to given types

查看:134
本文介绍了管道游戏 - PipeObject类中的PipeObject不能应用于给定的类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public Pipes(){$}我一直得到错误PipeObject类中的PipeObject不能应用于给定的类型 b $ b pipes.add(新的PipeObject(x1,y1)); 
pipes.add(新的PipeObject(x1 + 200,y2));
pipes.add(新的PipeObject(x1 + 400,y3));

$ / code>

我有一个对象类,我想添加到 JPanel 由一个控制对象的类并将其3个实例绘制到屏幕上。它需要能够给对象类赋予不同的值。



我的第三个类是 main()类,并且应该将具有分组对象的类添加到 cardLayout 中的 JPanel 。还有一个带有播放按钮的菜单屏幕,对象不应该移动,直到 boolean playerIsReady = true 。管道对象只能在事件监听器将面板切换到游戏屏幕后才能移动。



另外,我无法在<$ c $中获取定时器c>游戏类在之前工作。也许这将有助于实现这一目标。我不知道我可以在哪里声明 boolean playerIsReady ,但是我知道它需要在 true 之后设置为<用户点击播放按钮。



以下是所有类文件



Game.java

  import java.awt。*; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing。*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
导入javax.swing.SwingUtilities;

public class Game {

public static void main(String [] args){
Runnable r = new Runnable(){
@Override
public void run(){
//用户看到的GUI(无框架)
final CardLayout cl = new CardLayout();
final JPanel gui = new JPanel(cl);
//如果不需要边框,则删除
gui.setBorder(new EmptyBorder(10,10,10,10));

JPanel menu = new JPanel(new GridBagLayout());
JButton playGame = new JButton(Play!);
ActionListener playGameListener = new ActionListener(){
$ b $ @Override
public void actionPerformed(ActionEvent e){
cl.show(gui,game);
}
};
playGame.addActionListener(playGameListener);
Insets margin = new Insets(20,50,20,50);
playGame.setMargin(margin);
menu.add(playGame);
gui.add(menu);
cl.addLayoutComponent(menu,menu);

final JPanel pipes = new Pipes();
gui.add(pipes);
cl.addLayoutComponent(pipes,game);

JFrame f =新的JFrame(Pipes Game);
f.add(gui);
//确保框架关闭后JVM关闭,
//所有非守护线程完成
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//请参阅http://stackoverflow.com/a/7143398/418556进行演示。
f.setLocationByPlatform(true);

//确保框架的最小尺寸为
//以便显示其中的组件
f.pack();
//应该最后完成,以避免闪烁,移动,
//调整工件大小。
f.setVisible(true);
$ b $ * if(playerIsReady){
Timer speed = new Timer(10,new ActionListener(){//管速
@Override
public void actionPerformed ActionEvent e){
pipes.move();
}
});
speed.start();

定时器刷新=新定时器(30,新的ActionListener(){//刷新率
@Override
public void actionPerformed(ActionEvent e){
pipes.repaint ();
}
});
refresh.start();
} * /
}
};
// Swing GUI应该在EDT
上创建和更新// http://docs.oracle.com/javase/tutorial/uiswing/concurrency
SwingUtilities.invokeLater(r);


$ / code>

Pipes.java

  import java.util。*; 
import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.JPanel;

公共类管道扩展JPanel {
int x1 = 754;
int y1 = setHeightVal();
int y2 = setHeightVal();
int y3 = setHeightVal();

列表< Pipe> pipes = new ArrayList< Pipe>();

public Pipes(){
pipes.add(new PipeObject(x1,y1));
pipes.add(新的PipeObject(x1 + 200,y2));
pipes.add(新的PipeObject(x1 + 400,y3));
}

public void paintComponent(Graphics g){
super.paintComponent(g);

g.clearRect(0,0,751,501);
// Draw PipeObject1
// Draw PipeObject2
// Draw PipeObject3

$ b $ public void move(){
x1-- ;
}

public int getMyX(){//确定管道的水平位置
return x1-3;
}

public int getMyY(){//确定管道的垂直位置
return y2 + 25;


public int setHeightVal(){//获取一个随机数并选择一个预设高度
int num =(int)(9 * Math.random()+ 1 );
int val = 0;
if(num == 9)
{
val = 295;
}
else if(num == 8)
{
val = 246;
}
else if(num == 7)
{
val = 216;
}
else if(num == 6)
{
val = 185;
}
else if(num == 5)
{
val = 156;
}
else if(num == 4)
{
val = 125;
}
else if(num == 3)
{
val = 96;
}
else if(num == 2)
{
val = 66;
}
else
{
val = 25;
}
返回val;

$ b @Override
public Dimension getPreferredSize(){
//调整为需要
返回新维(751,501);
}
}

PipeObject.java

  import java.awt.Graphics; 

公共类PipeObject {
//声明并初始化变量
int x2 = 75; //管道宽度,总数为83
int y1 = -1; // Y应该是-1
int gap = 130; //空隙高度

public void drawPipe(Graphics g,int x1,int y2){
g.drawRect(x1,y1,x2,y2); //绘制第1部分
g.drawRect(x1-3,y2-1,x2 + 6,25); //绘制第2部分
g.drawRect(x1-3,y2 + 25 + gap,x2 + 6,25); //绘制第3部分
g.drawRect(x1,y2 + 25 + gap + 25,x2,500-y2-49-gap); // Draw part 4
}
}


解决方案

很多代码,考虑到根据错误消息(以及您发布的代码), PipeObject 构造函数

$ p $ public class PipeObject {
//声明并初始化变量
int x2 = 75; //管道宽度,总数为83
int y1 = -1; // Y应该是-1
int gap = 130; //间隙高度

//添加:
public PipeObject(int x,int y){
this.x2 = x;
this.y1 = y;
}

...
}

然后,您可以创建一个新的PipeObject,例如,在您的调用中

  pipes.add(new PipeObject(x1,y1) ); 


I keep getting the error "PipeObject in class PipeObject cannot be applied to given types"

public Pipes() {
    pipes.add(new PipeObject(x1, y1));
    pipes.add(new PipeObject(x1 + 200, y2));
    pipes.add(new PipeObject(x1 + 400, y3));
}

I have an object class that I want to be added to a JPanel by a class that controls the objects and draws 3 instances of it to the screen. It needs to be able to give different values to the object class.

My third class is the main() class and should add the class with the grouped objects to a JPanel in a cardLayout. There is also a menu screen with a play button on it, and the objects should not move until boolean playerIsReady = true. The pipe objects should only move after the event listener switches the panel to the game screen.

Also, I wasn't able to get my timers in the Game class to work before. Maybe this will help towards getting that to work. I don't know where I can declare boolean playerIsReady, but I know that it needs to be set to true after the user clicks the play button.

Here are all the class files

Game.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
import javax.swing.SwingUtilities;

public class Game {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {             
                // the GUI as seen by the user (without frame)
                final CardLayout cl = new CardLayout();
                final JPanel gui = new JPanel(cl);
                // remove if no border is needed
                gui.setBorder(new EmptyBorder(10,10,10,10));

                JPanel menu = new JPanel(new GridBagLayout());
                JButton playGame = new JButton("Play!");
                ActionListener playGameListener = new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        cl.show(gui, "game");
                    }
                };
                playGame.addActionListener(playGameListener);
                Insets margin = new Insets(20, 50, 20, 50);
                playGame.setMargin(margin);
                menu.add(playGame);
                gui.add(menu);
                cl.addLayoutComponent(menu, "menu");

                final JPanel pipes = new Pipes();
                gui.add(pipes);
                cl.addLayoutComponent(pipes, "game");

                JFrame f = new JFrame("Pipes Game");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See http://stackoverflow.com/a/7143398/418556 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);

                /*if (playerIsReady) { 
                    Timer speed = new Timer(10, new ActionListener() {  //pipe speed
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            pipes.move();
                        }
                    });
                    speed.start();

                    Timer refresh = new Timer(30, new ActionListener() {    //refresh rate
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            pipes.repaint();
                        }
                    });
                    refresh.start();
                }*/
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

Pipes.java

import java.util.*;
import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.JPanel;

public class Pipes extends JPanel {
    int x1 = 754;
    int y1 = setHeightVal();
    int y2 = setHeightVal();
    int y3 = setHeightVal();

    List<Pipe> pipes = new ArrayList<Pipe>();

    public Pipes() {
        pipes.add(new PipeObject(x1, y1));
        pipes.add(new PipeObject(x1 + 200, y2));
        pipes.add(new PipeObject(x1 + 400, y3));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.clearRect(0,0,751,501);
        // Draw PipeObject1
        // Draw PipeObject2
        // Draw PipeObject3
    }

    public void move() {
        x1--;
    }

    public int getMyX() {   //To determine where the pipe is horizontally
        return x1-3;
    }

    public int getMyY() {   //To determine where the pipe is vertically
        return y2+25;
    }

    public int setHeightVal() {     //Get a random number and select a preset height
        int num = (int)(9*Math.random() + 1);
        int val = 0;
        if (num == 9)
        {
            val = 295;
        }
        else if (num == 8)
        {
            val = 246;
        }
        else if (num == 7)
        {
            val = 216;
        }
        else if (num == 6)
        {
            val = 185;
        }
        else if (num == 5)
        {
            val = 156;
        }
        else if (num == 4)
        {
            val = 125;
        }
        else if (num == 3)
        {
            val = 96;
        }
        else if (num == 2)
        {
            val = 66;
        }
        else
        {
            val = 25;
        }
        return val;
    }

    @Override 
    public Dimension getPreferredSize() {
        // adjust to need
        return new Dimension(751,501);
    }
}

PipeObject.java

import java.awt.Graphics;

public class PipeObject {
    //Declare and initialiaze variables
    int x2 = 75;                //pipe width, total is 83
    int y1 = -1;                // Y should be -1
    int gap = 130;              //gap height

    public void drawPipe(Graphics g, int x1, int y2) {
        g.drawRect(x1,y1,x2,y2);                        //Draw part 1
        g.drawRect(x1-3,y2-1,x2+6,25);                  //Draw part 2
        g.drawRect(x1-3,y2+25+gap,x2+6,25);             //Draw part 3
        g.drawRect(x1,y2+25+gap+25,x2,500-y2-49-gap);   //Draw part 4
    }
}

解决方案

A lot of code, considering that according to the error message (and the code that you posted) there is just a Constructor missing for the PipeObject class:

public class PipeObject {
    //Declare and initialiaze variables
    int x2 = 75;                //pipe width, total is 83
    int y1 = -1;                // Y should be -1
    int gap = 130;              //gap height

    // Add this:
    public PipeObject(int x, int y) {
        this.x2 = x;
        this.y1 = y;
    }

    ...
}

Then you can create a new PipeObject, for example, as in your calls

pipes.add(new PipeObject(x1, y1));

这篇关于管道游戏 - PipeObject类中的PipeObject不能应用于给定的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆