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

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

Java質問&情報提供サイトコミュのJAVA appletについての質問

  • mixiチェック
  • このエントリーをはてなブックマークに追加
学校の課題でどうしてもわからないので、質問させて下さい。

MouseEventsを使ってプログラムで、宇宙船から光線を発信するプログラムなのですが、
1箇所から光線は発信出来るのですが、出した所からそのまま光線が出ていてそれが消えません。
一回クリックするとそれが消えて、再度クリックするとまた新しい光線が出て来る様にしたいのですが、どうしたら良いのでしょうか?


import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.Random;

public class SpaceShip extends Applet implements MouseListener, MouseMotionListener, ActionListener{
AudioClip beams;
private Point point = null;
private final int APPLET_WIDTH = 400, APPLET_HEIGHT = 400;
int x = 0, y = 0;
int count = 0;
Button b1 = new Button("sound on/off");
Button b2 = new Button("count reset");
Label label = new Label("shots: " + count);
Image atom;


public void init(){
addMouseListener(this);
addMouseMotionListener(this);
b1.addActionListener(this);
b2.addActionListener(this);
this.add(b1);
add(b2);
add(label);
beams = getAudioClip(getDocumentBase(),"Bullet.m4r");
setBackground(Color.blue);
setSize(APPLET_WIDTH, APPLET_HEIGHT);
atom = getImage(getDocumentBase(),"cg_atom.jpg");
}

public void mouseEntered(MouseEvent e){
x = e.getX();
y = e.getY();
repaint();
}
public void mouseMoved(MouseEvent e){
x = e.getX();
y = e.getY();
repaint();
}

public void mouseClicked(MouseEvent e){
    point = e.getPoint();
int x = e.getX();
int y = e.getY();
beams = e.getSource();
repaint();
}

public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseDragged(MouseEvent e){}

public void actionPerformed(ActionEvent e){
count = 0;
label.setText("shots: " + count);
}




public void paint(Graphics g){
int width = atom.getWidth(this);
int height = atom.getHeight(this);
g.drawImage(atom,x,y,width/2,height/2,this);

Random generator = new Random();
if (point !=null){

int beam;
beam = generator.nextInt(3);
if (beam == 0)
g.setColor(Color.black);
g.drawLine(x, y, x*200, y*200);

if (beam == 1)
g.setColor(Color.yellow);
g.drawLine(x, y, x*200, y*200);

if (beam == 2)
g.setColor(Color.white);
g.drawLine(x, y, x*200, y*200);

if (beam == 3)
g.setColor(Color.red);
g.drawLine(x, y, x*200, y*200);

}


}
}

まだプログラミングの途中なのですが、ビームのカラーも4色に発射するごとに変えたいのですが、どうも上手く行きません。。。
よろしくお願いします。

コメント(11)

asa さん

課題ということなので答えは控えますが
以下のサイトを参考にしてみてはいかがでしょうか?

http://www.ics.kagoshima-u.ac.jp/edu/taiken2002/JavaVader.html

また、MouseEventを
mouseClicked ではなく
mousePressed と mouseReleased を使用してみてはいかがでしょうか?

マウスボタンが押された時の処理と
マウスボタンが離された時の処理に分けた方が分かりやすいと思いますよ♪
卵の殻を被った黒いのさん

ありがとうございます。試してみます。他にもまだ問題多数ですが、一つずつ頑張ってみます。
宿題期限が来週の月曜日なので、またお願いします。
Javaは本当に難しいです、、、日本語の本が欲しいw
未だに解決できません。
最終的にはこんな形のにしたいのですが。。。

http://hills.ccsf.cc.ca.us/~cconner/Java/SpaceShip/SpaceShip.html
たびたびすみません、
音の設定は出来たのですが、ビームと音のON/OFFの切り替えができません。

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.Random;
import java.io.*;

