Javaゲーム制作記

いろいろ作ってます  

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | Comment(-)

物理エンジン

実は最近ゲームの館のほうが更新が途絶え気味です・・・。

更新サボって物理エンジンを作ってます(´∀`)
作っては消し作っては消し・・・
なので、



そろそろEclipseが・・・










臨界状態です
消そうかなーいややっぱり勿体無いかなーのループが永遠に回り続けてます。


しかし最近Eclipseがよく「応答なし」になります。

応答なしになるとき

・起動直後

・新規パッケージ、クラスを作ろうとしたとき

・パッケージを開いたとき

・エディターを開いたとき

・クイック・スフィックス発動時

・デバッグ開始時

・終了しようとしたとき

・その他、Eclipseの気分次第で


さすがにキツいです。
誰か対処法を知ってたら教えてくださいO| ̄|_


Eclipse臨界のお知らせでした。
[ 2009/09/05 11:04 ] 物理演算 | Comment(4)
どうも
patoleです。
やっと投稿できました!

物理エンジンというものが、実際どんなものか、よく分かりませんが><


C言語では、while文を書くと、ある処理を書かないと、必ず応答なしになってしまうんです。
僕は、C言語のDXライブラリを主に使っていますが、そのコピー↓
「 
ProcessMessage( void ) ;
この関数はWindows環境でのソフトプログラムに付きまとう メッセージループ処理を肩代わりしてくれる関数です。
 この関数がなにをしているのか、というのは特に気にする 必要はありませんが、とにかく定期的にこの関数を呼び出して やる必要があります。
 目安としては60分の1秒に一回程度、用はゲームのループに 一回程度です。この関数を呼び出さないと結果としてシステムが 異常に重くなったり不安定になったりします。
 あと、エラーが発生したらなるべく早めにDxLib_Endで ライブラリ使用を終了し、同時にプログラムも終了する必要があります。


こんなことは、関係ないでしょうかね……



あと、一応ブロック崩しw
今なら、つくることできると思いますよ。
これだけたくさんの、物理ゲームとか作っていたら。

ブロックへのあたり判定は、僕の場合、ピタゴラスの定理とか、そんな難しいのは利用せず(逆にできないかもw)、玉の座標の位置であたり判定をしましたw
ブロックの上に当たった場合、右、左、下と。
上、下は、玉のYの向きを反転させて、右、左は、玉のXの向きを反転させれば、できます。
角に当たった場合は、このやりかたでやれば、自動で、XとYの向きを反転させてくれます。

パトルシューターは、一番つくるの簡単だったかな?
[ 2009/09/05 13:09 ] [ 編集 ]
コメントありがとうございます~
実は自分もC言語をやってて・・・
DXライブラリもやってましたw
>>こんなことは、関係ないでしょうかね……
細やかな説明ありがとうございます。
実は応答なしになるのはEclipseのほうですので、どうしようもないんです(・・;)
まあできるとしたら環境設定を変えるくらいなんですO| ̄|_

Eclipseとは:javaの開発キット。javaをやるならこれ!たとえるならVisual C++みたいなものです。


>>上、下は、玉のYの向きを反転させて、右、左は、玉のXの向きを反転させれば、できます。
>>角に当たった場合は、このやりかたでやれば、自動で、XとYの向きを反転させてくれます。

基本的にはそれでいいんですが、もし球がブロックにめり込んだとき、振動してしまうのを防ぐ為に
球とブロックとの相対速度を調べて、球がブロックに向かって移動しているときのみ衝突したとすると、めり込まずにすみますよ。
>>パトルシューターは、一番つくるの簡単だったかな?
すごいですね!自分は最も苦労したところでしたO| ̄|_

>>物理エンジンというものが、実際どんなものか、よく分かりませんが><
それはもったいないですよ!
ほんとに楽しいものなんです。ええ。
有名なものではBox2DFlashAS3、PhysXなどがあります。
詳しくは、ここのBox2DFlashAs3へのリンクをチェックしてください~
ttp://box2dflash.sourceforge.net/
[ 2009/09/05 13:54 ] [ 編集 ]
やっぱり、関係ありませんでしたか……
僕は、なにもできませんが、がんばってください!

C言語、やってたんですね!
実は、僕も、JAVAの、Eclipseで、微妙にやってます。
が、
わかりません!
難しいです><
ウィンドウを表示するとこまでは、わかったんですが、その次の、画面になにかを表示したり、本には、タイマー的なことを書いてたので、やってみましたが、エラーばっかりになって……
何度も挑戦してみましたが、そこでつまずいてしまい、そこから進んでないです><


もしかして、パトルシューターでも、めりこんで振動してしまいましたか!?
プログラムで書く際に、一応そういうのの対策(固いブロックとかに、2回激突したことにならないように)として、

if(上に当たったら){
処理
}
else if(下に当たったら){
処理
}
else if(左に当たったら){
処理
}
else if(右に当たったら){
処理
}
のように、else ifで、やってますが……
一応僕は、これでいけてます!

[ 2009/09/07 22:35 ] [ 編集 ]
めり込んでなかったですよ。
大丈夫です。
ちゃんと対策が取られてありましたからね^^

ただ、一つバグ発見しました
1 ブロック(壊れないやつ)にぶつかる瞬間に
2 ポーズする
3 うまくいけば、ウルルルルルルルルルルル!!ってなりますw
ぜひ試してみてくださいw

それと、java、やってたんですね!
自分も、始めはそこで引っかかりました(・・;)
けどそこを乗り越えればかなり楽になるので、ぜひがんばってください!

ただがんばれ~と言っているのも何なので、サンプルソースをお持ちしました。MainFrame.javaというクラスを作って、その中にコピーすればすぐ使えます。

コメントが鬼のようについてますので、分かると思いますww


//ここからソースコード

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

//画面にいろんな図形を描くサンプルです
public class MainFrame extends JFrame {

private String title = "ここにフレームのタイトルを入力";

// コンストラクタ(フレームが作られたときに呼ばれる)
public MainFrame() {
// タイトルを設定
setTitle(title);
// サイズを変更不可能にする
setResizable(false);
// パネルを追加(このパネルの上に画像などを表示します)
MainPanel panel = new MainPanel();
// contentPane(フレームの土台)を取得(このフレームの土台の上にボタンやパネルなどを乗せます)
Container contentPane = getContentPane();
// フレームの土台にパネルを追加
contentPane.add(panel);
// フレームのサイズをパネルのサイズに合わせる
pack();
}

// C言語のWinMain関数に相当 全てはここから始まる
public static void main(String[] args) {
// フレームを作る
MainFrame frame = new MainFrame();

// 閉じるボタンが押されたら閉じる
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 表示する(表示できるようにする)
frame.setVisible(true);
// デスクトップの中央に表示
frame.setLocationRelativeTo(null);
}

// パネルのクラス
public class MainPanel extends JPanel implements Runnable {

// スレッド(これが無いとアニメーションを表示できない つまりゲームを作れない)
Thread thread;

// 横サイズと縦サイズ
private int width = 400;
private int height = 400;

// コンストラクタ(フレームが作られたときに呼ばれる)
public MainPanel() {
// パネルの基本サイズを指定する(フレームのサイズはこのサイズに合わせられる)
setPreferredSize(new Dimension(width, height));
// スレッド作成
thread = new Thread(this);
// スレッド開始!
thread.start();
}

// ここに表示処理を書く(毎回呼び出される)
public void paintComponent(Graphics g) {
// バックグラウンド塗りつぶし作業
g.setColor(Color.lightGray);
g.clearRect(0, 0, width, height);
// 色を青に設定
g.setColor(Color.blue);
// いざ描画!(横長の楕円形を描画)
g.fillOval(100, 100, 150, 100);
// 色を赤に設定
g.setColor(Color.red);
// 四角形を描画
g.fillRect(200, 200, 100, 50);
// 色を緑+半透明に設定
g.setColor(new Color(0, 255, 0, 150));
// 角丸四角形を描画
g.fillRoundRect(150, 150, 100, 200, 50, 50);
}

// 一定間隔で呼び出される
public void run() {

// ここにゲームのメイン処理

// 再描画
repaint();

try {
// 休止を入れないとCPU利用率が100%+動く速度が異常(目に見えない)
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

//ここまでソースコード



※Eclipseにコピーしたら「Ctrl + Shift + F」を押してください。
自動でインデントされます。
[ 2009/09/08 10:21 ] [ 編集 ]
コメントの投稿




※URL記述の際はttp://としてください


プロフィール

saharan

Author:saharan

Twitter
検索フォーム


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。