トップページgamedev
987コメント388KB

Javaでゲーム作成 2本目

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2005/10/27(木) 09:43:50ID:dzSvRQXE
Javaでのゲーム作成について情報交換をするスレです。
ゲーム作成以外の話題はム板(http://pc8.2ch.net/tech/)、
他言語に関する話題は他スレでお願いします。

前スレ
JAVAでゲーム作成
http://pc8.2ch.net/test/read.cgi/gamedev/1074347252/

テンプレは>>1->>10あたりを参照
05245142006/11/17(金) 18:00:42ID:7Zpg5IH1
>>521
OS:Win98
ウィンドウモード
Graphics::drawImageでは縞はでませんでした。
バッファストラテジはそんなに効果があるんですか?
今一速くない気がします…
0525名前は開発中のものです。2006/11/17(金) 18:50:02ID:gSEH6ifA
>>524
速度に関してはソフトウェア描画になる部分とアクセラレーションがきく描画と分かれる。
拡大縮小やαブレンドはソフトウェア描画になる。

Graphics::drawImageによる拡大描画は大丈夫なのか・・・。
画像のロードの仕方とかにも結構左右されるっぽいけど、そのへんどうなってるかな。
あと256色モードとか16bitカラーモードが原因になる可能性もある。

転送元imageはBufferedImage使ってると思うけど、そのカラーモードはフレームとあわせてある?
抜き色があるかとか細かいこともある。

フレームレート命のアクションゲームならできるだけアクセラレーションがきく描画を選択したほうがいいよ。
あとは画面サイズが大きすぎないこと。

まとめると
・画像のロードの仕方
・デスクトップの色数
・実際に問題の出るコードと画像
05265142006/11/17(金) 19:08:46ID:Lt0Wj0UY
>>525
画面は24bitでした。転送元imageというのがいまいち分かりません…
今まで携帯でしか作って無かったので、、、
あとこういうゲームに特化してJAVAの解説してるとことか無いですかね?
人に見せられるもんじゃないですけどソースアップしました。
ttp://park21.wakwak.com/~kuri/src.zip
0527名前は開発中のものです。2006/11/17(金) 21:47:35ID:6OJGRcli
まずぱっとみpaintイベントに描画ロジックが書いてあるようなきがするが、
通常paintイベントに対して処理は行わない。

repaint呼び出すところを自前のメソッドを呼び出すようにかえて、
paintメソッド名をそれにあわせて書き換えよう。

キー入力をビットに割り当てているのを見ると、他の言語でゲーム自体は作ったことあったのかなとおもた。

Skeruというクラスがわからないのでなんともいえないな。

画像のロードはImageIOを使うと柔軟にロードできるよ。わざわざバイト配列をロードするとか必要ない。
その際に画像バッファは現在のビデオの解像度と合わせると高速に転送が出来るけど、それはまた後の機会に。

これってフレームのサイズ固定で描画しているようだけれども、タイトルバーの高さとかふちの大きさは
同じWindowsでもバージョンや環境によって大きく異なるからしないほうがいい。

pack()やsetVisible()したあとにインセットを取得して本来ほしいサイズにそれを足して処理する。
05285142006/11/17(金) 23:51:15ID:83DvLp/B
>>527
お返事ありがとうございます。
>repaint呼び出すところを自前のメソッドを呼び出すようにかえて、
>paintメソッド名をそれにあわせて書き換えよう。
playに変えました。

>キー入力をビットに割り当てているのを見ると、他の言語でゲーム自体は作ったことあったのかなとおもた。
まあ、ボチボチですが

>Skeruというクラスがわからないのでなんともいえないな。
これはいらないクラスです。うっかりしてました。
画像とか変更したソースとかさっきのURLにアップしておきます。

>画像のロードはImageIOを使うと柔軟にロードできるよ。わざわざバイト配列をロードするとか必要ない。
>その際に画像バッファは現在のビデオの解像度と合わせると高速に転送が出来るけど、それはまた後の機会に。
やってみましたけど、こんなんでいいんですかね。

>これってフレームのサイズ固定で描画しているようだけれども、タイトルバーの高さとかふちの大きさは
>同じWindowsでもバージョンや環境によって大きく異なるからしないほうがいい。

>pack()やsetVisible()したあとにインセットを取得して本来ほしいサイズにそれを足して処理する。
やってみました。
0529名前は開発中のものです。2006/11/18(土) 00:24:13ID:3XstkAv5
>>pack()やsetVisible()したあとにインセットを取得して本来ほしいサイズにそれを足して処理する。
>やってみました。

これ、取得した後にそのサイズを足してsetSizeするってことね。
320*240とかを描画サイズにしたい場合それプラス余白部分。
もちろん、描画する際の起点もその分ずらす。

あとは時間管理だろうか。
sleepは固定でのウエイトが入る。つまりメインループの処理時間の差があった場合に考慮されていない。
普段は10msで動いていたとしたら1ループは30msだろうけど、これが5msだったり15msだったりすると・・・。
したがってがくがくするのを防ぐためには一定の速度でまわす必要がある。
30msでループさせるなら処理に5msかかったら25ms停止、処理に15msかかったら15ms停止というようにね。

だいたいでいいのなら一番簡単なのはjava.util.Timerを使う。TimerTaskとあわせてね。
メインループのほうをwait()で停止させて、TimerTaskからnotify()で起こすといい。

あとこのスレと前スレを一度全部見ておいたほうがいい。
05305142006/11/18(土) 16:22:37ID:09nqBb7g
言われたところは大体やりました。ただTimer系がまだいまいちわかりません
サクっとでいいんで説明してもらえたら助かります。
あとJAVA2Dなら画像のパレット替えやフィルタリングもできるんですよね?
0531名前は開発中のものです。2006/11/18(土) 16:36:52ID:qC5zAejN
タイマーはここみるといいよ。
http://www.javainthebox.net/laboratory/utils/Timer/Timer.html
ほかにも櫻庭さんのサイトはJava関係の重要なのが多いから関係のありそうなところ見といたほうがいい。

描画に関してはアクションゲームで60fpsを目指すのなら複雑なことはしないほうがいいよ。
あらかじめ使用するパレットがわかっているなら画像ロード後にそれらのImageを生成したほうがいい。
あくまでもいわゆる画像をスタンプのように貼り付ける場合はやいから。

RPGとかで30fpsくらいでいいのならいろいろと出来ると思うよ。
Java2Dを詳しく書いた書籍ってあったかな・・・。まずはJava2Dのマニュアルをよんでみよう。
少なくともJDKのJava2Dサンプルくらいはすぐできるから。
05325142006/11/18(土) 17:44:49ID:Zk4f2vJN
>>531
ありがとうございます。
Timerは分かってきたんですが、上にある
>メインループのほうをwait()で停止させて、TimerTaskからnotify()で起こすといい。
の書き方が分かりません…。
あと、キャラクター・エフェクト・特殊ブロックなどの処理部分を一つのクラスにまとめて中で
switch文分岐して処理させようかなーと思ってるんですが、こういうやり方だと遅くなったりするんでしょうか?
座標や状態変数なんかはメインループのある方のクラスに持たせれば、敵にくっついてく敵とかが作れそうですよね。
一応JAVAなのでポリモーフィズムも考えたんですが、数が数なだけに多すぎるので辞めたんですが

画像も予め用意したらその分メモリ食われて遅くなるってこともありますよね?
いかんせんJAVAでのメモリの使われ方が良く分かって無いのでどこかで損してる気がします…
0533名前は開発中のものです。2006/11/18(土) 19:54:34ID:ZKUyfd27
wait、notifyはObjectにあるメソッド。これはJavaの基本中の基本なので勉強するといいよ。
APIドキュメントよんでごらん。ざっくりというとwaitはスレッドを停止させてnotifyで起こすという感じ。
マルチスレッド使ってるのでこの辺基本を抑えないと大変なことになる。

参考
ttp://www.nextindex.net/java/thread/waitnotify.html

switchだろうが複雑な分岐だろうがCPUだけが処理するようなものは速度的に問題にはならない。
ネックになるとすれば16bitCPU時代くらいでJavaSEとは関係ない。

最初はざっくり作ってリファクタリングをゆっくりやるといいよ。IDE使えば手軽に見通しよくなるし。
オブジェクト指向等も徐々に勉強していきながらでいい。
05345142006/11/18(土) 22:14:54ID:Bis6pJQA
>>533
wait()とnotify()意味は半分ぐらい分かったのですが、いまいち調べても
欲しいサンプルが見つかりません…。色々試してはいるんですがなかなか
動いてくれません。ヘタレで悪いんですがゲームで使う時のwait、notify
のコードをちょろっと書いて貰えないでしょうか?

ただ分岐は多くてもいいというのはホッとしました。丁寧なレスありがとうございます。
助かります(^^;。
0535名前は開発中のものです。2006/11/18(土) 23:55:20ID:ZKUyfd27
基本中の基本だけにしらべればいくらでもサンプルコードが出てくると思うのだが。
05365142006/11/19(日) 10:56:55ID:1IKPzYYc
Timer/TimerTaskとwait/notifyを組み合わせられないんです。
どうやったらTimerTaskで周期的にnotifyできるのかとかSynchronizedを付けるべきところとか
探し方が悪いのかも知れないんですが
0537名前は開発中のものです。2006/11/19(日) 13:54:05ID:dZdtxI9w
自分はこんな感じで実装しているが、間違っていても知らない

public class Hoge extends Thread{

  private boolean processStop = false;
  private WakeTask wakeTask = new WakeTask();

  public void start(){
    super.start();
    new Timer().scheduleAtFixedRate(wakeTask, 0, WAKE_TIME);
  }
  public synchronized void run(){
    while(true){
      game();
      try{
        wait();
      }
      catch(InterruptedException e){
        e.printStackTrace(System.err);
        break;
      }
    }
  }
  private synchronized void awake(){
    if(!processStop) notify();
  }
  private class WakeTask extends TimerTask{
    public void run(){
      awake();
    }
  }
}
0538名前は開発中のものです。2006/11/19(日) 20:11:00ID:8MYA5LfB
>>536
ttp://www.y-adagio.com/public/standards/tr_javalang2/jTOC.doc.html
05395202006/11/19(日) 23:41:03ID:yvfHZIx2
今頃鯖のポート解放忘れてるのに気がついた。
何がしたいんだよ俺・・・・orz
0540名前は開発中のものです。2006/11/20(月) 00:56:56ID:mU6Ad/cq
リアルタイムシミュレーションでネット対戦できるゲームをjavaで作りたいのですが、参考になるサイトありますかね?
ちなみに自分は今までCで数値シミュレーションを生業としてきてGUI関係はよくわかっていません。
勉強できるサイトがあるとうれしいです。
よろしくお願いいたします。

以上
0541名前は開発中のものです。2006/11/20(月) 01:19:17ID:8PZEbpO9
ものすごい初心者な質問なんだけど、
普通のゲームってソフトとかクライアントとかをダウンロードするじゃない?
JAVAゲームの場合、ブラウザから直接開始するけど、
読み込み時間みたいのがかなりかかるんじゃないのかな?
音楽もいちいちMP3をダウンロードすることになるの?
0542名前は開発中のものです。2006/11/20(月) 01:42:07ID:HqvpBzdY
>>540
シミュレーションが、物理シミュレーションかシミュレーションゲームか不明
GUIプログラミングは簡単なので立ち読みか普通のサイト見れば良いのでは
http://www.javadrive.jp/
http://www.hellohiro.com/
0543名前は開発中のものです。2006/11/20(月) 15:21:51ID:107nEDGg
>>541
Javaのプログラムってのはアプレットだけじゃないよ。
通常のアプリケーション等もあるし、一度ダウンロードしたらアプレットはキャッシュからとってくることも出来るし
WebStartはバージョン等が変わってなければすべてキャッシュファイルからとってくる。

そもそもC等で作ったアプリだって同じだぞ。ネット経由でダウンロードするように作ってあるなら。
バックグラウンドスレッドでガンガン落としていけばあまり問題はなさそうだが。
0544名前は開発中のものです。2006/11/26(日) 21:31:48ID:vp/Awfnk
話題が無いがage
無限にステージが生成されるマリオっぽいゲーム「Infinite Mario Bros」
http://gigazine.net/index.php?/news/comments/20061126_infinite_mario/
0545名前は開発中のものです。2006/11/26(日) 23:34:43ID:o/jL46vw
>>544
Wurm Online の中の人が製作しているみたい?
ソース付きだし勉強になりそうだ。
0546名前は開発中のものです。2006/11/27(月) 18:13:24ID:QR83lXnt
VolatileImageとMemoryImageSourceって一緒に使えますか?
0547名前は開発中のものです。2006/11/27(月) 18:15:01ID:IAG3BIQ8
使えるけど、後者は使う意味ないぞ
1.1時代の互換性のためだけの遺産だから
0548名前は開発中のものです。2006/11/27(月) 18:52:38ID:QR83lXnt
詳しく教えてください
VolatileImageでピクセル操作とかできますか?
0549名前は開発中のものです。2006/11/27(月) 21:03:56ID:OAwnVtrw
VolatileImageは画面モードにも夜がVRAMをさすと思っていい。
VRAM直書きはメインメモリ直書きに比べて非常に遅いので出来てもやらないほうがいいのは常識。

メモリ上のImageを扱うなら1.2以降はBufferedImageを使う。最初にピクセルフォーマットをきめて
配列で扱えること、出来上がった画像を何度もコピーする場合アクセラレーションが自動的に適用される。
0550名前は開発中のものです。2006/11/27(月) 21:56:18ID:L4SNxotk
>>547
いや、実際にはMemoryImageSourceが一番素直な「フレームバッファ」
で使いやすい。BufferedImageは、メモリ上の配列と直接関連付けられ
ないのが致命的(ピクセル列に見立てたint配列を操作すれば直ちに
対応するImageに反映されるという意味での「Buffered」でなければ、
Rasterなどという扱いにくい邪魔者が出てくるだけでまったく意味が
ない。まだMemoryImageSourceの方がまし)。
0551名前は開発中のものです。2006/11/27(月) 23:13:58ID:OAwnVtrw
ゲーム用途だとダイレクトにピクセルを扱う場合8bitか16bitにしないと速度的に問題が出るから
BufferedImageでそういう指定するのが一番だと思うし、ピクセルフォーマット合わせる場合
GraphicsConfiguration使うだろ?

問題あるのか?short配列アクセスとか簡単に出来るから便利だと思うんだが。
0552名前は開発中のものです。2006/11/28(火) 22:11:57ID:WdzF4q7Z
>>544
それすごいな
pure javaだけでここまでできるの?
0553名前は開発中のものです。2006/11/28(火) 22:46:49ID:jI1vxm7H
>>552
2Dなら余裕
あとは根気等

ただグラフィックなどあからさまなパクリはいかんね
0554名前は開発中のものです。2006/11/28(火) 22:52:55ID:dIaLfStB
>>552
署名なしで動くアプレットだから当然、pure javaです。

携帯で普通にドラクエが動いている世の中だからな。
出来るかどうかはプログラマの腕次第だと思うよ。
0555名前は開発中のものです。2006/11/29(水) 08:24:09ID:SF7yfmPu
>>551
>問題あるのか?short配列アクセスとか簡単に出来るから便利だと思うんだが。

いや、だからその配列の内容は一度変換・コピーしないとImageとして表示できないんだよ。
自分でRGBを数値として処理する配列を取ると、一度それをMemoryImageSourcre/BufferedImageを介して変換しないと描画可能なImageが得られない。
そして、そうしたRGB配列のImage化には一発でできて余計な機能がないMemoryImageSourceの方が使いやすい。
Win32のDIB/DIBSectionのような機能(直接描画可能なフレームバッファを配列として取得できるImage)があれば楽だし、変換や不要な配列の二重確保が入らない分性能上も有利なはずなんだけどね。
BufferedImage(あるいは各種変換機能を削除して単純化したMemoryImageクラスでも新設して)でピクセル列の配列を直接公開してくれれば良いのだけど。

あと、int配列から作ったMemoryImageSourceで速度的な問題って感じたことないぞ。
Pen3+845GEのマシンで100以上のキャラクタ描いてもまったく問題にならなかった(100FPS以上)。
0556名前は開発中のものです。2006/11/29(水) 12:28:42ID:E1GsFmbf
>>555
ラスター使うから同じじゃね?
0557名前は開発中のものです。2006/11/29(水) 13:28:43ID:SF7yfmPu
>>556
ラスターは邪魔だよな……。
BufferedImageのような各種変換機能付きImageを作るなら、まず単純なフレームバッファ用意してその上位版という位置づけにして欲しかった。
BufferedImageも内部には直接画面に転送する32ビット配列(Win版は32ビットDIBSection+独自のアルファ処理?)持っているんだろうし。
0558名前は開発中のものです。2006/11/29(水) 13:56:50ID:E1GsFmbf
ピクセルフォーマットが同じだとDDBで転送するだろうから速度は速いはず。
MemoryImageSourcreは任意のピクセルフォーマットで扱うとき大変じゃない?
0559名前は開発中のものです。2006/11/29(水) 16:21:44ID:SF7yfmPu
>>558
いや、BufferedImageはWinではDIBSectionじゃないの。
一応「バッファ」もっているし、アルファ処理対応だから。
ラスター要求されたときのためにもメモリ上にフレームバッファが必要なはず。

そういえば、もう何年もWin32APIにしろJavaにしろフルカラー32ビットフレームバッファ(DIB/DIBSection/MemoryImageSource)の速度的な不満は感じたことないな。
ピクセル単位の処理はフルカラー32ビットで行うのが一番楽(1ピクセル1DWORD)だし描画時の性能も十分。
0560名前は開発中のものです。2006/11/29(水) 22:03:00ID:r/0kDPlo
BITMASK指定でバッファ作ればDIBと思われる動作速度じゃないよ。
0561名前は開発中のものです。2006/11/29(水) 22:06:29ID:r/0kDPlo
32bit単位でのアクセスは非常に遅い。

IntelCore等最新のCPU使っていてもVGAクラスになると処理速度が間に合わない。
2次キャッシュのサイズ等を考慮してぎりぎりといったところか。
QVGAなら32bitカラーはぎりぎりいけるかな。

PentiumM1GHz/Pentium42GHzクラスのマシンを動作対象にしようとすると
QVGA-16bppくらいしか選択肢はない。
0562名前は開発中のものです。2006/11/30(木) 17:09:31ID:TUwNRJc1
>>559
そんな馬鹿な。2Dの画像転送速度で比較すると

BitBlt(WinGDI) > TransparentBlt(WinGDI) > AlphaBlend(WinGDI)
>> copyArea(Java2D) >> drawImage(Java2D)

なのですが。確かに小さい画面サイズならそれだけ差はなくなるけど
まともなゲームの画面サイズにすると、その遅さが浮き彫りに
0563名前は開発中のものです。2006/11/30(木) 17:14:30ID:TUwNRJc1
>>559
失礼。フレームバッファの単語を読み飛ばしてました
0564名前は開発中のものです。2006/11/30(木) 18:04:42ID:NwbsHHlf
Java2DアクセラレーションはDirectXも使っていたり複雑だけど
通常の矩形転送以外はアクセラレーションきかねぇんだよな
しかも頻繁にGCがおきやがる

JOGLアクセラレーションに期待
5.0だとDirect3Dモードはひどいし、OpenGLモードはもっとひどいし
0565名前は開発中のものです。2006/12/01(金) 10:00:02ID:A/U7d6+m
JAVAって画像ファイル形式にGIFしか使えないってマジですか?
0566名前は開発中のものです。2006/12/01(金) 10:14:43ID:LDltEBVY
マジではありません

どんな画像ファイル形式でも使えますよ
0567名前は開発中のものです。2006/12/01(金) 11:37:19ID:LC+/aYM5
Java素人なのですがなんとなく作ってみました!
未だにアプレットの作り方すらよーわからんです。(^^ゞ
ttp://perfect-logic.net/SampleAction/
0568名前は開発中のものです。2006/12/01(金) 17:10:48ID:IDdYaP0u
結構作りこんでありますねぇ。
某ゲームを彷彿させて萌えましたw
ところでシステムがアーケードっぽいのはなぜなんでしょう?
0569名前は開発中のものです。2006/12/01(金) 17:16:25ID:LC+/aYM5
感想ありがとうございます〜。
アーケードっぽいのは私がアーケードゲーム好きだったので、なんとなくそれっぽくしただけなんです。(^^ゞ
0570名前は開発中のものです。2006/12/01(金) 23:36:55ID:o1acqxN9
>>567
ちょっ
これで素人とは言わせないぞ
どこのプロだ?
0571名前は開発中のものです。2006/12/02(土) 00:01:56ID:WxTjtQSm
>>570
こんばんわ。
ホントにJavaでものを作って公開するのは初めてですよ〜。
一度くらい仕事でJavaってみたいです。(^-^)
ちなみにゲーム歴は結構長いです。インベーダー時代からやってます♪
0572名前は開発中のものです。2006/12/02(土) 05:50:16ID:8WxMFuvR
適当な推理だけど、
中堅ソフトメーカーの社員で、30代半ばから40台。
開発現場から管理職に昇進したものの、なんか以前より暇でムズムズしてる人。
最近のゲームは、はっきりいってぬるぽ杉て殺意すら覚えている。
乗り越える壁があってこそ面白いゲームと考えてる。
マーケティングにその事をこぼした際今時流行らないと一蹴され、このゲームを
作り始める直接のきっかけになった。


なんてね。
0573名前は開発中のものです。2006/12/02(土) 09:32:54ID:wBc7JJHR
>>572
36〜40の割には顔文字やら音符やらずいぶん軽いな
そんなもんなのかね
0574名前は開発中のものです。2006/12/02(土) 10:03:44ID:YSW2q7Ho
>>572

>乗り越える壁があってこそ面白いゲームと考えてる
は当たっているかもしれません。
後は…ちょっと違うかな。(^^;
最近のゲームは普通にやりますし、プログラム技術も見てますよ〜。
(素晴らしいの一言です。とても一人では作れるわけ無いですね)

このゲームを作ったきっかけは、昔ナムコの某塔を登るゲームの
二作目(ただ飛ぶだけのヤツ)にガッカリして、自分ならこう作る
かなぁとずっと思ってて、Javaでなんかグラフィックをいじる
ソフトを作ってみるかと思ったキッカケがあったときに
それを実行移した感じですね。
年々仕事がハードになるので、息抜きに作った感じです。(^^;
0575名前は開発中のものです。2006/12/02(土) 10:09:23ID:OMk/eHpK
(^-^)とか(^-^)/とか(^-^)/~は30台でも使う人いるな
0576名前は開発中のものです。2006/12/02(土) 10:37:29ID:TVj7JnE/
>>567
URL見てスルーしてたが結構凄いじゃん
0577名前は開発中のものです。2006/12/02(土) 11:10:40ID:YSW2q7Ho
>>576
ありがとうございます〜。
周りにJavaのグラフィックやゲームフレームワークについて
お話できる人がいない上に、プレーしてもらえるゲーマーが
殆どいない状況だったので、ここに晒してみた感じです。w
0578名前は開発中のものです。2006/12/02(土) 13:20:11ID:A/80wyG1
俺もURLみただけでアプレットかなんかかとおもってスルーしてた

単純でもDEMOがあるのがすばらしいな
結構DEMO作るの面倒なんだよな
0579名前は開発中のものです。2006/12/02(土) 16:34:43ID:Q74I213y
>>567
初期化時の画面のこだわりは恐ろしいものがありますな。
ゲーム自体もかなり作りこんであるので、ちとびっくりしました。

>>574
「飛ぶだけのやつ」はシリーズでいうと3作目ではないかと。
2作目は「塔を降りる」やつではないかと。
スレ違い失礼。
0580名前は開発中のものです。2006/12/02(土) 16:49:36ID:YSW2q7Ho
>>578
DEMOがあるとなんか昔のアーケードっぽくていいかな?
と思いました。(^^)
あと、最初の方の面は宝の出し方が故意にノーヒントにしてあるので、
デモプレーで分かるようにしてみました。

>>579
感想ありがとうございます♪

二作目はイシターでしたね。三作目が正解です。www
書き込んだ後に思い出して反省していました。(^^ゞ
0581名前は開発中のものです。2006/12/02(土) 17:06:52ID:w9uTYl/6
>>567
JAVAなのにブラウザから直接はじめられないの?
0582名前は開発中のものです。2006/12/02(土) 17:12:22ID:YSW2q7Ho
>>567
Javaの素人なのでアプレットの作り方とか知らないんです。
エントリポイントが違うくらいの違いであれば作ることができそうですが、
ちゃんと作る気力が無くて...orz
0583名前は開発中のものです。2006/12/02(土) 17:46:49ID:w9uTYl/6
embedとかで埋め込めなかったっけ?
普通に作りこんであるだけに起動が面倒なのは惜しい。
0584名前は開発中のものです。2006/12/02(土) 17:50:35ID:YSW2q7Ho
ほほぉ。そんなのがあるんですね。φ(.. )メモメモ
今度勉強してみようかな。
0585名前は開発中のものです。2006/12/02(土) 20:54:16ID:A5BBW3gR
>>582
つゲームのパネル化&AppletとFrameへの貼り付け
0586名前は開発中のものです。2006/12/02(土) 21:53:27ID:NlWQrbtL
マニフェストでMain-Classを指定してるみたいだからjarアーカイブの関連づけをjavaかjavawに関連づけてたらダブルクリックで実行できるだろ。

>>567
起動〜リソースの読み込み〜タイトル画面移行に掛かった時間を標準出力に吐いてくれたらうれしい
0587名前は開発中のものです。2006/12/02(土) 22:03:33ID:g+e0ZUOZ
>>567
連投スマン
これってAWT?
-Dswing.aatext=true
でアンチエイリアスが効いてないような気がするんだけど・・・
0588名前は開発中のものです。2006/12/02(土) 22:23:32ID:YSW2q7Ho
みなさんありがとうございます〜。
アプレットにも対応してみようかと、mainのクラス(ActionGame extends JFrame)
とは別にAppletのクラス(ActionGameApplet extends JApplet)を作って、
appletviewer使って実験してみたのですが、私のスキルが足りなくて、
途中で画像の読み込みとか(?)でヌルポになってしまいました…
(トレースは表示されましたが、時間が無くて具体的にどの辺りかが
あんまり分かっていません。あと内部でJPanel(JFrameに貼りついている
MainScreen)を作っているのですが、
これがアプレットに貼り付かないみたいで別ウィンドウが出て
しまいました...)
なものでアプレット化は当分無理そうです。ごめんなさい〜。m(_ _)m

>>586
これ位は私でもできるような気がしますが、必要な理由に興味が
あります。何故でしょう?(^^ゞ

開発環境はbash, vi, antで開発していたので、
シェルで普通にパラメータを指定して起動みたいな感じで、
ダブルクリックとかあまりやっていませんでした。
(Windows XPとかだと、jar=ZIPファイルで中を展開ってイメージが
あったもんで...)
0589名前は開発中のものです。2006/12/02(土) 22:53:32ID:m+FwCpVx
アフォな解凍ソフトが jar まで解凍拡張子として関連付けしている
場合があるから、Windows向けに下記のランチャーソフトをお勧め

ttp://launch4j.sourceforge.net/
ttp://www.ne.jp/asahi/web/ryo/exewrap/
0590名前は開発中のものです。2006/12/02(土) 23:02:38ID:lFDLhCqW
jarはダブルクリックで実行がデフォ
あふぉなアーカイバは無視しておけ
0591名前は開発中のものです。2006/12/02(土) 23:04:51ID:lFDLhCqW
>>588
画像読込部分はりソース読み込みならおかしくなるとは思えないけどどういうコード使ってるの?
0592名前は開発中のものです。2006/12/02(土) 23:08:50ID:YSW2q7Ho
>>591
読み込みよりもダブルバッファのイメージ生成でコケてました。(^^;
Component.createImage APIです。
…トレースを見ていたら、

[Action game start]
Game initializing...
Image create error.
Framework initialize failed. error(-1)
java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkExit(SecurityManager.java:744)
at java.lang.Runtime.exit(Runtime.java:88)
at java.lang.System.exit(System.java:868)
at ActionGameApplet.init(Unknown Source)
at sun.applet.AppletPanel.run(AppletPanel.java:378)
at java.lang.Thread.run(Thread.java:595)

とかなっていたので、もっと根本的におかしいのかも知れないです。
(HTMLの書き方とかからしてとか)
嗚呼、スキルの無い悲しみ…orz
05935862006/12/02(土) 23:31:14ID:g+e0ZUOZ
IDが変わってるだろうがプロバイダの仕業だから気にしないでくれ

>>588
レス早いねありがと。
javaはVM向けのオプションをいじり倒すとかなり最適化出来るんだがマシン構成やらプログラム側のGCの発生頻度やらその他諸々の癖で結構指定するオプションを見極める必要がある。

んで効果を手軽に確認するのに初期化処理とかリソースの読み込みに掛かった時間が分かるとめあすになるかと思って。


あと思ったんだがJavaVMじゃなくてJavaアプリケーション側の実行時引数って普通-Dオプションで渡さない?swingだけだろうか?


ダブルクリックでjar実行なら最近のGUIOSならJavaVMに関連づけがデフォだからwinやMacOSXならいじる必要ないと思う。

linuxとかCUI混在は知らん。
上で言われてる通りバカなアーカイバがjarをZipとして云々はデフォ設定に直せばおk

winでjar=zipとして解凍って思い込みはIEがHTTPからダウンロードする時MIME-TYPE見てないせいで云々に関係するからOSがバカなだけ。

ド素人ならJarを何も考えずにクリックして見るのが普通と思う。解凍は意図的にする。

長かったな参考になっただろうか
0594名前は開発中のものです。2006/12/02(土) 23:49:58ID:lFDLhCqW
>>592
System.exitがどっかにかいてあるとか?
あれはアプレットだとセキュリティ違反


>>593
GCはインクリメンタルGCnにするとフルGCが大体消えて快適になる
5.0ならパラレルGCなので大丈夫

-Dはパラメータ用ではない。用途が違う

0595名前は開発中のものです。2006/12/02(土) 23:55:17ID:YSW2q7Ho
>>593
どうもです。(^^)

>んで効果を手軽に確認するのに初期化処理とかリソースの読み込みに掛かった時間が分かるとめあすになるかと思って。
参考になりました。φ(^^ )メモメモ
ということで時間を見つけて入れてみますね。
エンディングまで行った時にもTotal Play時間も入れておこうかな。

-Dswing.aatext=true パラメータは知らなかったのでググッてみたのですが、
これはテキストにアンチエイリアスがかかるとか紹介されていました。
ビットマップの転送にもアンチエイリアスがかかるのかも知れないのですが、
私も試したらNGでした。ちなみにゲーム中に表示される文字は全て
ビットマップです。
0596名前は開発中のものです。2006/12/02(土) 23:58:03ID:YSW2q7Ho
>>594
System.exit書いてあります!
アプレットの時はコレが書いてあるだけでNGなんですね。φ(^^ )メモメモ
0597名前は開発中のものです。2006/12/03(日) 00:11:31ID:Weooalfd
ブラウザでプレイできるようにしてくれ〜
0598名前は開発中のものです。2006/12/03(日) 00:19:26ID:7tbgDbUF
>>597
すみません〜。スキルがなくて…orz

System.exit止めたらExceptionが消えましたが、Component.createImage(w,h) API
でイメージが生成できないのは解消できずです。orz
newしたJPanel(Component)はヌルポでは無いのに…
0599名前は開発中のものです。2006/12/03(日) 00:28:03ID:JGG55Wof
>>597
アプレットはずっと動き続けるものだからね
破棄はブラウザ閉じたりページ移動したりユーザーの意思によってのみされるわけだ

>>598
エラーメッセージは?
0600名前は開発中のものです。2006/12/03(日) 00:36:40ID:7tbgDbUF
>>599
598で述べたJPanelは私のチョンボでした。
アプリケーションのmain関数でインスタンス生成するのと同じように、
アプレットのInitの中でActionGameAppletをインスタンス生成していました。
(インスタンスが二重になってしまっていて、おかしくなっていました)

今はjar内のイメージ(最初にフォントを読み込みます)の読み込みエラーになり始めました。

Image load error. (/images/text_font.png)
java.lang.NullPointerException
at TextScreen.initialize(Unknown Source)
at God.initialize(Unknown Source)
at ActionGameApplet.init(Unknown Source)
at sun.applet.AppletPanel.run(AppletPanel.java:378)
at java.lang.Thread.run(Thread.java:595)

コードはこんな感じです。

 // イメージを読み込みます
 Toolkit toolkit = Toolkit.getDefaultToolkit();
 Image srcImage = null;
 URL url = God.getURL(fileName);
 if(url != null) {
  srcImage = toolkit.getImage(url);
 }
 if(srcImage == null) {
  System.out.printf("Image load error. (%s)\n", fileName);
  return null;
 }

filenameがjar内の/images/text_font.pngにあたります。
0601名前は開発中のものです。2006/12/03(日) 00:37:20ID:JGG55Wof
しかしアプレットだとVMにたいして細かい制御ができないしパフォーマンスも下がるし制限多いんだが
アプレットにこだわるのはどういうことだろうね

WebStartアプレットならまだましか
0602名前は開発中のものです。2006/12/03(日) 00:44:09ID:JGG55Wof
>>602
肝心の例外が出てる行はどこ?
ツールキットでのロードってことは読込完了するまでまってる?
画像ロードはImageIO使ったほうが楽だと思うよ
リソースのストリームから呼び出すようにね

あとソースファイルが多いので1つのディレクトリに全部展開するよりは階層構造にしたほうがいい
viとかでは管理できないレベルかと

リファクタリング使えるIDEつかえばドラッグアンドドロップで自動的にクラスの移動ができる
もちろん使われている場所も全部問題なく変更される

ここまでの規模になるとたいしたことなくともIDE必要だと思うよ
antも全部自動生成してくれるし
0603名前は開発中のものです。2006/12/03(日) 00:52:36ID:aNPfAlfu
>>594
-Dはシステムプロパティの方だった・・・orz

ユーザープロパティはProperties#loadで自分でプロパティファイル毎拾わないといけないんだったな。

>インクリメンタルGC〜
それは言えてる。けどインクリメンタルGCはフルGCのコストとは比べ物にならなくても常に少しのCPUパワー消費が増してるからハードウェアアクセラレーションが効かない現状だと貧弱PCだと辛いかと思ってさ。

あとメモリ使用量とかも調節したいし。


CPUが2つ見えてればサーバーVM使いたいんだけど・・・(°ω°)

>>595
-Dswing.aatextは将来のDeskTopJavaのサポートを強化するためにSE5.0で先行実装された非公開のオプション。アプリケーションレベルでテキストをアンチエイリアスしてくれる。com.sun.java.swing.SwingUtikities2のソースを読むと幸せになれるかもしれない。

だが、知らないなら余り触れない方が良い。


文字はビットマップなのか。それならJava2Dの仕事。SDK5.0の「java2Dのグラフィックスとイメージング-J2SE5.0でのJava2Dの新機能 or Java2Dテクノロジのシステムプロパティ」が参考になるが現段階では充てにならん。SE6〜7辺りに期待。

>>596
ブラウザにプラグインされてるVMを勝手に終了させられたらブラウザは迷惑だと思うw

0604名前は開発中のものです。2006/12/03(日) 00:53:47ID:7tbgDbUF
>>602
根源は
URL url = God.getURL(fileName);
というところでした。
この関数は、sun.applet.AppletClassLoader.getResource(filename)
としていて、ここでNULLになっているみたいです。
(結果、if(srcImage == null)がnullになるという感じです)

ImageIOというのもあるんですね。ためになります〜。
EclipseとかカッコイイIDEを使いたいというのもあったのですが、
何分勉強する時間が無くて、最初はHello Worldから始めて、
グラフィックをちょっと描いてみる→ここまでに至りました。
この辺、言語や開発の仕方を覚えていく過程としてはかなりいい加減です。
(この言語が本職で無いからどーでもイイヤみたいな感じだったとでも
いいましょうか...(^^ゞ)
0605名前は開発中のものです。2006/12/03(日) 00:57:25ID:JGG55Wof
>>603
サーバーVMはスループットはよくなるけどレスポンス悪化するのでゲームじゃ今のところ使えない
クラスロード時にコンパイルが出来るなら別だがそういうVMはないはず

それにインクリメンタルGCは5.0でトレインGCからパラレルGCに変更になったので大丈夫だよ
トレインアルゴリズムは非常の遅くて1GHzくらいでも60fps維持は結構きつかった
一応隠しオプションでトレインにかえれるけどだれもつかわないね、あれは
0606名前は開発中のものです。2006/12/03(日) 01:01:12ID:JGG55Wof
>>604
リソース読むときコードにクラスローダ直書きってこと?

IDEはわからないのであればNetBeansお勧め
セットアップしてすぐに使えることと覚えることが少ないのがぐー
新規にプロジェクト作ったらsrcフォルダにそのままソースをぶっこむだけでおわる

それに補完等があるからIDEは便利だよ
コンパイルしなくても構文にエラーがあればリアルタイムに表示してくれるし
0607名前は開発中のものです。2006/12/03(日) 01:06:14ID:7tbgDbUF
>>606
>リソース読むときコードにクラスローダ直書きってこと?

いえ、最初にgetClass().getClassLoader().getClass()してます。(^^ゞ
アプレットの時は"sun.applet.AppletClassLoader"で、
アプリケーションの時はお詳しいと思うのでご存知のように、
"sun.misc.Launcher$AppClassLoader"
みたいになりました。

IDEはもう少し時間が取れたら試してみようかな…
0608名前は開発中のものです。2006/12/03(日) 01:20:39ID:aNPfAlfu
>>605
パラレルアルゴリズムってそんなにパフォーマンス改善されてるのか。

>>サーバーVM〜
そういやこれアクションゲーだったな。
俺ADVエンジンしか作れないからレスポンスいらねw

でもlinuxだとデフォでサーバーVMが起動するからゲームのパフォーマンスさげてるって事か。


ところでswingで書けばアプレットでもアプリケーションでもどっちでも起動できるが>>604がdemoのSwingSet2のソースを理解出来るかどうか。

swingサポートしない古いMSVMはセキュリティの面からも切り捨てでw

#MSVMはJITだけが取り柄だな
0609名前は開発中のものです。2006/12/03(日) 01:41:17ID:JGG55Wof
>>607
リソース周り少し調べればたぶん解決すると思う
ストリームのほうつかってみたら?

あとファイルをjarの外に出すという方法もあるね
あとでパッチ当てるの楽になるし開発中のときはデバッグに楽かも

まぁリソースは別のjarとかにしておくのが正解か
WebStart等とかんがえるならね

>>608
あとGC自体1.4から5.0で見える範囲でパフォーマンスアップしている

Swingかどうかって関係ないのでは?
awtでもアプレットとアプリは併用可能

フルスクリーン等実装してることから1.4以上が必須なわけだし
あとはOggあたりをループ再生していればいいね

linuxは32bitならサーバークラスマシン検出しないとデフォはクライアントだと思うんだけど
64bitはクライアント版はなし
0610名前は開発中のものです。2006/12/03(日) 01:54:36ID:7tbgDbUF
>>609
色々と調べたら、アプレットでのjar内のリソースの読み込みは
セキュリティポリシーの問題で難しそうに感じました。
(それで合っているのか分かりませんが...)

本来は提案で言われたとおり、jarを外に出すとかWebStart等が
いいのかと思いますが、流石にそのパワーが無いので、
一旦これで凍結にしようかと思います。
(所詮適当に作ったサンデープログラムプロゲームですしね。www)

----
本来はオフラインで周りに聴ける人とかいれば、色々と相談したい
ものなのですが、残念なことにJavaエンジニアが側に一人も居ないので、
なんかきっかけがあったらまたゴソゴソとトライしてみようかと
思います。

スレの流れを見ていると、上級Javaエンジニアの方が二人程
私の相手して頂いたように見受けられます。
色々とテクニカルなキーワードを教えてもらって、
かなりタメになりました。ありがとうございます!( ´▽`)ノ

>>皆様
クソゲーではありますが、純粋にレトロ風なアクションゲームを
楽しんでいただけると幸いです。(^^)
ttp://perfect-logic.net/SampleAction/
0611名前は開発中のものです。2006/12/03(日) 03:06:12ID:YF8PnGLn
自分が書いたJar内のリソース読み込みプログラム
アプレットでも大丈夫
/resourceフォルダ以下にこれとリソースを入れておけば良し


package resource;
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class ContentsReader {
  public InputStream getInputStream(String fileName){
    return getClass().getResourceAsStream();
  }
  public BufferedImage getImage(String imageName){
    BufferedImage image;
    try{
      image = ImageIO.read(getInputStream(imageName));
      return image;
    }
    catch(IOException e){
      e.printStackTrace(System.err);
    }
    return null;
  }
}
0612名前は開発中のものです。2006/12/03(日) 03:16:48ID:fVWUDxZS
確か、Jar関連のプログラミングは、
ClassLoader#getResource
Thread#setContextClassLoader
辺りを使えば大体何とかなったな
0613名前は開発中のものです。2006/12/03(日) 12:38:36ID:YF8PnGLn
>>611のコードが間違っているが見なかったことにする
0614名前は開発中のものです。2006/12/03(日) 12:49:00ID:SWYB2VRJ
>>610
楽しんで作ってるうちが一番だと思うよ
だからアプリケーションでのみだが問題ない

仕事で作るとなるとそれはそれは・・・

とりあえずこのスレを1から読んでみることをオススメする
0615名前は開発中のものです。2006/12/03(日) 21:46:13ID:7tbgDbUF
>>614
斜め読みですがこのスレを一通り見てみました。(^^)
私がコーディングしていて通ったような悩みを他の人も
遭遇していたりして、もっと早くこのスレに来ていればなぁと
思いました。

本職はWin,LinuxのC++/Asm系なので、この言語の高級感
(というかライブラリの充実度)は萌えだったのですが、
仕事となると色々と知らないといけないガイドラインが多そうで
大変なんだろうなぁとシミジミです。
0616名前は開発中のものです。2006/12/03(日) 21:55:02ID:/gdh39Xl
前スレのほうが中身はあったようなきがしたけどまぁ出来上がってるから関係ないね
あとは音楽でもはいっていれば十分かと

できればジョイパッド対応ってところだけどJNIはいるからめんどくせーかな
まぁC本職なら十分楽だろうけど

Javaはネット周りが楽なのでネトゲの鯖から採用され始めてきて最近はクライアントにもきてるみたい
ネトゲは運用がはいるからパッケージと違って保守性って大事だからね
0617名前は開発中のものです。2006/12/03(日) 22:29:48ID:7tbgDbUF
>>616
>あとは音楽でもはいっていれば十分かと
そうなんですよねぇ… ちょっとMIDIで作ったのですが、
プログラムや絵よりも難産で当分無理かなぁという状況です。
(外部ファイルで設定できるとはいえ、開発者の作曲のスキルが…orz)

>できればジョイパッド対応(ry
最初Windows上にcygwin入れて、JNIをサンプルで作ってみて、
エントリポイント関数ができたので、さて作ってみるかと思ったのですが、
その直後「JoyToKey」という素晴らしいソフトを見つけてしまったので、
作成意欲がゼロになりました。
(私は"PCで遊ぶゲームはキーボード"で育ったので、自作ゲームは
キーボードでクリアする方が簡単となってしまい、この辺があんま考慮
されてなかったりします。m(_ _)m)

昔、日経Linuxとかで携帯ゲーム開発のコストの記事かなんかを
みたことあるのですが、技術者のスキルに比べて開発費用が激安で
回収が厳しいとか書いてありました。Javaで簡単に作れる時代になった
とはいえ、これで保守/運用とかあると厳しいんだろうなぁと感じました。
0618名前は開発中のものです。2006/12/04(月) 00:23:03ID:TAJliEjW
キーボードでもいいんだけど、同時入力が出来ない場合が多いからね
しかもこのキーとこのキーが同時に入力できないってのはキーボードによって違う
アクション系では致命的
0619名前は開発中のものです。2006/12/04(月) 00:50:11ID:rOxIjnLZ
>>618
>キーボードでもいいんだけど、同時入力が出来ない場合が多いからね
>しかもこのキーとこのキーが同時に入力できないってのはキーボードによって違う
φ(.. )メモメモ
これって、キーボード的(ハードウェア的)にですか?
OSのキーボードデバイスドライバ的ですか?('=,VMのイベント的ですか?)
(恐らく後者とは思っていますが...)

自作のゲームはサンプルなので、左右とジャンプしか行わないためか、
幾つかのPCでキーボードプレーしても、このような感覚に出会った事が
なかったです。

とても勉強になります。
0620名前は開発中のものです。2006/12/04(月) 02:19:17ID:oYP8msvX
ttp://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89#.E3.83.AD.E3.83.BC.E3.83.AB.E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC
0621名前は開発中のものです。2006/12/04(月) 03:05:27ID:rOxIjnLZ
あー、ハードウェア的でしたか…(^^;
JoyToKeyのようなソフトウェアはキーイベントをOSに発行するから、
こーいう問題はないのかもなぁ…
06225202006/12/04(月) 04:42:32ID:8QL/yjCh
キーボードのタイプにもよるだろうけど左上+スペースが反応しないね。
0623名前は開発中のものです。2006/12/04(月) 04:43:21ID:8QL/yjCh
そしてミス、漏れはこのスレの520じゃない
■ このスレッドは過去ログ倉庫に格納されています