ボール ゲーム

processingで作ったボールゲームです。

使い方

▶▲キーでボールを操作できます。 針に当たると、ボールが割れます。そして、が落下します。 地面はランダムに生成されます。針もランダムに出現します。 がなくなってから、針に当たるとGAME OVER。時間が経つごとに画面の動きが速くなります。ボールが遅れて左に吸い込まれると、GAME OVERになるので、注意してください。

スコアは、一度画面を閉じるとリセットされます。続けて遊ぶ時に、一番高いスコアが、HISCOREとして表示されます。

ProcessingのZipダウンロードは、こちら

以下がProssecingのソースコードです。

float sc = 3;

PFont font;
PImage[] data = new PImage[256];
PImage ball;
PImage teki;
PImage[] haato = new PImage[5];
PImage menu;
float hy = 1000, hys;
float scs;
float scsc;
float addspeed = 0;
int[][] map = new int[67][32];
float[] ro(float x, float y, float xc, float yc, float theta) {
  float[] out = {0, 0};
  y = -y; 
  yc = -yc; // 数学座標と同じ様にするためにy座標値を反転

  out[0] = (x - xc) * cos(theta) - (y - yc) * sin(theta) + xc;

  out[1] = -1.0 * ( (x - xc) * sin(theta) + (y - yc) * cos(theta) + yc );
  return out;
}

