管道游戏 - PipeObject类中的PipeObject不能应用于给定的类型 [英] Pipe Game - PipeObject in class PipeObject cannot be applied to given types
问题描述
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,例如,在您的调用中 I keep getting the error "PipeObject in class PipeObject cannot be applied to given types" I have an object class that I want to be added to a My third class is the Also, I wasn't able to get my timers in the Here are all the class files Game.java Pipes.java PipeObject.java
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 Then you can create a new PipeObject, for example, as in your calls
这篇关于管道游戏 - PipeObject类中的PipeObject不能应用于给定的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
$ 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;
}
...
}
pipes.add(new PipeObject(x1,y1) );
public Pipes() {
pipes.add(new PipeObject(x1, y1));
pipes.add(new PipeObject(x1 + 200, y2));
pipes.add(new PipeObject(x1 + 400, y3));
}
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.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.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.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);
}
}
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);
}
}
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
}
}
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;
}
...
}
pipes.add(new PipeObject(x1, y1));