ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのJavaアプレットで一人テニスをするゲームです。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
大学の課題で、Javaアプレットを用いて一人テニスをするゲームのソースを書いています。ダブルバッファリングをかけようとしたところ、変な動きをして、なかなか修正できません。

期限は月曜日までですが、よろしくお願いします。

ソース1 訂正前
----------------------------------------------------------------------------------------------------------
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class TableTennis extends Applet {
final int w = 400, h = 400;
final int racket_r = 25;
final int racket_h = 10;
final int racket_speed = 16;
int racket_x = 400, racket_y = 380;
int ball_x, ball_y, ball_r;
int vec_x = 1, vec_y =1;

public void init(){
setSize(w,h);
Racket racket = new Racket();
racket.start();
ball_x = 40; ball_y = 40; ball_r = 30;
vec_x = 1; vec_y = 1;
Ball ball = new Ball();
ball.start();
}

public void paint(Graphics g) {
g.drawRect(racket_x - racket_r, racket_y, 2* racket_r, racket_h);
g.drawOval(ball_x-ball_r,ball_y-ball_r,2*ball_r,2*ball_r);
}

//ラケットクラス
public class Racket implements MouseMotionListener {
public void start() {
addMouseMotionListener(this);
}
public void mouseDragged(MouseEvent e){}
public void mouseMoved(MouseEvent e){
racket_x = e.getX(); racket_y = 380;
repaint();
}
}

//ボールクラス
public class Ball implements Runnable{
Thread t1;

public void start() {
Thread t1 = new Thread(this);
t1.start();
}
public void run() {
while(true) {
if(ball_y + ball_r == racket_y &&
ball_x>=racket_x - racket_r &&
ball_x<=racket_x + racket_r){vec_y = -1;}
else if(ball_y - ball_r ==0){vec_y = 1;}
if(ball_x+ball_r == 400){vec_x = -1;}
else if(ball_x-ball_r == 0){vec_x = 1;}
ball_y += vec_y; ball_x += vec_x;
try{t1.sleep(2);
}catch(InterruptedException e){}
repaint();
}
}
}
}

-----------------------------------------------------------------------------------------------------------

出力:正常であるものの、画面のちらつきが気になる。

コメント(6)

只今作成中のソースがこちらです。
ソース2(作成中)
-------------------------------------------------------------------------------------------------------------
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;//バッファ画面の作成
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class TableTennis extends Applet {
final int w = 400, h = 400;
int racket_r; int racket_h;//ラケットの大きさ
int racket_speed;//ラケットの速度
int racket_x, racket_y ;
int ball_x, ball_y, ball_r;
int vec_x = 1, vec_y =1;
Image imgBuf;
Graphics gBuf;

public void init(){
setSize(w,h);
racket_x = 200; racket_y = 380;//ラケットの位置
racket_h = 10; racket_r = 50; racket_speed = 25;
Racket racket = new Racket();
racket.start();
ball_x = 40; ball_y = 40; ball_r = 20;
vec_x = 1; vec_y = 1;
Ball ball = new Ball();
ball.start();
imgBuf = createImage(w,h);//バッファの準備
gBuf = imgBuf.getGraphics();
}

public void paint(Graphics g) {
g.drawImage(imgBuf,0,0,this);
}
public void update(Graphics g) {
paint(g);
}

//ラケットクラス
public class Racket implements MouseMotionListener {
public void start() {
addMouseMotionListener(this);
}
public void mouseDragged(MouseEvent e){}
public void mouseMoved(MouseEvent e){
racket_x = e.getX(); racket_y = 380;
gBuf.setColor(Color.white);//画面の着色
gBuf.fillRect(racket_x - racket_r, racket_y, 2* racket_r, racket_h);
gBuf.setColor(Color.blue);//ラケットの着色
gBuf.fillRect(racket_x-racket_r, racket_y-racket_r, 2*racket_r,2*racket_r);
gBuf.setColor(Color.black);//ボールの着色
gBuf.fillOval(ball_x-ball_r,ball_y-ball_r,2*ball_r,2*ball_r);
repaint();
}
}

//ボールクラス
public class Ball implements Runnable{
Thread t1;
public void start() {
Thread t1 = new Thread(this);
t1.start();
}
public void run() {

while(true) {
if(ball_y + ball_r == racket_y &&
ball_x>=racket_x - racket_r &&
ball_x<=racket_x + racket_r){vec_y = -1;}
else if(ball_y - ball_r ==0){vec_y = 1;}
if(ball_x+ball_r == 400){vec_x = -1;}
else if(ball_x-ball_r == 0){vec_x = 1;}
ball_y += vec_y; ball_x += vec_x;
try{t1.sleep(8);
}catch(InterruptedException e){}
repaint();
}
}
}
}
------------------------------------------------------------------------------------------------------------
出力:ラケット、ボールの軌跡ばかり残る(写真参照)。
ボールは右斜め下へ、ラケットは左側へ動いた跡が残っています。

#なお、編集環境は
MacBook 4.1
OS version 10.5.6
Application Eclipse 3.4(English version)です。
よろしくお願いします。
見えてないバッファ(imgBuf)を書き換える際に、一度バッファを背景色で塗りつぶしていないからでは?

以下の部分が間違っている気がします。
gBuf.setColor(Color.white);//画面の着色
gBuf.fillRect(racket_x - racket_r, racket_y, 2* racket_r, racket_h);

ここで画面全体を塗りつぶすべきです。


ところで、なぜRacketクラス内で、且つマウスの移動時にバッファの書き換えを行っているのでしょうか?
普通に考えると、TableTennisクラス内のpaintメソッドでバッファの書き換えを行うべきだと思うんですが。
どうでもいいですけど、AWTじゃなく、Swingならデフォでダブルバッファリングしませんでしたっけ?
コメントが遅くなって申し訳ございません。
皆様、ご指摘ありがとうございます。

>2.鳥猫さん
その文を入れたところ、アプレット画面全体が白くなって何も映らなくなりました。

>3.Seraphさん
>>gBuf.fillRect(racket_x - racket_r, racket_y, 2* racket_r, racket_h); //×

>gBuf.fillRect(0,0,w,h);
と書き替えたところ、軌跡は無事に消えました。

>4.しゅべるたーさん
すみません、私にはそこまでの基礎知識はありませんのでそこまでは存じ上げておりません。
> 4

BufferedImage とか、そんな感じの使えばおk
数年使ってないから、間違ってるかもね。指摘よろ

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング