Processing/javaの関数への引数渡しの質問です。
現在processing でシューティングゲームを作っていて自機の動作(基本操作はキーボードで左と右へ移動、縦は固定)がうまくいきました。そこで自機の数を増やすために、自機の動きの部分を関数にして引数を渡すだけで自機を量産しようとしたところ、自機自体が動かなくなってしまいました。
おそらく関数、引数渡す段階(gamePlay関数の中のplayerMove関数辺り)で上手くいってないと思うので詳しい方教えてください。当方プログラミング初心者のため下手な質問ですみません。
文字数制限があるので変更後のコードは以下に、変更前のコードは編集依頼の返信画面に載せてあります。
お手数おかけしますがご確認よろしくお願いします。
,,,processing 変更後(引数渡し)
int keyy; //流れ管理
PImage player1,bg, bombP;// bP: プレイヤーの弾
PImage[] enemy = new PImage[2];
int px1=240,py1=50,ph1=50,pw1=50; //プレイヤー1の座標と高さ幅
int px2,pw2=50,py2=700,ph2=50;//プレイヤー2の座標と高さ幅
float[] ex =new float[12]; //敵の座標
int[] ey = new int[12];
int[] ef = new int[12]; //フラグ 0:左方向 1:右方向 2:未使用
float[] ev = new float[12]; //敵の移動速度
int[] bPx1 = new int[6]; //Player弾
int[] bPy1= new int[6];
int[] bPx2 = new int[6]; //Player弾
int[] bPy2= new int[6];
int[] bEx = new int[20]; //Enemy弾
int[] bEy = new int[20];
int[] bEv = new int[20]; //E弾速度
int bombWait;
int keyKeep; //押下中のキー
int scoreS = 0;
int scoreC = 0;
void setup(){
size(600,800);
noStroke();
frameRate(30);
imgLoad();
gameInit(bPy1); //ゲーム初期化
}
void draw(){
background(100);
if( keyy == 0){
gameTitle();
}else if( keyy == 1){
//px1,py1,pw1,ph1,bPx1,bPy1
gamePlay();
}else if( keyy == 2){
gameOver();
}
}
void gameInit(int[] bPy){
keyy = 0;
//px1 =240;
for(int i =0; i<12; i++){
ef[i] = 2;
//ex[i] = i20;
//ey[i] = 110 + i50;
//ev[i] =random(0.5,2.5);
}
for(int i=0; i<6; i++){
bPy[i] = -20; //-20:未使用
}
bombWait = 0;
keyKeep = 0;
for(int i=0; i<20; i++){
bEy[i] = -20; //-20:未使用
}
}
void gameTitle(){
keyy =1;
}
//int px,int py,int pw,int ph,int[]bPx,int[]bPy
void gamePlay(){
playerMove(bPx1,bPy1,px1,pw1);
image(player1,px1,py1,pw1,ph1);
enemyMove();
enemyDisp(bPx1,bPy1);
bombPMove(bPx1,bPy1);
bombEMove(px1,py1,pw1,ph1);
scoreDisp();
}
void gameOver(){
scoreDisp();
}
void imgLoad(){
player1 = loadImage("player2.png");
enemy[0] =loadImage("敵.png");
bombP =loadImage("2弾.png");
}
void playerMove(int[] bPx,int[] bPy,int px,int pw){
// if( (keyPressed == true) && (key == CODED) ){
if( ( keyKeep == LEFT) && (px>0) ){
px -= 3;
}
if( ( keyKeep == RIGHT) &&(px <600-pw) ){
px += 3;
}
// }
if( bombWait>0){
bombWait--;
}
if( (keyPressed == true) && (key == ' ' ) && (bombWait == 0) ){
bombWait =10; //10秒まち
bombPAdd(bPx,bPy,px,pw);
}
}
void keyPressed(){
if (key == CODED){
if( (keyCode == LEFT) || (keyCode == RIGHT) ){
keyKeep = keyCode;
}
}
}
void keyReleased(){
if (key == CODED){
if( (keyCode == LEFT) || (keyCode == RIGHT) ){
keyKeep = 0;
}
}
}
void enemyMove(){
for(int i=0; i<12; i++){
ex[i] += ev[i];
if( (ef[i] ==0) && (ex[i] < -50) ){
ef[i]= 2; //画面外皮表示
}
if( (ef[i] ==1) && (ex[i] >600) ){
ef[i]= 2; //画面外皮表示
}
}
if ( random(1000)<20){ //敵の発生率
enemyAdd();
}
}
void enemyDisp(int[] bPx,int[] bPy){
for(int i=0; i<12; i++){
if ( ef[i] <2){
image(enemy[0],ex[i],ey[i],50,50);
for(int j=0; j<6; j++){ if( (bPx[j] < ex[i]+50) && (bPx[j]+25 > ex[i]) && (bPy[j] < ey[i]+50) && (bPy[j]+25 > ey[i]) ){ bPy[j] = -20; ef[i] = 2; scoreS +=10; break; } } } if ( (ef[i] < 2) && (random(2000)<10) ){ //敵爆弾発生率 bombEAdd(int (ex[i]), ey[i] ); }
}
}
void enemyAdd(){
for(int i=0; i<12; i++){
if( ef[i] == 2){ //未使用の中から敵を追加
ev[i] = random(0.5,2.5);
if (random(100) <50){
ef[i] = 0 ; //左
ex[i] = 600;
ev[i] =-ev[i] ;
}
else{
ef[i] = 1;
ex[i]= -80;
}
ey[i] = int(random(150,650));
break;
}
}
}
void bombPAdd(int[] bPx,int[]bPy,int px,int pw){
for(int i=0; i<3; i++){
if ( bPy[i] == -20){ //未使用の弾を使う
bPx[i] = px + (pw/2)-15; //Pの中心
bPy[i] = 70;
break; //一発のみ
}
}
}
void bombPMove(int[] bPx,int[]bPy){
int bcnt =3;
for(int i= 0; i<3; i++){
if ( bPy[i] >0){
bPy[i] += 5;
bcnt--;
}
if ( bPy[i] >800){ //画面上外
bPy[i] = -20; //未使用に戻す
}
image(bombP,bPx[i],bPy[i]-8,30,30);
//for(int e= 0; e<12; e++){
// if( (bPx[i] < ex[e]+50) && (bPx[i]+25 > ex[e])
// && (bPy[i] < ey[e]+50) && (bPy[i]+25 > ey[e]) ){
// scoreS +=10;
// } //}
}
for(int i=0; i< bcnt; i++){
image(bombP, 230+i*26,10,25,25);
}
}
void bombEAdd(int xx, int yy){
for( int i=0; i<20; i++){
if ( bEy[i] == -20){
bEx[i] = xx +18;
bEy[i] = yy;
if( random(100) < 50 ){
bEv[i] = 1;
}else{
bEv[i] = -1;
}
break;
}
}
}
void bombEMove(int px,int py,int pw,int ph ){
for( int i = 0; i<20; i++){
//bEv[i] = 1;
if ( (bEy[i] > 0) ){
//if( random(100) < 50 ){
bEy[i] -= bEv[i];
// }
//else{
// bEy[i] +=bEv[i];
//}
}
if(( bEy[i] <= 0) || ( bEy[i] >=800) ) {
//if(bEy[i] < 90) {
bEy[i] = -20;
}
if( (bEx[i] < px+pw) && (bEx[i]+10 >px) && (bEy[i] < py+ph) && (bEy[i]+10 >py) ) { bEy[i] = -20; scoreS -=50; } fill(0); rect(bEx[i],bEy[i],10,10);
// image(bombP,bEx[i],bEy[i]-8,10,10);
}
}
void scoreDisp(){
textSize(24);
text( "score:"+scoreS, 10,25);
}
回答1件
あなたの回答
tips
プレビュー