> gimpでボールのイメージを作り、 > ball.gifという名前で保存しようとしたら、 > GIF:Sorry,can't save RGB images as Gifs - convert to INDEXED or GRAY first. > そして、 > Save failed:ball.gif > と表示されて、保存ができません。 > どうすればよいのですか?
> また、 > ”ボールのイメージはgimp等で作っても良いし, > どこかから持ってきても良い.” > と、書いてありましたが、 > ”どこかから持ってくる”というのは、 > 具体的にはどういったことですか?
convert test.jpg test.gif gif16bit test.gif > test1.gifのようにして,gifに変換してからgif16bitで化けないgifファイルに変換して 下さい.
g.fillOval(ball_x,ball_y,ball_size,ball_size);のように円で描いているが,これをイメージファイルを読み込んで,それを表 示するように変更しなさい.ボールのイメージはgimp 等で作っても良いし, どこかから持ってきても良い.
サンプルプログラムではゲームを遊んでいるわけではないことを示すために,
g.drawString("Not a game, but a excercise in CP1(Wed/tanaka)",0,200);という文字列を表示するようにしてあります.この表示は取り除かないで下さ い.
import java.awt.*; import java.awt.event.*; class BallGame extends Frame implements KeyListener{ // ボールの座標,速度のx, y成分の宣言 int ball_x=100,ball_y=100,ball_vx=16,ball_vy=12; // ボールの大きさ int ball_size=20; // 画面の幅,高さ int width=300, height=600; // バーの座標 int bar_x=0, bar_y=550; // バーの速度 int bar_vx=0; // バーの幅,高さ int bar_width=60,bar_height=10; // BallGameクラスのコンストラクタ public BallGame(){ // 親クラスである Frameのコンストラクタを呼ぶ super(); // ウィンドウのサイズを変更 setSize(width,height); // ウィンドウを表示 setVisible(true); addKeyListener(this); } public static void main(String[] args){ // BallGameクラスのインスタンスを作成 BallGame frame=new BallGame(); // スレッドを獲得 Thread t=Thread.currentThread(); for(;;){ // 0.1秒(100ミリ秒)待つ try { t.sleep(100); } catch(Exception e){} // BallGameクラスのインスタンス frame のtimeTickメソッドの呼び出し frame.timeTick(); } } void timeTick(){ // バーの移動 bar_x=bar_x+bar_vx; // 左端から飛び出そうになったら左端に合わせる if(bar_x<0) bar_x=0; // 右端から飛び出そうになったら右端に合わせる else if(bar_x+bar_width >width) bar_x=width-bar_width; // ボールの移動.古い座標を保存 int old_x=ball_x; int old_y=ball_y; // 速度に従って,次の座標を決定 ball_x=ball_x+ball_vx; ball_y=ball_y+ball_vy; // 左端から飛び出そうになったら,反射させる if(ball_x<0){ ball_x= -ball_x; ball_vx= -ball_vx; } // 右端から飛び出そうになったら,反射させる else if(ball_x >width-ball_size){ ball_x=(width-ball_size)-(ball_x-(width-ball_size)); ball_vx= -ball_vx; } // 上端から飛び出そうになったら,反射させる if(ball_y<0.0){ ball_y= -ball_y; ball_vy= -ball_vy; } // バーのある線を通過しそうになったら, else if(ball_y >bar_y && old_y<=bar_y){ // バーのある線を横切るX座標を計算 int x=old_x+(ball_x-old_x)*(bar_y-old_y)/(ball_y-old_y); // バーと接触している場合は反射させる. if(bar_x <= x && x<=bar_x+bar_width){ ball_y=bar_y-(ball_y-bar_y); ball_vy= -ball_vy; } } // 下端から飛び出そうになったら,反射させる else if(ball_y > height){ ball_vy=-ball_vy; } // 再表示 repaint(); } public void paint(Graphics g){ // 描画色を黒にする. g.setColor(Color.black); // 全体を塗り潰す g.fillRect(0,0,width,height); // 描画色を白にする. g.setColor(Color.white); // 警告文字列を(0,200)の点を左下にして描く g.drawString("Not a game, but a excercise in CP1(Wed/tanaka)",0,200); // 描画色を赤にする. g.setColor(Color.red); // ボールを描く g.fillOval(ball_x,ball_y,ball_size,ball_size); // オフスクリーンイメージへの描画色を青にする. g.setColor(Color.blue); // バーを描く g.fillRect(bar_x,bar_y,bar_width,bar_height); } // キーが押された時にこのメソッドが呼ばれる. public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} public void keyPressed(KeyEvent e){ int key=e.getKeyChar(); // 'h' のキーが押された時は,バーの移動速度を -10に if(key=='h'){ bar_vx= -10; } // 'l' のキーが押された時は,バーの移動速度を 10に else if(key=='l'){ bar_vx=10; } // 'j' のキーが押された時は,バーの移動速度を 0に else if(key=='j'){ bar_vx=0; } else if(key=='q'){ System.exit(0); } } }
import java.awt.*; import java.awt.event.*; class BallGame extends Frame implements KeyListener{ // ボールの座標,速度のx, y成分の宣言 int ball_x=100,ball_y=100,ball_vx=16,ball_vy=12; // ボールの大きさ int ball_size=20; // 画面の幅,高さ int width=300, height=600; // バーの座標 int bar_x=0, bar_y=550; // バーの速度 int bar_vx=0; // バーの幅,高さ int bar_width=60,bar_height=10; // BallGameクラスのコンストラクタ Image image; public BallGame(){ // 親クラスである Frameのコンストラクタを呼ぶ super(); // ウィンドウのサイズを変更 setSize(width,height); // ウィンドウを表示 setVisible(true); image=Toolkit.getDefaultToolkit().getImage("ball.gif"); addKeyListener(this); } public static void main(String[] args){ // BallGameクラスのインスタンスを作成 BallGame frame=new BallGame(); // スレッドを獲得 Thread t=Thread.currentThread(); for(;;){ // 0.1秒(100ミリ秒)待つ try { t.sleep(100); } catch(Exception e){} // BallGameクラスのインスタンス frame のtimeTickメソッドの呼び出し frame.timeTick(); } } void timeTick(){ // バーの移動 bar_x=bar_x+bar_vx; // 左端から飛び出そうになったら左端に合わせる if(bar_x<0) bar_x=0; // 右端から飛び出そうになったら右端に合わせる else if(bar_x+bar_width >width) bar_x=width-bar_width; // ボールの移動.古い座標を保存 int old_x=ball_x; int old_y=ball_y; // 速度に従って,次の座標を決定 ball_x=ball_x+ball_vx; ball_y=ball_y+ball_vy; // 左端から飛び出そうになったら,反射させる if(ball_x<0){ ball_x= -ball_x; ball_vx= -ball_vx; } // 右端から飛び出そうになったら,反射させる else if(ball_x >width-ball_size){ ball_x=(width-ball_size)-(ball_x-(width-ball_size)); ball_vx= -ball_vx; } // 上端から飛び出そうになったら,反射させる if(ball_y<0.0){ ball_y= -ball_y; ball_vy= -ball_vy; } // バーのある線を通過しそうになったら, else if(ball_y >bar_y && old_y<=bar_y){ // バーのある線を横切るX座標を計算 int x=old_x+(ball_x-old_x)*(bar_y-old_y)/(ball_y-old_y); // バーと接触している場合は反射させる. if(bar_x <= x && x<=bar_x+bar_width){ ball_y=bar_y-(ball_y-bar_y); ball_vy= -ball_vy; } } // 下端から飛び出そうになったら,反射させる else if(ball_y > height){ ball_vy=-ball_vy; } // 再表示 repaint(); } Image offScreenImage; Graphics offScreenGraphics; public void update(Graphics g){ if(offScreenImage==null){ // 現在のフレームのサイズを求める Dimension d=getSize(); // オフスクリーンイメージを作成 offScreenImage=createImage(d.width,d.height); // オフスクリーンイメージに描画するための Graphics オブジェクト offScreenGraphics=offScreenImage.getGraphics(); } paint(offScreenGraphics); // 次の画面のイメージを作る. g.drawImage(offScreenImage,0,0,this); // イメージを本物のスクリーンに書き込む } public void paint(Graphics g){ // 描画色を黒にする. g.setColor(Color.black); // 全体を塗り潰す g.fillRect(0,0,width,height); // 描画色を白にする. g.setColor(Color.white); // 警告文字列を(0,200)の点を左下にして描く g.drawString("Not a game, but a excercise in CP1(Wed/tanaka)",0,200); // 描画色を赤にする. g.setColor(Color.red); // ボールを描く g.drawImage(image,ball_x,ball_y,this); // オフスクリーンイメージへの描画色を青にする. g.setColor(Color.blue); // バーを描く g.fillRect(bar_x,bar_y,bar_width,bar_height); } // キーが押された時にこのメソッドが呼ばれる. public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} public void keyPressed(KeyEvent e){ int key=e.getKeyChar(); // 'h' のキーが押された時は,バーの移動速度を -10に if(key=='h'){ bar_vx= -10; } // 'l' のキーが押された時は,バーの移動速度を 10に else if(key=='l'){ bar_vx=10; } // 'j' のキーが押された時は,バーの移動速度を 0に else if(key=='j'){ bar_vx=0; } else if(key=='q'){ System.exit(0); } } }