class per {
  float x; 
  float y;
  float xs;
  float ys;
  float s;
  color c;
}
int ok;
per[] per = new per[100];
void bom(float x, float y) {
  for (int i = 0; i < 100; i++) {
    if (random(100) < 5) {
      per[i].s = random(0, 60);
      per[i].x = x;
      per[i].y = y;
      per[i].xs = random(-5, 5)-10;
      per[i].ys = random(-2, 0);
      per[i].c = get(int(bx+random(-32, 32)), int(by+12));
    }
  }
}
float os;
void setup() {
  font = loadFont("font10.vlw"); 
  textFont(font, 40);
  menu = loadImage("menu.png");
  ball = loadImage("ball.png");
  teki = loadImage("yurei.png");
  data[0] = loadImage("0.png");
  data[1] = loadImage("1.png");
  data[2] = loadImage("2.png");
  data[3] = loadImage("3.png");
  for (int i = 0; i < 5; i++) {
    haato[i] = loadImage("anime/haato/"+i+".png");
  }
  size(512, 256); 
  surface.setSize(int(512*sc), int(256*sc));
  frameRate(60);
  noStroke();
  noSmooth();
  noiseDetail(3);
  for (int i = 0; i < 100; i++) {
    per[i] = new per();
    per[i].c = data[2].get(int(random(8)), int(random(4)));
  }
}
int oldmilis;
float sad;
int hp = 10;
void tex(String t, float x, float y) {
  fill(0);
  y += 4;
  text(t, 8-2+x, 24-2+y);
  text(t, 4-2+x, 24+4-2+y);
  text(t, 8-2+x, 24+4-2+y);
  fill(255);
  text(t, 4-2+x, 24-2+y);
}
float xx;
float s;
float bx, by, bxs, bys;
int score;
boolean h;
boolean jt;
int thp = 0;
int tec;
int nscore;
int muteki;
float ms;
float msin;
float scorex = -1000;
float mslorex = -1000;
float mno = 1;
float[] xy = {0, 0};
float kx, kxs;
boolean t;
int hiscore;
float bs;
float bss;
int y = 5;
int gg;
boolean te;
float bxp, byp;
float tex, tey;
void draw() {
  scale(sc);
  scs = xx;
  background(150, 230, 255); 
  textFont(font, 11);
  if (xx < -8)xx = -8;
  for (int i = 0; i < 100; i++) {
    if (per[i].s >= 0) {
      fill(per[i].c);
      rect(per[i].x, per[i].y, 1, 1);
      per[i].s -= 3;
      per[i].x += per[i].xs;
      per[i].x -= xx;
      per[i].y += per[i].ys;
      per[i].ys += 0.2;
      per[i].xs /= 1.05;
    }
  }
  for (int y = 0; y < 32; y++) {
    for (int x = 0; x < 65; x++) {
      image(data[map[x][31-y]], (x*8)-xx, y*8);
      //text(nf(map[x][31-y], 1), (x*8)-xx+1, y*8+10);
      for (int k = 0; k < 1; k++) {
        if (y < 30) {
          if (ok > 0)ok--;
          if (ok <= 0) {

            for (int i = 1; i < 5; i++) {
              if (map[x][31-y] == i) {

                if (map[x][31-y-1] == 0) {
                  int yy = 31-y-1;
                  if (yy < 31) {
                    int xx = x;
                    if (xx > 1 && xx < 64) {
                      map[xx][yy+1] = 0;
                      map[xx][yy] = i;
                    }
                  }
                }
              }
            }
            ok += 6+2;
            ok = 12;
          }
        }
      }
    }
  }
  textFont(font, 40);
  if (nscore < 66) {
    xx += 8;
  } else {
    mno *= 1.001; 
    if (keyPressed && kx < 1) {
      kxs = 1;
      if (kx < 512)muteki = 240;
    }
  }
  if (xx >= 8) {
    for (int y = 0; y < 32; y++) {
      for (int x = 0; x < 66; x++) {
        map[x][y] = map[x+1][y];
        ms = 0;
      }
    }
    nscore++;
    xx = 0;
    int ya = int(noise(s)*16)+4;
    //if (ya < y)y -= 2;
    //if (ya > y)y += 2;
    y = ya;
    for (int yy = 0; yy < y; yy++) {
      map[65][yy] = 1;
    }
    map[65][y] = 2;
    if (random(100) < hp/3+0.5  ) {
      map[65][y+1] = 3;
    }
    s += 0.03;
    if (random(100) < 2) {
      s += 0.8;
    }
    if (random(1000000) < score) {
      if (te == false) {
        te = true;
      }
    }
    if (kx >= 512) {
      bx -= 8;
      score++;
    }
  }
  if (kx >= 511) {
    mslorex = 0;
    //bx += xx;
    if (hiscore < score)hiscore = score;
    xx += 1+addspeed;
    addspeed += 0.0005;
    //score = (millis()-oldmilis)/100;
    boolean tya = false;
    boolean end = false;
    int tx = int(bx-bxp);
    int ty = int(by-byp);
    if (tx < 0)tx = -tx;
    if (ty < 0)ty = -ty;
    tx /= 8;
    ty /= 8;
    //println(tx);
    if (t || muteki <= 1) {
      image(ball, (bx-4)-xx-tx, by-8-ty, 8+(tx*2), 8+(ty*2));
    }
    if (te) {
      image(teki, tex-8, tey);
      tex += sin(os)*2;
      tey += cos(os)*2;
      if (tec < 480) {
        float s = atan2(bx-tex, by-tey);
        tex += sin(s)/2;
        tey += cos(s)/2;
        os += 0.1;
        //tex -= 1+addspeed;
        if (int(tex/8) == int(bx/8) && int(tey/8) == int(by/8)) {
          if (muteki <= 1) {
            hp--;
            muteki = 60;
            tec = 480;
          }
        }
      }
      if (tex < 0) {
        tex = 0;
      }
      if (tex > 512 || tex < 0 || tey < 0 || tey > 255)te = false;
    } else {
      tec = 0;
      tex = 511;
      tey = 1;
    }
    tec++;
    bxp = bx;
    byp = by;
    t = !t;
    if (bx < 16) {
      end = true;
    }
    if (by >= 3 && int(by/8) < 31 && bx > 1 && int(bx/8) < 62) {
      if (map[int((bx/8)+1)][31-int(by/8)] != 0 || map[int((bx/8))][31-int(by/8)] != 0 || map[int((bx/8)-1)][31-int(by/8)] != 0 ) {
        if (by != int(by/8)*8) {
          if (by > int(by/8)*8) {
            by = int(by/8)*8;
          }
          bys = 0.2;
        }
        tya = true;
        if (map[int((bx/8)+1)][31-int(by/8)] == 3 || map[int((bx/8))][31-int(by/8)] == 3) {
          if (muteki <= 1) {
            hp--;
            bxs *= 4;
          }
          muteki = 60;
        }
        if (bys > 10 || bxs > 3 || bxs < -3) {
          map[int((bx/8)-1)][31-int(by/8)] = 0;
          map[int((bx/8)-0)][31-int(by/8)] = 0;
          map[int((bx/8)+1)][31-int(by/8)] = 0;

          map[int((bx/8)-2)][31-int(by/8)+1] = 0;
          map[int((bx/8)-1)][31-int(by/8)+1] = 0;
          map[int((bx/8)-0)][31-int(by/8)+1] = 0;
          map[int((bx/8)+1)][31-int(by/8)+1] = 0;
          map[int((bx/8)+2)][31-int(by/8)+1] = 0;

          map[int((bx/8)-3)][31-int(by/8)+2] = 0;
          map[int((bx/8)-2)][31-int(by/8)+2] = 0;
          map[int((bx/8)-1)][31-int(by/8)+2] = 0;
          map[int((bx/8)-0)][31-int(by/8)+2] = 0;
          map[int((bx/8)+1)][31-int(by/8)+2] = 0;
          map[int((bx/8)+2)][31-int(by/8)+2] = 0;
          map[int((bx/8)+3)][31-int(by/8)+2] = 0;
        }
        bys = -0.001;
      }
      if (hp < 0)end = true;
      if (thp != hp) {
        hy = 0;
        hys = 0;
      }
      thp = hp;

      for (int i = 0; i < hp; i++) {
        int t = int(random(-(8-hp), 8-hp))/4;
        image(haato[0], 512-16-(i*16), t);
      }
      image(haato[0], (512-16-((hp-0)*16)), hy);
      hy += hys;
      hys += 0.2;
      if (muteki > 0) {
        muteki--;
      }
      if (end && muteki <= 0) {
        //kx = 0;
        kxs = -3;
        //bys = -10;
        bss += 1;
      }
      bs += bss;
      if (bs > 100)end = true;
      bss *= 1.003;
      bxs /= 1.02;
      int sc = int(bx)-256;
      sc /= 30;
      if (sc < 0)sc = 0;
      xx += sc;
      //println(sc);
      if (tya)gg = 10;
      if (gg >= 0)gg--;
      if (keyPressed) {
        if (keyCode == RIGHT) {
        } else {
          if (gg >= 0) {
            if (!jt) {
              bys += -1;
              bxs += 0.1;
              //jt = true;
            }
          }
        }
        bom(bx, by-bys);
        if (bxs < 0.5)bxs = 0.5;
        bxs += 0.02+addspeed;
        float msc = score;
        msc /=1500;
        if (bxs > msc+4)bxs = msc+4;
      }
      if (keyPressed == false) {
        jt = false;
      }
    }
    bx += bxs;
    if (bx > 512-32)bx = 512-32;
    //bx -= scsc;
    //bx += xx;
    //tex("BALLX:"+nf(int(bx/8), 2, 0), 2+scorex, 2+40);
    //tex("BALLY:"+nf(int(by/8), 2, 0), 2+scorex, 2+80);
    by += bys;
    bys += 0.5;
  } else {
    bx = 256;
    by = -16;
    bs = 0;
    bss = 0;
  }
  //if(mousePressed)bom(mouseX,mouseY);








  if (kx < 512) {
    tex = -8;
    thp = 8;
    hp = 8;
    addspeed = 0;
    mslorex = -400;
    score = 0;
    oldmilis = millis();
    //tex("FRATE:"+nf(frameRate,2,2), 2, 2+14);
    if (mno > 20)mno = 100000000;
    //println(mno);
    ms = (sin(msin)/6)/mno;
    if (msin > PI*2)msin = 0;
    if (kx > 0 && kx < 4) {
      mno = 1; 
      msin = 0;
      //mno *= 1.0001;
    } else {
      mno *= 1.001;
    }
    if (kx <= 0) {
      msin += 0.1;
      mno *= 1.01;
    } else {
      msin -= 0.03;
      kxs *= 1.02;
    }
    int ya = 1;
    if (nscore >= 66) {
      ya = 2;
    }
    for (int y = 0; y < 8*ya; y++) {
      for (int x = 0; x < 32; x++) {
        xy = ro((x*16), y*16, 256, 128, ms);
        image(menu.get(x*16-1, y*16-1, 16+2, 16+2), xy[0]+kx, xy[1]);
      }
    }
  }
  h = !h;
  kx += kxs;
  kxs *= 1.01;
  if (kx < 0)kx = 0;
  if (kx > 512)kx = 512;
  scorex = ( mslorex + scorex * 15 )/16;
  tex("SCORE :"+nf(score, 5), 2+scorex, 2);
  tex("HISCORE:"+nf(hiscore, 5), 2+scorex, 2+28);
}

⇩使用画像です。

コメントを残す