当前位置: 首页 > 知识库问答 >
问题:

相交函数在第一次相交后停止工作

姬正文
2023-03-14

我正在做一个游戏,但是我在使用“相交”功能时遇到了一个问题。塞纳里奥看起来像这样;我做了一个游戏,玩家是一个长方形,目标是杀死敌人。敌人的“老板”矩形有两个“模拟”,模拟一个运动和一个攻击。这些模拟是由向量驱动的。移动是水平来回的,攻击是垂直的,一种冲锋式的交易。boss也有一个矩形的目标区域,如果被截断,“boss”将在屏幕上冲锋。现在问题来了,当我试图让它,如果球员与矩形目标区域相交,“老板”将攻击/收费。玩家第一次交叉时,boss攻击/冲锋,但之后不会。我希望老板遵循同样的pantern,是他应该只能从一边到另一边水平,如果目标区域相交;垂直攻击/冲锋。

(我会在下面包括一些代码,对不起,如果我的英语不好。首先是主要:

boss b;
Character C;

void setup(){
C = new Character();
b = new boss();
}

void draw(){
if (play) {
    b.simulate();    //horizantal movement
}

if (b.start) {
    b.sim();             //boss vertical attack
}
if (b.intersects(C)){

    play = false;
    b.start = true;
}
C.character();             //player
b.bounce();               //makes it bounce if horizantal. and stop if vertical
b.Display();              //boss
b.display();             //boss target area
}

接下来是老板:

class boss {
int x = 10 ;
int y = 10 ;
boolean start = false;
int RW = 50;
int RH = 700;
boolean up = false;
boolean down = true;

boss() {

  Location = new PVector( x+25, y );   //vector for the location of the boss
  Velocity = new PVector( 5, 0 );      // vector for horizaltal movement
  speed = new PVector( 0, 10 );        // vector for vertical down movement
  speed2 = new PVector(0, -10);       // vector for vertical up movement
}
void bounce() {
  if ((Location.x == width) ||(Location.x == 0)) {   //horizantal movement bounce on screen edge
    Velocity.x = Velocity.x * -1;

}
if ((Location.y == 650) || (Location.y == 0)) {
  start = false;                            //makes boss stop if reaches botton or top of the screen
  play = true;
  if (Location.y == 650) {                   
    RH = -700;
    up = true;
    down = false;      //specificly if it reaches top of screen
  }
  if (Location.y == 0) {
    RH = 700;                               
    down = true;       //specificly if it reaches bottom of screen
    up = false;
  }
  }
  }
void simulate() {
  Location.add(Velocity);    //simulates horizantal movement
}
void sim() {
  if (down) {
    Location.add(speed);      //simulates up and down attacking movemnet
  }
  if (up) {
  Location.add(speed2);
  }
}
boolean intersects(Character C) {

  return  Location.x < C.x + C.w && C.x < Location.x + RW && 
  Location.y < C.y + C.h && C.y < Location.y + RH; //intersect between player and boss targeting area

}
void Display() {
  rect( Location.x, Location.y, 50, 50 );   //boss
}
void display() {
  rect( Location.x, Location.y+50, RW, RH );   //boss targeting area

}

}

如果有任何不清楚的地方,我很乐意澄清任何混淆。:)

共有1个答案

王亮
2023-03-14

感谢分享代码。这让事情变得简单多了。

当我注释这段代码时(不是if条件,是if后< code>start的重置)

如果((Location.y==650)||(Location.y==0)){//start=false;

然后老板开始回到顶部,当坐标匹配时,仍然调用相交字符。然而,发布这个帖子后,老板一直在上下弹跳。

考虑到发射的子弹和对boss的打击,肯定还有更多工作要做。

希望这有帮助。:)调试此代码很有趣。在此之前,我从未使用过偏微分方程。

好了,这里是“编辑”..现在,

好消息:只有当它相交时,我才能让它双向行驶

坏消息:只要相交,它就一直往另一边去。因此,如果< code >字符是静止的,那么< code >凸起以当前速度保持交叉并传递到另一侧至少8-10次。

无论如何,这是摘要。我添加并正在攻击标志,告诉程序如果它已经到达框架的底部,不要阻止老板越过。我改变的另一件事是交叉条件。现在,它只是检查 X 轴上的交集。如果您还必须比较Y轴上的相交,那么相交是您需要更改的地方

经过长时间的解释:P这是代码。希望这更好。

主要

boss b;
Character C;
Inventory I;
Bullet B;
int previousKey = 0;
int lastKey;
int lastKeyCode;



void setup() {

  C = new Character();
  b = new boss();
  I = new Inventory();
  background(128, 128, 128);
  size( 700, 700 );
  strokeWeight( 10 );
  frameRate( 30 );
}
void keyPressed() {

  if (key == CODED) {
    previousKey = keyCode;
    if (keyCode == UP) {
      C.MoveUP();
    }
    if (keyCode == LEFT) {
      C.MoveLEFT();
    }
    if (keyCode == DOWN) {
      C.MoveDOWN();
    }
    if (keyCode == RIGHT) {
      C.MoveRIGHT();
    }
  }

  if (key == 'w' || key == 'W') {
    attack();
  }
  if ( key == 'q' || key == 'Q' ) {
    if (I.Shoot == true) {
      B = new Bullet(C.x, C.y);
      this.Shoot();
    }
  } else if (key == 'e' || key == 'E') {
    I.changePop();
  }
  if (keyPressed) {
    if (key == 'a' || key == 'A') {
      //play = false;
      //b.start = true;
    }
  }
}


