パックマンを反転させたい

このQ&Aのポイント
  • 現在、パックマンが壁にぶつかると跳ね返りはするのですが、そのまま右向きで口をパクパクとしてしまいます。なんとか左向きにしたいとarcを色々いじったりして試行錯誤しているのですが、どのようにすればわかりません。
  • 壁にぶつかったとき左向きにするためにはどのようにプログラミングすればよいのでしょうか。
  • 現在のプログラムでは、パックマンの位置を表す変数「i」とパックマンの口の開き具合を表す変数「j」の値を増減させることでパックマンの移動を表現しています。壁にぶつかると「i」の値が増減の方向を反転させることで跳ね返り動作を実現していますが、右向きになってしまいます。左向きにするためにはどのような修正が必要でしょうか。
回答を見る
  • ベストアンサー

processingでパックマンを反転させたい。

【processingでパックマンを反転させたい。】 現在、パックマンが壁にぶつかると跳ね返りはするのですが、そのまま右向きで口をパクパクとしてしまいます。 なんとか左向きにしたいとarcを色々いじったりして試行錯誤しているのですが、どのようにすればわかりません。 壁にぶつかったとき左向きにするためにはどのようにプログラミングすればよいのでしょうか。 int i=25,j=0; int mflag =1; int rflag =1; void setup(){ size(400,50); smooth(); noStroke(); frameRate(20); } void draw(){ background(255); fill(0,0,0); arc(i,25,50,50,radians(j),radians(360-j)); i+= rflag * 5; j+= mflag * 8; if(j>40||j<0){ mflag = -mflag; } if(i==25||i==375){ rflag = -rflag; } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

あ~少しわかってきた。 int rflag =1; これが向きですね。 ならば if (rflag>0) { arc(i,25,50,50,radians(j),radians(360-j)); } else { arc(i,25,50,50,radians(j-180),radians(180+j)); } こんな感じかな。。 恐らく"i"がxを表していると仮定しての、回答です。

その他の回答 (1)

回答No.1

この言語は、ちなみ、わかっていません。 arc(i,25,50,50,radians(j),radians(360-j)); ここが、妙に気になるのですが、 arc(i,25,50,50,radians(180+j),radians(180-j)); だとどんな感じでしょう? 360が、1周円なら、半分が半周円ですので、 180プラスマイナスnで 口が開くように感じます。 もしそれで、「反対向き」にパクパクしていたら。 次は、方向ベクトルで、 右に加算なのか、左に加算(Xからみたら減算) を判断して、方向をかえればOKでしょう。 それを、arcのどちらを表示にするか? これで、解決しそうな感じです。

関連するQ&A

  • Processingでの10進数表示について

    初めて質問させていただきます。プログラミングについては、全くの初心者です。 Processingで10000からのカウントダウンタイマーを作りたいと思い、様々なサイトを参考にさせていただき、次のようなプログラムを作りましたが、16進数での表示となっており、これを10進数表示に変える方法がどうしても分かりません…。 /** * Countdown(int) * */ import processing.video.*; MovieMaker mm; PFont font; String t; int cont; void setup(){ size(1200, 480); mm = new MovieMaker(this, 1200, 480, "Countdown.mov", 1, MovieMaker.VIDEO, MovieMaker.LOSSLESS); frameRate(100); background(1); smooth(); textSize(400); cont = 10000; } void draw(){ background(0); t = hex(cont, 5); if(cont < 16){ fill(255, 0, 0); } text(t,50,400); if(cont > 0){ cont -= 1; } mm.addFrame(); } void keyPressed() { if (key == ' ') { mm.finish(); println("save movie."); exit(); } } 色々と調べて、どうもhexの部分が良くないのではと思っているのですが、これをどのように変えても上手く行きません。 無知なもので、大変お恥ずかしい質問かと思いますが、ご教示のほどよろしくお願いいたします。

  • processingのマウス操作について

    現在processingを使って、画像のような図を作り、マウスでクリックしたところだけに色がついて、もう一度クリックすると色が消えるというプログラミングを作りたいと思っているのですが、なかなかうまくできません。 以下現在打ち込んでいるものです // Click within the image to change // the value of the rectangle after // after the mouse has been clicked int value = 255; int rect_size = 50; int num = 300 / rect_size; int x; void setup(){ size(300,300); } void draw(){ fill(value); for (int i = #ffffff;i < num;i++){ for (int j = 0;j < num;j++){ if (j%2 == 0){ x = i*rect_size*2; } else { x = i*rect_size*2+rect_size; } rect(x,j*rect_size,rect_size,rect_size); } } } void mouseClicked() { if (value == 255) { value = #aaaaaa; } else { value = 255; } } 使用言語はすべて英語です。 おそらく、drawのところでパターンとしてチェック模様を書いてしまっているのと、1マスだけに限定するという風な命令を書けていないからだと思うのですが、先生に訊いてもよくわかりません。 ご存じの方はご指導ご鞭撻のほどどうぞよろしくお願いします。

  • Processingでのキーの同時入力

    Processingでゲームを作ろうとしているのですがキーボードの同時入力がうまくいきません。 例えば下記のようなキー入力に応じて黒い四角が動くプログラムを実行しました。方向キーを一つだけ押したときはサクサク動いてくれるのですが、→と↓を同時に押しても斜めに進んでくれません。また、→と←を押した場合もどちらか片方の方に動いてしまいます。 このような問題を解決したいので、Processingでキーボードの同時入力を判定するにはどのようにすればいいのか教えてください。 float x, y; void setup(){ size(400, 400); noStroke(); smooth(); } void draw() { background(255,255,255); fill(0,0,0); rect(x,y,20, 20); if (keyPressed && key == CODED){ if (keyCode == LEFT){ x -= 2; } if (keyCode == RIGHT){ x += 2; } if (keyCode == UP){ y -= 2; } if (keyCode == DOWN){ y += 2; } } }

  • processingのプログラムの書き方について。

    課題で、どこからマウスをプレスしても20個もの四角を(0,0)まで数珠つなぎみたいにするプログラムをかいているんですが全然わかりません。 そのため大きさなどは瞬時に計算をするからmouse x, mouse yをつかいます だからrect(mouseX,mouseY,mouseX,mouseY)になると思うんですが。。 とにかく全部わかりません。教えてください。 自分が書いたのはこんなのですが、全然違います。 forループ、mouseX, mouseYを使うのはわかります int s = 600; int n = 20; int i = mouseX; void setup() { size(s,s); background(255); noStroke(); rectMode(CENTER); } void draw() { if(mousePressed) { for(int i=0; i<s; i++); { fill(255,0,0); rect(mouseX,mouseY,mouseX,mouseY); } } }

  • processingについて

    millis 関数を用いてマウスを押している間の経過時間をマウスカーソルの位置に表示するプログラムを作成せよ。 また、その時点での経過時間の最も長い時間をウインドウに左下に表示してある。動作するように、空欄を埋めよ。 また、変数宣言がされていない変数がある。適切な変数宣言を加えよ。この変数宣言のための空欄は用意されていない。という問題の一番最初の変数宣言?でつまずいています。 プログラムはこんな感じです。 PFont font; int maxTime; (a) pressing=false; void setup(){ size(400,400); maxTime = 0; smooth(); (b) textFont(font,24); } void draw(){ background(255); fill(0); if(mousePressed){ if(pressing == (c)){ startTime = millis(); pressing = (d); } interval = (e)-startTime; text(interval,mouseX,mouseY); }else{ pressing = (f); } if((g)> maxTime){ maxTime = (h); } text(maxTime,0,height-textDescent()); } 一番最初の、(a) pressing=false;の(a)に入るものが分かりません。 他のカッコは回答しなくてもよいので、(a)に入るものを教えてください。 そこさえ分かれば自分で解けそうな気がします。

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • javaで素数判断プログラム作成しましたが…,

    javaで素数判断プログラム作成しましたが,うまく動きません。 以下のように作成しました。 5行目のint j=1;をint j=2;に変更すれば綺麗に動くのですが,j=1からスタートすると何も表示されずに処理が終わってしまいます。 なぜでしょうか。 お手すきの時で構いませんので教えて頂けませんでしょうか? class PrimeNum{ public static void main(String[] args){ int i=2; while(i<100){ int j=1; while(j <= i){ if(i%j==0){ if((i/j) != 1 ){ j=i+1; } if(i==j){ System.out.print(i+" "); } } j++; } i++; } } }

    • ベストアンサー
    • Java
  • ライフゲームにボタンを押すと何度も自動で更新されるように作りたいのです

    ライフゲームにボタンを押すと何度も自動で更新されるように作りたいのですが ↓を変えて更新されるようにするにはどうすればいいですか? public class Lifegame extends Applet implements ActionListener{ int hani = 30; int xy = 15; int sikaku = xy-2; int [][]a = new int[hani][hani]; int [][]b = new int[hani][hani]; Button button; public void init(){ for(int i=0; i < hani; i++) { for(int j = 0;j < hani; j++) { if(i==0 || j == 0 || i == hani || j == hani){ b[i][j] =0; }else{ b[i][j] = (int)(Math.random()*2); } } } button = new Button("更新"); button.addActionListener(this); add(button); } public void paint(Graphics g){ for(int i = 1; i < hani - 1; i++){ for(int j = 1; j < hani - 1; j++){ if(b[i][j] == 1){ g.setColor(Color.green); g.fillRect(i*xy, 30+j*xy, sikaku, sikaku); }else if(b[i][j] == 0){ g.setColor(Color.black); g.fillRect(i*xy, 30+j*xy, sikaku, sikaku); } } } } public void actionPerformed(ActionEvent arg0){ for(int i = 1; i < hani - 1; i++){ for(int j = 1; j < hani - 1; j++){ a[i][j] = b[i][j]; } } for(int i = 1; i < hani - 1; i++) { for(int j = 1; j < hani - 1; j++) { int hantei = a[i - 1][j - 1] + a[i - 1][j] + a[i - 1][j + 1] + a[i][j-1] + a[i][j + 1] + a[i+1][j-1] + a[i+1][j] + a[i+1][j+1]; if(b[i][j] == 1){ if(hantei == 2 || hantei == 3){ b[i][j] = 1; }else{ b[i][j] = 0; } }else if (b[i][j] == 0){ if(hantei == 3){ b[i][j] = 1; }else{ b[i][j] = 0; } } } } repaint(); } } ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • 昇順と降順

    C言語でクイックソートを行うプログラムを探していたところ、希望していたものが見つかりました。 このプログラムは与えられた数列を昇順に並び替えるものなのですが、これを降順に並び替えるにはどうしたらよいでしょうか? いろいろ試してみたのですが、無限ループになってしまいます。 #include <stdio.h> void QSort(int x[ ], int left, int right); void Swap(int x[ ], int i, int j); void ShowData(int x[ ], int n); void main(void); /* クイックソートを行う */ void QSort(int x[ ], int left, int right) { int i, j; int pivot; i = left; /* ソートする配列の一番小さい要素の添字 */ j = right; /* ソートする配列の一番大きい要素の添字 */ pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */ while (1) { /* 無限ループ */ while (x[i] < pivot) /* pivot より大きい値が */ i++; /* 出るまで i を増加させる */ while (pivot < x[j]) /* pivot より小さい値が */ j--; /* 出るまで j を減少させる */ if (i >= j) /* i >= j なら */ break; /* 無限ループから抜ける */ Swap(x, i, j); /* x[i] と x[j]を交換 */ i++; /* 次のデータ */ j--; } ShowData(x, 10); /* 途中経過を表示 */ if (left < i - 1) /* 基準値の左に 2 以上要素があれば */ QSort(x, left, i - 1); /* 左の配列を Q ソートする */ if (j + 1 < right) /* 基準値の右に 2 以上要素があれば */ QSort(x, j + 1, right); /* 右の配列を Q ソートする */ } /* 配列の要素を交換する */ void Swap(int x[ ], int i, int j) { int temp; temp = x[i]; x[i] = x[j]; x[j] = temp; } /* n 個のデータを表示する */ void ShowData(int x[ ], int n) { int i; for (i = 0; i < n ; i++) printf("%d ", x[i]); printf("\n"); } void main(void) { /* ソートする配列 */ int x[ ] = {6, 3, 1, 7, 0, 4, 8, 5, 2, 9}; int n = 10; printf("ソート前:\n"); ShowData(x, n); printf("ソート中:\n"); QSort(x, 0, n - 1); printf("ソート後:\n"); ShowData(x, n); }

専門家に質問してみよう