public class SpaceShip extends Applet implements MouseListener, MouseMotionListener{
AudioClip beams;
private Point point = null;
private final int APPLET_WIDTH = 400, APPLET_HEIGHT = 400;
int x = 0 , y =0 ;
int x_end = 0, y_end = 0;
int count = 0;
Button b1 = new Button("");
Button b2 = new Button("count reset");
Label label = new Label("shots: " + count);
Image atom;


public void init(){
addMouseListener(this);
addMouseMotionListener(this);
//b1.addActionListener(new b1Handler());
b2.addActionListener(new b2Handler());
this.add(b1);
this.add(b2);
this.add(label);
beams = getAudioClip(getCodeBase(),"Bullet.au");
setBackground(Color.white);
setSize(APPLET_WIDTH, APPLET_HEIGHT);
atom = getImage(getDocumentBase(),"cg_atom.jpg");
}

public void mouseEntered(MouseEvent e){
x = e.getX();
y = e.getY();
repaint();
}
//if a mosue moves, atom follows it
public void mouseMoved(MouseEvent e){
x = e.getX();
y = e.getY();
repaint();
}
//draw the lines if a mouse is clicled
public void mousePressed(MouseEvent e){
point = e.getPoint();
repaint();
count++;
label.setText("shots: " + count);
beams.play();
}

public void mouseClicked(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseDragged(MouseEvent e){}

class b2Handler implements ActionListener{
public void actionPerformed(ActionEvent e){
//change a count to zero
count = 0;
label.setText("shots: " + count);

}
}
class b1Handler implements ActionListener{

public void paint(Graphics g){
//put atom as a space ship
int width = atom.getWidth(this);
int height = atom.getHeight(this);
g.drawImage(atom,x,y,width/2,height/2,this);

//draw four colors of lines
Random generator = new Random();
if (point !=null){
int beam = generator.nextInt();
switch (beam%4){

case 1:
beam = 0;
g.setColor(Color.yellow);
g.drawLine(x+85, y+10, x_end, y_end);
x_end = (generator.nextInt()+500)+(generator.nextInt(400)+100);
y_end = (generator.nextInt()+500)+(generator.nextInt(400)+100);
break;

case 2:
beam = 1;
g.setColor(Color.red);
g.drawLine(x+85, y+10, x_end, y_end);
break;

case 3:
beam = 2;
g.setColor(Color.blue);
g.drawLine(x+85, y+10, x_end, y_end);
break;

default:
g.setColor(Color.green);
g.drawLine(x+85, y+10, x_end, y_end);

}
}

}


}
上のプログラムでエラーは出てないですか?
b1Handlerで無理に色々とやろうとせずに
例えば下のように複数に分けて考えてみては?

============
//機体の設定
public void drawShip(Graphics g)
{
g.setColor(Color.green);
if(point1 != null && point2 != null)
{
g.fillOval(point2.x - 5, point2.y - 5, 40, 20);
g.setColor(Color.red);
g.fillRect(point2.x + 13, point2.y - 10, 5, 5);
}
if(point2 != null && point3 != null)
{
switch(laserCounter)
{
case 0: // '\0'
g.setColor(Color.red);
x = 0;
y = 0;
break;

case 1: // '\001'
g.setColor(Color.yellow);
x = 200;
y = 0;
break;

case 2: // '\002'
g.setColor(Color.orange);
x = 200;
y = 200;
break;

case 3: // '\003'
g.setColor(Color.white);
x = 100;
y = 200;
break;

case 4: // '\004'
g.setColor(Color.magenta);
x = 200;
y = 100;
break;

default:
x = 0;
y = 0;
break;
}
if(fire)
{
fire = false;
g.drawLine(point3.x, point3.y, x, y);
if(soundon)
audio.play();
}
}
}

//マウスをクリックした時
public void mousePressed(MouseEvent mouseevent)
{
point3 = mouseevent.getPoint();
fire = true;
hits++;
if(laserCounter >= 6)
laserCounter = 0;
else
laserCounter++;
repaint();
}

//初期値
public void init()
{
addMouseListener(this);
addMouseMotionListener(this);
b1.addActionListener(new B1());
b2.addActionListener(new B2());
add(b1);
add(b2);
audio = getAudioClip(getCodeBase(), "bonk.au");
setBackground(Color.black);
setSize(200, 200);
}

//ラベル文字とショット数の表示変更
public void paint(Graphics g)
{
if(!soundon)
b1.setLabel("sound on");
else
b1.setLabel("sound off");
g.setColor(Color.white);
String s = " " + hits;
g.drawString("Shots" + s, 5, 195);
drawShip(g);
}
b2Handlerと同様に
b1Handlerでボタンを押された時の処理を書けば
音の切り替えもできるようになるはずです。

上部で以下の内容をコメントアウトしていますが、
このb1(左のボタンが押された時の処理)を有効活用しよう!

b1.addActionListener(new b1Handler());
卵の殻を被った黒いのさん
ありがとうございます。
point2, point3はどこから来ているのでしょうか?
未だに底に沈んでいます。。。
asaさん

すみません。
前プログラムの内容に合わせて書けば良かったですね(-_-;)

point系は適当ですw (以下のように宣言しているだけです)
座標を得る働きをしているので x と y で補えば問題無いです。

 private Point point1;
 private Point point2;
 private Point point3;

一応、参考までに以下のサイトをどうぞ
http://wisdom.sakura.ne.jp/system/java/awt/Gjava35.html
卵の殻を被った黒いのさん
ありがとうございます。
結局、今日がdue dateだったので、サウンド(extra credit)は諦め、提出しました。。。
また来週、assignmentがあるので、またこちらに質問するかと思います。
本当に色々助かりました。ありがとうございます。

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

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

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

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

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