void attack() {
  if (I.Attack == true) {
    if (previousKey == UP) {
      C.AttackUP();
    }
    if (previousKey == LEFT) {
      C.AttackLEFT();
    }
    if (previousKey == DOWN) {
      C.AttackDOWN();
    }
    if (previousKey == RIGHT) {
      C.AttackRIGHT();
    }
  }
}
void Shoot() {

  if (I.Shoot == true) {
    if (previousKey == UP) {
      B.ShootUP();
    }
    if (previousKey == LEFT) {
      B.ShootLEFT();
    }
    if (previousKey == DOWN) {
      B.ShootDOWN();
    }
    if (previousKey == RIGHT) {
      B.ShootRIGHT();
    }
  }
}

boolean play = true;
void keyReleased() {
  lastKey = 0;
  lastKeyCode = 0;
}

void draw() {
  background(128, 128, 128);


  if (play) {
    b.simulate();//side to side
  }

  if (b.start) {
    b.sim();      //boss rush
  }
  if (b.intersects(C)) {
    b.isAttacking = true;
    play = false;
    b.start = true;
  } else {
    b.isAttacking= false;
  }
  C.character();
  b.bounce();
  b.Display();//boss
  b.display();//rush area
  C.HPbar();
  I.popUp();
  if ( key == 'q' || key == 'Q' ) {
    if (I.Shoot == true) {
      B.bullet();
      B.Simulate();
    }
  }
}

敌人或头目

class boss {
  PVector Location;
  PVector Velocity;
  PVector speed;
  PVector speed2;
  int x = 10 ;
  int y = 10 ;
  boolean start = false;
  int RW = 50;
  int RH = 700;
  boolean up = false;
  boolean down = true;

  boolean isAttacking = false;

  boss() {

    Location = new PVector( x+25, y );
    Velocity = new PVector( 5, 0 );
    speed = new PVector( 0, 10 );
    speed2 = new PVector(0, -10);
  }
  void bounce() {
    if ((Location.x == width) ||(Location.x == 0)) {
      Velocity.x = Velocity.x * -1;
    }
    if ((Location.y == 650) || (Location.y == 0)) {
      if (!isAttacking) {
        start = false;
      }
      play = true;
      if (Location.y == 650) {
        RH = -700;
        up = true;
        down = false;
      }
      if (Location.y == 0) {
        RH = 700;
        down = true;
        up = false;
      }
    }
  }

  void simulate() {

    Location.add(Velocity);
  }
  void sim() {
    //print("\n In Sim UP: [" + up + "] Down: [" + down + "] Location [" + Location + "]");
    if (down) {
      Location.add(speed);
    }
    if (up) {
      Location.add(speed2);
    }
  }





  boolean intersects(Character C) {
    //print ("\nUP: [" + up + "] Down: [" + down + "] X: [" + (Location.x < (C.x + C.w) && (Location.x + RW) > C.x) 
    //+ "] Y: [" + (Location.y < (C.y + C.h) && (Location.y + RH) > C.y) + "]");

    return  Location.x < (C.x + C.w) && (Location.x + RW) > C.x;  
    //&& 
    //  Location.y < (C.y + C.h) && (Location.y + RH) > C.y ;
  }



  void Display() {
    pushStyle();
    stroke(0);
    fill(255, 0, 0);
    rect( Location.x, Location.y, 50, 50 );

    popStyle();
  }
  void display() {
    pushStyle();
    stroke(0);
    strokeWeight(0);
    fill(255, 0, 0, 20);
    rect( Location.x, Location.y+50, RW, RH );
    popStyle();
  }
}
 类似资料:
  • 本文向大家介绍.NET Framework 相交,包括了.NET Framework 相交的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我有一个程序,该程序每分钟通过PING检查网络中计算机的状态。每次它将向数据库插入新行,如下所示(我使用的是postgresql) 我希望结果如下 如何获得此输出? 问题答案: 这是差距和孤岛的问题。可以解决如下: dbffile演示 关键是最嵌套的子查询,在该子查询中,我使用两个函数来隔离设备上相同状态的连续出现。一旦有了价值,剩下的就很容易了。 结果

  • 问题内容: 我有一个page1.php,我有一个fly.php。page1.php是一个简单的(常规)表单页面,当用户提交表单时,人们会在其中放置信息。 通过ajax,它加载验证码模板,并要求即时验证(直到这里很好)。 经过onFly验证后,我要允许此.submit()继续 问题:此验证码中的n个,并在验证成功之后,恢复表单提交(处于保留状态)? 例: 第1部分:page1.php 第2部分:fl

  • 问题内容: 我有两个表,它们的列数相同,没有主键(我知道,这不是我的错)。现在,我需要删除表B中存在的表A中的所有行(它们相等,每行30列)。 我认为最直接的方法是执行并解决我的问题。但是,所有列的写条件(担心)也不尽人意(也许是因为我的表也不尽人意)。 我要用。我不知道该怎么做?这是我的第一个问题: 我试过了(SQL Fiddle): 但是所有行均已从table中删除。 这使我想到第二个问题:为

  • 问题内容: 我正在使用上述算法来测试圆和直线之间的交点。有时它工作正常,但有时却失败。该代码表示​​方程,该方程是从同时求解圆和线方程和时得到的。有谁知道我在数学上或其他地方哪里出错了? 问题答案: 您的计算似乎很长,我看不到您测试的不同案例的使用。无论如何,由于我发现了有趣的问题,所以我尝试自己解决该问题,并提出了以下解决方案。随意更换的,并使用S,但是要知道,你每次投,如评论,一点效果都没有准