小さな恐竜の実行
このプロジェクトは本の例であり、プログラミングの実装を自分で行いました。作成の難しさと関連する技術的なポイントを以下に示します。
このプロジェクトは、スレッドの概念、アニメーション効果の実現、
AWTを使用したゲーム画面の描画の学習、Rectangleクラスの衝突検出の実現、javax.soundパッケージの使用によるサウンド再生の実現など、Javaの基本操作で構成されています。
1.スレッド
はスレッドプロジェクトの重要な部分です。恐竜の実行を実現するプロセスでは、実際に画像を繰り返して再描画するため、このプロセスの制御にはスレッドの概念を使用する必要があり、スレッドを介してのみ制御関連を改善できます。プロセス。たとえば、恐竜が走っている様子を実感するために、実際には3枚の恐竜の絵を連続して描いており、走っているような効果を視覚的に表現しています。FreshTheadクラスの下には、ゲーム内の更新フレームスレッドクラスがあります。これは、Threadスレッドクラスを継承し、スレッドのmainメソッドで無限にループし、一定期間が経過するたびにゲームパネルを再描画します。 repaint()メソッド。再描画の前に、ユーザーが入力した指示が最初に実行されるため、毎回描画される画像が異なり、非常に短時間で画像を切り替えることでアニメーションの効果が得られます。
2. AWT描画
ゲームのメインインターフェイスはゲームのコアです。最初にJFrameのフレームが作成され、次に背景画像が描画されます。背景画像は実際には順番に再生される画像です。同一の写真を2枚定義し、開始点を定義します。位置を決め、毎回少し左に移動してから、後ろの画像を接続し、現在の画像を最後まで検出して自動的にクリアし、すぐに描画します。彼の後に。たとえば、パネルの幅が800の場合、最初の画像の開始位置は0、2番目の画像の開始位置は800です。左に5移動するたびに、5が減算されるため、次のようになります。最初の画像の座標は-800で、画像全体がパネルを離れ、背景のスクロール効果を実現するために、800の座標に再割り当てされます。
恐竜のクラスと障害物のクラスもあり、画像オーバーレイの原理を使用して、最初に背景画像を描画し、次に恐竜と障害物を描画し、ゲームのインターフェイスが実現されます。動きの効果は実際にはx座標の絶え間ない変化であり、恐竜のジャンプはy座標の絶え間ない変化です。
public BackgroundImage() {
try {
image1=ImageIO.read(new File("image/99.jpg"));
image2=ImageIO.read(new File("image/99.jpg"));
} catch (Exception e) {
e.printStackTrace();
}
image=new BufferedImage(800, 400,BufferedImage.TYPE_INT_RGB);
g2=image.createGraphics(); //获取主图片绘图对象
x1=0;
x2=800;
g2.drawImage(image1,x1,0,null);
}
public void roll() {
x1-=SPEED; //第一幅图片左移
x2-=SPEED; //第二幅图片左移
if(x1<=-800) {
x1=800;
}
if(x2<=-800) {
x2=800;
}
g2.drawImage(image1, x1, 0,null);
g2.drawImage(image2, x2, 0,null);
}
3.長方形の衝突検出
if(o.getBounds().intersects(golden.getFootBounds())||o.getBounds().intersects(golden.getHeadBounds())) {
Sound.hit();
gameOver();
}
oは障害物の境界線、金色は恐竜の境界線です。衝突した場合は、ヒット音を鳴らしてゲームオーバーを実行すると、ゲームロジックが確立されます。
4. javax.soundパッケージは
、私にとって最も複雑な部分であるサウンド再生を実装します。java形式の制限により、wavやMP3などの少数のタイプの音楽しか使用できません。また、音楽のカットも非常に複雑です。また、背景素材を見つけるのも困難です(関連情報を持っている学生は、このプロジェクトを一緒に改善するために私を見つけることができます)。
原則は
byte[] auBuffer=new byte[1024*128]; //创建128k缓冲区
do {
AudioInputStream audioinputstream=null; //创建音频输入流对象
SourceDataLine auline=null; //混频器源数据行
try {
//从音乐文件中获取音频输入流
audioinputstream=AudioSystem.getAudioInputStream(soundFile);
AudioFormat format=audioinputstream.getFormat(); //获取音频格式
//按照源数据行类型和指定音频格式创建数据行对象
DataLine.Info info=new DataLine.Info(SourceDataLine.class, format);
//利用音频系统类获得与指定line.info对象中匹配的行对象
auline=(SourceDataLine)AudioSystem.getLine(info);
auline.open(format); //按照指定格式打开源数据行
auline.start(); //源数据行开启读写活动
int byteCount=0; //记录音频输入流读出的字节数
while(byteCount!=-1) {
//如果音频输入流中读取的字节数不为-1
byteCount=audioinputstream.read(auBuffer, 0, auBuffer.length);//从音频数据流中读取128k的数据
if(byteCount>=0) {
//如果读出有效数据
auline.write(auBuffer, 0, byteCount); //将有效数据写入数据行中
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
auline.flush();
} catch (Exception e2) {
System.out.println("666");
}
auline.drain();
auline.close();
}
} while (circulate); //根据循环标志判断是否循环播放
次に、判断などによって対応する音楽を再生します!
5.実行中のゲームのスクリーンショット
フォルダをアップロードできません。ファイルが必要な友達や興味のある友達からプライベートメッセージを送ってください。
私は大学生で、新人です。上司の指導を歓迎し、みんなが好きでフォローしてくれることを歓迎します!