解決子彈飛到圖片外沒消失及子彈會重複發射的問題
增加各種槍械圖目前使用的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); } }下周敵人、人物增加血量功能,並且讓子彈有傷害,新增各類地圖
沒有留言:
張貼留言