Java 使用类的对象数组的冲突
我正在制作一个游戏,基本上你可以像飞船一样躲避即将到来的小行星(这是大学一年级的项目) 不过我有个问题,我从一个类(小行星)中调用了6个对象,它们是通过数组调用的。我需要能够在类之外使用它们的x和y位置,以便检测用户控制的精灵是否与一个发生碰撞 每当我试图参考类外小行星的x或y位置时,我会得到一个错误“不能静态参考非静态场障碍物.posx” 下面是我的代码的MCVE。它调用对象,对象在屏幕上向下移动。我现在已经删除了用户控制的精灵和图像,因为我需要知道的是如何引用类外的对象位置 *我添加了一些变化,显示了我试图实现的目标Java 使用类的对象数组的冲突,java,class,variables,object,processing,Java,Class,Variables,Object,Processing,我正在制作一个游戏,基本上你可以像飞船一样躲避即将到来的小行星(这是大学一年级的项目) 不过我有个问题,我从一个类(小行星)中调用了6个对象,它们是通过数组调用的。我需要能够在类之外使用它们的x和y位置,以便检测用户控制的精灵是否与一个发生碰撞 每当我试图参考类外小行星的x或y位置时,我会得到一个错误“不能静态参考非静态场障碍物.posx” 下面是我的代码的MCVE。它调用对象,对象在屏幕上向下移动。我现在已经删除了用户控制的精灵和图像,因为我需要知道的是如何引用类外的对象位置 *我添加了一些变
obstacle [] asteroid;
int x;
int y = 400;
int velocity = 10;
void setup ()
{
size (700, 500);
asteroid = new obstacle[6];
for (int i = 0; i < asteroid.length; i++) {
asteroid[i] = new obstacle();
}
}
void draw () {
background(0);
collision();
rect (x,y,30,30);
for (int i = 0; i < asteroid.length; i++) {
asteroid[i].display();
asteroid[i].move();
}
}
void keyPressed () {
if (key == CODED) {
if (keyCode == RIGHT) {
x += velocity;
}
if (keyCode == LEFT) {
x -= velocity;
}
}
}
void collision () {
if (x == obstacle.posx && y == obstacle.posy) {
println("Hit");
}
}
class obstacle {
int velocity = 6;
int posx;
int posy = height;
void display () {
rect (posx, posy, 50, 50);
}
void move() {
posy += velocity;
if (posy >= height) {
posy = (int(random(-500, -50)));
posx = (int(random(20, 650)));
}
}
}
障碍[]小行星;
int x;
int y=400;
int速度=10;
无效设置()
{
大小(700500);
小行星=新障碍物[6];
对于(int i=0;i=高度){
posy=(int(随机(-500,-50));
posx=(int(随机(20650));
}
}
}
Re:你最后的评论,那是你的问题。您不能引用barrier.posx
,因为barrier
是类类型,posx
不是静态的。您可以将其移动到for循环内部并执行System.out.println(小行星[i].posx)
(假设posx
在那里可见(即它是公共的)。您可能会将障碍类与此类的实例混淆。
您不应该尝试通过类(通过障碍物.posx
)访问实例的成员,而应该通过实例
与调用方法/函数的方式相同,例如move()
,display()
,您应该能够访问posx
下面是draw()的一个稍加修改的版本:
void draw(){
背景(0);
println(小行星[0].posy);
对于(int i=0;i
注意控制台中的值发生了变化。您不是通过类直接访问posy,而是访问第一个障碍物实例(存储在小行星阵列的索引0处)并使用点表示法(与移动/显示其他障碍物的方式相同)。希望这是清楚的。你离得太近了。我做了一些更改,以更准确地显示我正在尝试的内容。我正在尝试通过检查其中一个对象是否与用户处于同一位置来使用碰撞检测。如果是,一些代码将运行,显示gameover屏幕。但我似乎无法参考对象的位置。your
collision()
方法仍然存在问题。请尝试以下操作:void collision(){for(int i=0;ivoid draw () {
background(0);
println(asteroid[0].posy);
for (int i = 0; i < asteroid.length; i++) {
asteroid[i].display();
asteroid[i].move();
}
}