読者です 読者をやめる 読者になる 読者になる

bam6o0の記憶域

忘備録になればいいな

壁で跳ねるボールを作る(ボタン付き)

課題で制御ボタン付き壁で跳ねるボールを作ったので公開。

/*
  mainApplet.java
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

/*
  <applet code = "mainApplet" width = 660 height = 500>
  </applet>
*/

public class mainApplet extends Applet implements ActionListener{
  myCanvas canvas;
  Button b[];

  public void init(){
    setLayout(null);  //setBoundsでレイアウトを指定できるようにする
    setBackground(Color.lightGray); //背景色を指定
    canvas = new myCanvas();
    canvas.setBounds(10,10,500,500);  //Applet上のCanvasの左上位置と大きさを指定する
    add(canvas);
    canvas.start();

    //ボタン作成
    b = new Button[2];
    b[0] = new Button("start");
    b[1] = new Button("stop");

    for(int i=0;i < 2;i++){
      b[i].addActionListener(this);
      b[i].setBounds(250+i*40,520,40,20);
      add(b[i]);
    }
  }
  public void actionPerformed(ActionEvent e){  //開始と停止の制御
    if(e.getSource() == b[0]){
      canvas.waitFlag = false;
    }else if(e.getSource() == b[1]){
      canvas.waitFlag = true;
    }
  }
}
/*
  myCanvas.java
*/
import java.awt.*;
//ダブルバッファリングを備えたCanvasの作成
public class myCanvas extends Canvas implements Runnable{
  int x = 10;
  int y = 15;
  int x_speed = 10;
  int y_speed = 10;
  boolean waitFlag;
  Thread th;
  Image buffer;
  Graphics bufferg;

  public myCanvas(){
    th = new Thread(this);
    waitFlag = false;
  }

  public void start(){
    Dimension d =  getSize();
    buffer = createImage(d.width,d.height);
    th.start();
  }
  public void run(){
    try{
      while(true){
        if(!waitFlag){
          repaint();
        }
        th.sleep(100);
      }
    }catch(Exception e){}
  }

  public void update(Graphics g){
    paint(g);
  }
  public void paint(Graphics g){    //painの中に描画ルーチンを書きます
    // バッファのグラフィックコンテキストを取得する
  if(bufferg == null)
    bufferg = buffer.getGraphics();


  // バッファを描画する
  Dimension d = getSize();
  bufferg.setColor(Color.white);
  bufferg.fillRect(0, 0, d.width, d.height);
  bufferg.setColor(Color.black);
  bufferg.fillOval(x, y, 50, 50);


  // ウィンドウを更新する
  g.drawImage(buffer, 0, 0, this);

  // x座標を増やす
  x += x_speed;
  if(x + 50 > d.width || x < 0)
    x_speed = -x_speed;
  // y座標を増やす
  y += y_speed;
  if(y > d.height || y < 0)
    y_speed = -y_speed;
 }
}
<HTML><HEAD><TITLE>HelloWorld.java</TITLE></HEAD>
<BODY><H1>HelloWorld.javaのテスト</H1><HR>
<APPLET CODE="mainApplet" WIDTH=500 HEIGHT=500></APPLET>
</BODY></HTML>

実行方法

$javac *.java
$appletviewer mainApplet.html

実行結果  

f:id:bam6o0:20170118103101g:plain

球の一部が枠から飛び出してしまう。気が向いたら直す。
参考資料