class Sprite {
float x;
float y;
float dx;
float dy;
}
Sprite player= new Sprite();
class Asteroids extends Sprite {
float speedmultiplier;
float speedupposition;
color asteroidcolor;
color hitcolor;
String state; // "entering", "moving", "speed up"
当我将randomRestart设置为超过500(屏幕大小)的任何内容时,小行星完全停止动画。在“重新启动”状态下,更新功能中还有一个x = random(550,650),并且还有一个roix.x = random(550,650)。这些会影响randomRestart吗?
另一个问题是,我怎么能用小行星输入命中检测,以便玩家失去生命?
提前感谢您的帮助。
void randomRestart(){
x= random(550,650);
y= random(50,550);
speedmultiplier= random(1.10,1.5);
dx= random(1.5,2.5);
dy= 0;
speedupposition= random(300,450);
asteroidcolor= color(50,40,18);
hitcolor= color(256, 0,0);
state = "entering";
}
void render(){
pushMatrix();
if(state.equals("entering")){
//translate(x,y);
fill(asteroidcolor);
noStroke();
ellipse(x,y,50,50);
}
else if(state.equals("speed up")){
//translate(x,y);
fill(asteroidcolor);
noStroke();
ellipse(x,y,50,50);
}
else if(state.equals("hit")){
//translate(x,y);
fill(hitcolor);
noStroke();
ellipse(x,y,50,50);
}
else if (state.equals("restart")){
translate(x,y);
fill(asteroidcolor);
noStroke();
ellipse(x,y,50,50);
}
popMatrix();
}
void update(){
if (state.equals("entering")){
x += -dx;
if (state.equals("speed up")){
x += -dx * speedmultiplier;
}
}
if (x < 0 || x > width){
state ="restart";
randomRestart();
}
else if (state.equals("restart")){
x += dx;
if (x < -50 || x >width){
state = "entering";
x= random(550,650);
dx = -dx;
randomRestart();
}
}
}
Asteroids randomAsteroids(){
Asteroids roid = new Asteroids();
roid.x= random(550,650);
roid.y= random(50,550);
roid.speedmultiplier= random(1.10,2.0);
roid.dx= random(1.5,3.0);
roid.dy= 0;
roid.speedupposition= random(300,450);
roid.asteroidcolor= color(50,40,18);
roid.asteroidcolor= color(50,50,50);
roid.hitcolor= color(256, 0,0);
return roid;
}
int NUM_ROIDS= 10;
ArrayList<Asteroids> roidsList;
void setup(){
size(500,500);
player.x = 50;
player.y= 250;
player.dx=0;
player.dy=20.5;
roidsList = new ArrayList<Asteroids>();
int i = 0;
while (i<8){
Asteroids a = new Asteroids();
a.randomRestart();
roidsList.add(a);
++i;
}
}
void draw(){
background(255);
fill(0,0,0);
noStroke();
rect(player.x,player.y,10,30);
player.x += player.dx;
for (Asteroids b : roidsList){
b.render();
b.update();
}
}
void keyPressed(){
if (key =='w'){
player.y += -player.dy;
}
if (key =='s'){
player.y += player.dy;
}
}
答案 0 :(得分:0)
查看代码的这一部分:
if (x < 0 || x > width){
state ="restart";
randomRestart();
}
如果您使用randomRestart()
方法,x
超过width
,会怎样?
此if语句将始终被触发,因此您将再次重新启动您的小行星,将其置于屏幕边界之外,这会再次触发此if语句,重新启动它,这样......所以您永远不会给你的小行星有机会到达屏幕。
相反,你可能想让你的小行星在屏幕外有一些空间:
if (x < -100 || x > width + 100){
state ="restart";
randomRestart();
}
碰撞检测是一个非常大的主题,您应该尝试一些事情并在另一个问题中询问。别忘了发帖MCVE。无耻的自我推销:我已经在可用的处理here中编写了关于碰撞检测的教程。