2023年12月28日 星期四

Sangmo 互動技術 Week14

解決子彈飛到圖片外沒消失及子彈會重複發射的問題
增加各種槍械圖

目前使用的data圖片庫


程式碼:
把玩家/子彈/敵人的程式和主程式分開,並且簡化程式,之後要新增內容,會方便一點





此為目前主程式畫面

PImage plImg, enImg, mainuiImg;
PImage stbuttonImg1,stbuttonImg2,mainpic1; ///第一張圖剩下外框

ArrayList<Enemy> ens = new ArrayList<Enemy>();
ArrayList<Bullet> bullets = new ArrayList<Bullet>();
Player pl = new Player(600 , 400);  ///遊戲角色生成座標

int state=0;
void setup(){ 
  size(1200, 800);  ///畫面大小
  
  stbuttonImg1 = loadImage("start1.png"); ///開始按鈕
  stbuttonImg2 = loadImage("start.png"); 
  
  mainpic1 = loadImage("Paintmain.png");
  mainuiImg = loadImage("mainUI.png");  ///主畫面圖片
  plImg = loadImage("player.png"); ///角色圖片
  enImg = loadImage("enemy.png"); ///敵人圖片
  
  
  
  for (int i = 0; i < 6; i++)   ///敵人生成人數(目前為三
  {
    ens.add(new Enemy());
  }
}

void draw(){
  if(state==0){ ///開始畫面
    StartScreen();
  }
  if(state==1){ ///遊戲畫面
    pl.move();
    pl.drawApp(); ///繪畫人物

  for (int i = 0; i < bullets.size() ; i++){  ///產生子彈
    Bullet bullet = bullets.get(i);
    bullet.move();
    bullet.drawApp(); ///繪畫子彈

    for (int j =0; j < ens.size() ; j++){  ///產生敵人
      Enemy enemy = ens.get(j);
      if (bullet.bump(enemy)){  ///敵人碰觸子彈時消失
        ens.remove(j);
        bullet.reset();
      }
    }

    if (bullet.buloutScreen()){
      bullets.remove(i);  ///離開畫面時消除子彈
      }
    }

      if (ens.size() < 3){  ///敵人數量上限
      ens.add(new Enemy());
    }   
    for (Enemy en : ens){ ///簡化寫法,也能改成 for (int i = 0; i < ens.size(); i++) {Enemy en = ens.get(i);}
      en.move();
      en.drawApp(); ///繪畫敵人
    }

    if (frameCount % 20 == 0 && state == 1 ){
      if (bullets.size() < 3)  ///子彈3發後子彈不在射擊
      {
          bullets.add(new Bullet(pl.x,pl.y,pl.dv)); ///子彈生成會從角色開始
      }
    }
  }
}
void StartScreen()
{
  image(mainuiImg,0,0,width, height);
  image(mainpic1,415,100,400, 200); ///美觀主畫面
  image(stbuttonImg1, 450, 450, 300, 100);///(x座標,y座標,寬度,高度)
  if (mouseX > 450 && mouseX < 730 && mouseY > 450 && mouseY < 560)tint(#95948F, 255);// 透明度(顏色,透明度(0 為完全透明,255 為完全不透明))
  image(stbuttonImg2, 434, 445, 327, 110);
  noTint();
}
void mousePressed()
{
  if (state == 0 && mouseX > 450 && mouseX > 550 && mouseY > 450 && mouseY < 550)state = 1;
}

void mouseReleased()
{
  ///
}
void keyPressed()///鍵盤按下
{
  if (keyCode == LEFT){
    pl.left = true;
  }else if (keyCode == RIGHT){
    pl.right = true;
  }else if (keyCode == UP){
    pl.up = true;
  }else if (keyCode == DOWN){
    pl.down = true;
  }
}

void keyReleased()///鍵盤放開
{
   if (keyCode == LEFT){
    pl.left = false;
  }else if (keyCode == RIGHT){
    pl.right = false;
  }else if (keyCode == UP){
    pl.up = false;
  }else if (keyCode == DOWN){
    pl.down = false;
  }
}


子彈與敵人程式碼


class Enemy ///定義敵人的屬性
{
  float x, y;
  float speed = 1;
  float dv;

   Enemy(float vx, float vy, int dir) 
  {
   x = vx;
   y = vy;
   dv = dir;
  }

  Enemy(){
    reset();
  }
  
  void move() ///移動時會以最短距離靠近角色
  {
    float angle = atan2(pl.y - y, pl.x - x);  ///計算玩家與敵人的角度
    x += cos(angle) * speed;
    y += sin(angle) * speed;
  }
  void drawApp() 
  {
    image(enImg, x, y, 50, 50);
  }

  void reset() 
  { 
     x = random(pl.x+400); ///隨機傳送敵人,並與玩家有一段距離
     y = random(pl.y+400);
  }
}


class Bullet ///定義子彈的屬性
{
  float x, y;
  float speed = 15; ///移動速度
  int dv;
  
  boolean bump(Enemy en) ///Enemy en為了檢查某個敵人是否被碰到(故此不能與class Enemy分開)
  {
    return dist(x, y, en.x+15, en.y+20)< 30;
  }
  
  boolean buloutScreen() 
  { 
    return (y < -10 || y > 810 || x < -10 || x > 1210);///子彈到畫面外,回傳讓子彈消失
  }
  
   Bullet(float vx, float vy, int dir) 
  {
   x = vx;
   y = vy;
   dv = dir;
  }

  void move() 
  {
   if (dv == 0){ ///未移動時子彈預設向上
      y -= speed;
    }else if (dv == 1){ ///向左
      x -= speed;
    }else if (dv == 2){ ///向右
      x += speed;
    } else if (dv == 3){ ///向上
      y -= speed;
    } else if (dv == 4){ ///向下
      y += speed;
    }
  }
  
  void drawApp() 
  {
    if(dv==3 || dv==4 || dv==0){
      fill(#F7C51E);
      ellipse(x, y, 6, 22); ///子彈外觀
    }
    else if(dv==1 || dv==2){
      fill(#F7C51E);
      ellipse(x, y, 22, 6); ///子彈外觀
    }
  }

  void reset(){  ///子彈消失後回到角色
    x = pl.x;
    y = pl.y;
  }
}


玩家程式碼

class Player  ///定義人物屬性
{
  float x, y;
  int speed = 5;///移動速度
  int dv = 0; ///控制子彈方向
  boolean left, right, up, down;

  Player(float dx, float dy){
     x = dx;
     y = dy;
   }
   
  void move(){
    if (left){
      x -= speed;
      dv = 1;
    }
    if (right){
      x += speed;
      dv = 2;
    }
    if (up){
      y -= speed;
      dv = 3;
    }
    if (down){
      y += speed;
      dv = 4;
    }
  }

  void drawApp(){
    image(plImg, x-25, y-25, 50, 50);
  }
}

下周敵人、人物增加血量功能,並且讓子彈有傷害,新增各類地圖

沒有留言:

張貼留言