TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
アイディア出す→誰かが作る なスレ
【ai】人工知能、無脳、ai関連スレ IQ2 【製作】
みんなでオリジナルRPGを作ろうぜ!
HSPでRPG
Xファイルを再生するスレ
NScripter Ver.19.00
MMORPGをHSPで作りたいな Rev.2
C++でRPGゲームを作成する
無料で俺がRPGを作れるようにするスレ
やり込みゲー 黄金の国 ツクールVX Ace

Javaで作るスタンドアローンゲーム


1 :2012/12/27 〜 最終レス :2018/02/17
スレタイはアプレットとの対比的な意味と考えてください。
Javaでのゲーム開発は賛否ありますが、国外では割と盛んになってきているように思います。
裏を返せば日本語だけでは情報が得辛い状況であり、寂しく開発してる人が多いのでは・・・。
関連スレ
JAVAアプリでゲーム
http://toro.2ch.sc/test/read.cgi/gamedev/1033926010/

参考になりそうなサイト
・どのイメージタイプを使うべき?
http://weblogs.java.net/blog/chet/archive/2004/08/toolkitbuffered.html
・弱点と言われる?ベクタグラフィックス関連の改善
http://docs.oracle.com/javase/1.5.0/docs/guide/2d/flags.html
・大量のソースコードを公開して下さっている国内サイト
http://aidiary.hatenablog.com/entry/20040918/1251373370
・Java 2D games tutorial
http://zetcode.com/tutorials/javagamestutorial/
・出入りが最も盛んな?フォーラム
http://www.java-gaming.org/index.php
・スプライトシートの切り方等(国内)
http://sky.geocities.jp/kmaedam/java2/java2.htm
動画
3D Game Programming tutorial
http://www.youtube.com/watch?v=iH1xpfOBN6M

2 :
アプレットと切り離す意味が分からん。モバイル等もあるだろうに。
Java自体は好きだけど、こういう排他的な方向性は気に食わん。クソが

3 :
スマホは知らんけどガラケー向けはむしろスタンドアロンなんじゃないか。
ガラケー向けに一杯出てるだろ。

4 :
アプレットだろうがWebStartだろうが
クライアントがJREインストールさせる壁があるのと
アプレットの起動時にブラウザが固まるのがうざくて
どうせ敷居が高いならスタンドアロンで作るほうがいいかなと思ったり

5 :
Java愛好家の仲間が欲しい
OpenGL2DならSlickライブラリお勧めだよ

6 :
俺はアプレットと切り離したほうがいいと思う
アプレットは目的が違って来るよね(ウェブで気軽に触って欲しいみたいな)
やはりソースコードもそういう方向に行っちゃうし、何せネットにあるアプレットのソースに酷いのが多いのは有名(古いのが多いのも理由)
学び始めた子がここに嵌まっちゃってる感がみてられん
「排他的」というのは被害妄想すぎるし、Swingのそれをわかってくると面白くなってくるというもの

7 :
アプレットもSwingじゃん。的外れだと思うぞ。

8 :
JApplet使えってことだろ?
アプレットに限らずだが未だにJFrame使わずFrame使ってたりJApplet使わずApplet使ってるのは不勉強だと思われても仕方が無い
人気無くなったのか知らんがJavaって2004年5年あたりで時が止まってる気さえする
とかいう俺もjre1.6から離れられないわけだが

9 :
JDKは1.7だとjavadocが英語しか使えなかった覚えがあって、まだ1.6使ってますw
JREは自動更新したりアプレットとか開くと更新を要求されるから1.7になってる。
swingではなくawtを使うのは1.6後期までOpenGLと相性悪かったからだろうね。
swingコンポーネント使うとOpenGLの速度潰すからボタンとか自作しろって
slickフォーラムに書いてあったが、もうOpenGL捨ててswingだけでなんか作ろうと思う。

10 :
webアフィ広告をしこんだスタンドアロンゲームを作ってみるつもりだ
(ちなみに俺のホームページは1年間あたり500円稼ぐのがやっとw)
何かいいゲームネタをもってるやついたら、俺と組もうぜ! m6(・∀・)ビシッ!

11 :
チーム・シンコロールのJava使いですチャオ!
同じJava使いとして応援してます
組むのはプログラマがかぶるかなという気もしますが
ゲームネタの雑談するのは乗り気です

12 :
そうですか。
今のところ、とりあえず凸画像だけで作るRTSとか、ローグとか、
そんなゲームがいいかなと思ってます。

13 :
今って描画はレンダーメソッド作ってマルチバッファリングするのかな?
そこで質問なんですが、ダブルにするかトリプルにするかってどうやって決めればいいのでしょうか

14 :
子供はあんまり相手したくないかなっと

15 :
XULRunner+Swingで行こうと思ったが、JavaFX2.0でwebkitが使えるんだね
まだ情報量の少ないFXの調べ物でつまづくとまずいから、swingでいくことにしよう

16 :
へえ〜トリプルバッファリングていうのがあるんだ
自分はいつもデフォのダブルバッファリングしか使ってないので何とも言えないが
欠点: プレイヤー入力から画面出力までに1フレーム遅延が発生する
利点: 処理落ち時に1フレーム分余裕がある
ググったらこんな感じでした

17 :
>>15
XULRunner とは意外な組み合わせ
と思ったらいまではJavaXPCOMで呼びだせるのか
時代は進んでるなあ

18 :
>>17
XULRunnerでweb広告を貼るわけだが、
同根するネイティブ(dll, so)が100MBくらいになる。
これをwindows限定ならば20MBぐらいで済む。
どうせゲームクライアントはwindowsだから
windows以外はバッサリ切り捨てる。

19 :
アクションゲームは重くなったら処理落ちさせた方がいいだろう。
追尾ミサイルが100発ぐらい飛んできてスローモーションの中避けるのは
むしろ盛り上がる。画面が止まったまま当たり判定くらったら嫌なはずだ。
エフェクトなどが重要ではないリアルタイムSLGなんかでは
画面の更新を飛ばしてでもとにかくロジックを更新せねばいかん。
前者はダブルバッファ、後者はトリプルバッファが向いてそうだが、
迷うぐらいならとりあえずダブルバッファを選んだほうが無難だと思う。

20 :
休みなのに人いないな。流石アローンスレだぜ。

21 :
ところで凸画像でなんですか?
ググるとデコレーションメールの画像? ゲームに使えるん?

22 :
そのまんま凸のキャラチップだよ。
八方向のキャラグラ素材作ったら大変だろ?
だから例えばマップ上では簡素なアイコンとして凸絵を表示して、
マウスで駒を選択すると右上にキャラ名と正面向いたキャラ絵を表示するんだ。
それなら前向きの絵だけ用意すればゲームが作れる。
ttp://uploda.cc/img/img50e0368219f69.png

23 :
ナルホド!

24 :
こいつぁ臭い

25 :
HSPでRPG作りたいんですが、正直難しいと思います。
でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
HSPの基礎からすべてを叩き込んでくれませんか??
お願いします。

26 :
スレチだ出て行け坊主

27 :
ゲ製は不毛だな

28 :
ゲームを製作すること自体が不毛?

29 :
ゲームを製作すること自体が不毛だが、それ以前の問題だろ
ゲ製板でゲームを製作してるやつはまずいないしな
この板にいるのはせいぜいこの程度の初心者ちゃん↓
【Eclipse】Android ゲームApp作成【初心者】
ttp://toro.2ch.sc/test/read.cgi/gamedev/1355211405/l50
vipゲ製スレもエロ画像貼って雑談してるだけ

30 :
実際本腰入れ始めると気軽にあげたくないし、逆に気軽にあげちゃう奴は教えを乞う立場なのに何故か自分に酔ってたり・・・

31 :
ゲームを製作すること自体が不毛だと思ってるなら
ゲ製板にゲームを製作している人がいなくても無問題では?
不毛だと思うことをしていないのだからむしろ喜ばしいのでは?

32 :
ソースや成果物は上げなくてもいいけど、出し惜しみせずに情報交換しないとね。
雑談の中ですら批判専門家や乞食くんばかりでまともなやつが出て行ったのがゲ製板だろう。

33 :
情報提供したいけど大した情報持ってないんだよな
個人的には javax.sound.midi で midi を
プログラムレベルで叩けるのを知ったのが自分の最近のヒット。
音はショボ目かもしれんがデフォの gervill シンセを鳴らして遊んでる
自動作曲とか興味ある人いるかな

34 :
switch 文しばらく使わなかったら文法忘れてた

35 :
javaのmidi関係は割と素敵だけどそっから何か作りたいとは思わんな
それならsteinbergからSDK落としてきて素直にVST開発するのがいいが、これまた同志がいない
ファミコンゲームしか作る気ないし音はNSF一択

36 :
switch文はJDK1.7から文字列分岐ができるようになった。
String var = "hello";
switch(var){ case "fuck" : break; }

37 :
>>36
知らなかった…
早速,自分のコードを書き直してみよう.

38 :
ちゃちぃのやウェブ系ならいいが、やはりswingはゲームに合わんなと思う
lwjglみたいなの使うか、SWTとawtを上手いこと使うのがいいね
ただswingはやはり気楽で便利だ

39 :
自前でコンポーネント一揃いを作って持っておきたいけど
あんまり作り方を説明してる文書ってないよな
良く知らんけど、
Swingは描画の更新をイベントディスパッチのスレッドが行わないといけないから
OpenGL の速度が生かせないのかな?
はじめから OpenGL の描画に同期したコンポーネントとして設計すれば良さ気か
Swing を移植できたらすばらしいけど、根元の動作原理を良く分かってないからムズイ

40 :
Swingコンポーネントはメモリイメージで
VRAMに固定されてるテクスチャじゃないからじゃねーの?

41 :
これマジか?
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248211/
swingで974FPSも出てるぞ。
でも自分で試すと58FPSくらいしか出ないんだよな
どうやるんだろう

42 :
eclipseで-Dsun.java2d.opengl=trueを設定するにはどうすればいいんだぜ?

43 :
MinecraftはJava製だが

44 :
>自分で試すと60FPSくらいしか出ないんだよな
ディスプレイのリフレッシュレート調べろ。
>eclipseで-Dsun.java2d.opengl=trueを設定するにはどうすればいいんだぜ?
ググればすぐ分かる
こんなレベルで一個一個質問してたらゲームは遠いぞw

45 :
肝心のゲームよりゲームエンジン作るのが楽しい
スプライトシートに特化したソフトが仮完成した
マップエディタを改良していきたい
エディタ側からイベント追加、フリーハンドでの当たり判定生成ができるよう改良する予定

46 :
設定はできていたけど、エラーが出ていたみたい
$ java -Dsun.java2d.opengl=true ...
java.lang.InternalError
  at jogamp.opengl.awt.Java2D.invokeWithOGLSharedContextCurrent(Java2D.java:345)
  at jogamp.opengl.awt.Java2D.initFBOShareContext(Java2D.java:578)
  at jogamp.opengl.awt.Java2D.getShareContext(Java2D.java:472)
  at javax.media.opengl.awt.GLJPanel.<clinit>(GLJPanel.java:193)
Caused by: java.lang.NullPointerException
  at jogamp.opengl.awt.AWTUtil.lockToolkit(AWTUtil.java:90)
  at jogamp.opengl.awt.Java2D.invokeWithOGLSharedContextCurrent(Java2D.java:336)
   ... 3 more
Exception in thread "main"
ぐぐたけどわからんちん

47 :
できたー。800×600ピクセルの画面で100FPS超え
http://uploda.cc/img/img50e58004f1dfb.png
ディスプレイには同期していないので60以上でています
エラーを出していた部分をまるまるコメントアウト:
class GLPanel extends JPanel implements ... {
 ...
 static {
    // Force eager initialization of part of the Java2D class since
//    if (Java2D.isOGLPipelineActive() && Java2D.isFBOEnabled()) {
//     Java2D.getShareContext(GraphicsEnvironment.
//        getLocalGraphicsEnvironment().
//        getDefaultScreenDevice());
//  }
 }
}
こんなライブラリの内部をいじってコメントアウトしてしまって大丈夫かは知りません
というか、良く見たら背景のGradientPaintが表示できてない…
-Dsun.java2d.opengl=false の場合は
http://uploda.cc/img/img50e582e27afd5.png
やっぱコメントアウトしてる部分で初期化処理してるのかなあ

48 :
う〜ん、出来たような
http://uploda.cc/img/img50e5927fb81f4.png
グラジエントが縞模様っぽいのは仕様か…?

49 :
みんなは、Game Engineとか何使って作ってる?
有名所だと、
Ardor3D / cocos2d-x / Crystal Space / DimsensioneX Multiplayer Engine / EasyWay Game Engine
Env3D / Espresso3D / Golden T Game Engine / Irrlicht Engine / Jake2 / JGame
JMonkey Engine / Joge / JOGRE Engine / Nebula Device / Spring
だと思うんだけど
ref
( http://en.wikipedia.org/wiki/List_of_game_engines )
( http://content.gpwiki.org/index.php/Game_Engines )
やっぱし2dものなら、cocos2d-xとかで、頑張って3DするならArdor3Dまたは、Irrlicht Engineとかって感じ??
あと何かお勧めのライブラリとかある?

50 :
でも垂直同期に合わせられないから旨くないかなあ
いい加減寝るか―

51 :
>>49
スマホで作らない限りスマホにも使える系は面倒かなと。
あとSpringてDIのあれとは別物?

52 :
何を目指すかによるとしか言えんな
最新ゲーム機の出力に近づけたいならゴージャスなもの用意すべきだし
俺は物理演算をどうするかを判断基準にしている
割とその辺の数学が好きだったり、ファミコン時代の試行錯誤が体感できるからあまりライブラリは使わない
というか個人製作でリアルさ求め始めると血迷うのが見えている

53 :
素材も作りきれんからな

54 :
初心者です
public Player(int x, int y, int id) {
}
みたいな感じで自機を用意しました
idによって違うイメージがdrawされるようにしています
これを利用して自機だけでなく敵も作りたいのですがどうやってPlayerクラスを利用するのかわかりません
Player jiki = new Player(200, 200, JIKI);
Player teki = new Player(400, 100, TEKI);
のように二つ用意し、それぞれdrawすると、後に書いたtekiしか表示されなくて困っています
Playerを配列にしてもみたのですが、drawすると後に書いた敵しか表示されなかったです
オブジェクトは二つ生成されてもswingの描画はそうはいかないということですかね

55 :
ちゃんと書きます
public class Player {
public Player(int x, int y, int id) {

}
public void draw(Graphics g) {
g.drawImage(idの値によってイメージ切り替える処理);
}
}
これをJPanelを継承したクラスに自機と敵と言う形で二つインスタンス化したいです
JPanelを継承したクラスのコンストラクタでインスタンス化し、paintComponentでそれぞれdrawしています

56 :
見た感じ大丈夫そうだけど。。
思いつくところとしては
・画像データはちゃんと読み込まれているか
・描画位置が完全に画面の範囲外になって見えていないのでは
・画像が重なって下になった画像が見えていないのでは
→ 試しに JPanel の paintComponent で直に drawImage してみる
→ Player の draw(g) で drawImage の代わりに fillRectangle とかしてみる(setColorを忘れずに)

57 :
MineCraftってあれJavaでつくってるんですよねJavaであんなクオリティ高いゲームつくれんだと思ったね

58 :
>>57
出来と言語は関係ねーぜ。

59 :
>>57
まぁ、考えかた次第だし何を求めているかだけどな。やっぱり、C++/Cで出来るのに、Javaでは出来ない事も多い。
それして、Windowsなら、似たように(場合によっては更に簡単に、)C#でもっと高クオリティのが作れる。
Javaは色々な機器で動かせるようにはできてるけど、ゲームでresponse早くして、高画質とかを求めると
それようにその機器向けにチューンナップが必要で、その点Microsoftはガチでやってるからそこにはまだまだ勝てない。
でも、一般的なゲーム(商用含む)でも、そこまでガチなものを作る事はないけどな。
HD+でfps60出すぐらいなら、ライブラリの呼び出し方一本で大抵済むし、
そして、その位の性能だったら今のPCなら Windows/Mac/Linux どれでもJavaで十分イケル。
というか、Pythonとかのもっと軽い言語でも、ライブラリを適時呼び出して上手いことやればいいだけなので、出来るしな。
大雑把な値として経験から、JavaでWindows Gameを作るのと比較すると、
C#(XNA)との差は軽いゲームで5%強遅く、重めでキツイ処理入れ出すと20%弱ぐらい遅くなる。
さらに、C++ でガチでやるのと比べると、1/3〜1/5ぐらいしか性能でない。
 ・ C++/C(GPU) >> C# ≧ Java > LL系
ただし、C++はガチでやり出すとメモリ管理も含め資源の調整とかGPU向けの細かい指定とかとか、
ただでさえ、開発期間と知識が求められる上に、コンパイル時間とか半端ない・・・・・・。
実際に比べるのは不可能だけど、少なめに見ても、開発時間は30倍は堅い。
やっぱし大手のガチProjectじゃないとできないし、結局それなら、普通にMiddleWareを買ってきた方が良い。
(Programmerは楽とは限らないがwww orz)

60 :
JavaSE7からAWTとSwingが混ぜて使えるようになったってホント?

61 :
でけた
http://uploda.cc/img/img50e9176927843.png

62 :
AWTとSwing混ぜる必要ある?
それよりもSWTとSwing混ぜて使えるようにしてほしい

63 :
ディプロマシー系統っていうのかわからんけど
このぐらいのゲームなら簡単に作れそうだ
ttp://clovergames.3zoku.com/game.html

64 :
idによって違うイメージがdrawされるってのはやりたいことは
なんとなくわかるんだけど設計としては評価しづらいな。

65 :
ImageとかTextureとかSoundもってるオブジェクトをセーブするとか?
XML形式だと入らないだろうし、Serializeしてバイナリで吐いても素材分巨大化する

66 :
JMF使おうかと思ってたけどいまいちだな。
midiはJDKに入ってるJavaSound、MP3はこのライブラリが使いやすそう。
ttp://www.javazoom.net/mp3spi/mp3spi.html
あとは.wavが使えるものがあれば十分なはず。

67 :
wavはjavax.soundで普通にならせるようだ

68 :
swingのルックアンドフィールってsubstanceの他にいいのある?

69 :
>>62
>それよりもSWTとSwing混ぜて使えるようにしてほしい
謎杉。何がしたいの?
アクションにも対応できる骨格をまともに作ろうとするとawt要素が増えてくるよね
自分でレンダリングするならbufferstragegy使わないと損だし。
そしてSWT使うならダブルバッファリングするのは当然だ
何が言いたいって、awtはゲーム開発において偉大だということ。
これは低速GUIと呼ばれるSwingと対比してではない。

70 :
OpenGL使うならフレームワークとか使うだろうし
今更awtとかswtを直接使う人いないんじゃないの?

71 :
当たり判定について教えて欲しいのですが、
壁にめり込む前に修正してやるのか、とりあえず動いてみてめり込んでいたら修正するのかどっちがいいのでしょうか
前者の場合、
(壁までの距離)<(1フレームで動ける距離)のとき、壁との距離分だけ動かす かな?
こっちのほうが何だかカッコイイ気もするけど、何か自由度が下がりそうな気がするんですよね
ただ後者は楽だけど、めり込んだ瞬間にアクション起こされた時の対策を加えないといけないですよね

72 :
STGだろうか。。。
・全てのオブジェクトの移動前と移動後(予定)の座標を取得する
・当たり判定
・予定通り動かす or 衝突アクション
マウスでドラッグしながら塗るようなアプリ(マップエディタとか)だと
マウスの座標現在値だけでやると早くマウスを動かしたときに
ドラッグ間の線が途切れるんだよね。そんなときにもこのやり方が役に立つ。

73 :
>>71
どういうゲームを想定してるのか分からないけど,
俺が作ってる3D STGの場合,後者でやってるよ.
…次のフレームで本当に衝突するか分からないし.

74 :
動きが速いとすり抜けたりしない?

75 :
>>74
俺の場合は,衝突判定オブジェクトは球とか単純な形状のみでやってて,
例えば移動球同士の場合は,相対距離(の二乗)を
時刻tを変数とした二次方程式で表して,それを解くような感じでやってる.
なので基本的には,すり抜けはおきない.はず.(バグってなければ)

76 :
ああ,1フレーム前と現在のフレームの位置情報を各々保持してて,
その間はそれぞれ等速直線運動をしている,という前提でね.

77 :
作ってるのはマップチップを敷き詰めたスクロール無しの平面でのアクションゲーです
移動は上下左右斜めも可能でピクセル単位です
また一つ質問なんですが、プレイヤーの当たり判定をするポイントってどこにするべきなのでしょうか
自分はプレイヤーの中央に判定点を取っているのですがいつもグチャグチャになります
当たり判定を円のような面積?で取る方法はやったことがないです。2Dでも使えますか?
点ではなくて面積で当たり判定を取る方法・・・
ブロックのサイズから面積を計算して、プレイヤーと重なった面積が○○以上になれば当たったことにする みたいなことですか?

78 :
普通、2Dだと四角か円で判定とるだろ。
人の形をしたものにはキャラグラの80%ぐらいの大きさにあたる
四角形で判定とればいいし、巨大なヘビとか曲がるレーザーなら
小さい四角の判定を鎖のように繋げて判定にすればいい。

79 :
ヒット判定のすりぬけ問題は前もって交点検出しないとだめよ。

80 :
>>77
って、言うか
今どんな判定してんの?
まさかブロックの座標を総当りで判定?

81 :
スクリーンショットとか上げてよ

82 :
>>80
ブロックは奇数行・列に配置させてるので単純に、if(マス目%2 != 0)みたいな感じでやってます。
自分がやってる方法はいつもこんな感じです。
public int x, y; // プレイヤーの左上の点
private static final int S = 32; // プレイヤーの縦と横のサイズ
/**
* 判定点を返す。
* @return プレイヤーの判定点の座標
*/
private Point getPoint() {
return new Point(x+S/2, y+S/2);
}
移動の際int directionに方角を代入しているので後は
・動けるか否かのbooleanを返すメソッド if(direction==RIGHT && (getPoint.y)/S%2 != 0) (右へ移動するとき、奇数行であれば動けないの意味でfalseを返すみたいな。)
・修正が必要な領域に入ったか否かのbooleanを返すメソッド
・修正するメソッド
みたいな感じに細かく定義していってます。
ただ、if(マス目%2 != 0)のように定義しちゃうと、
プレイヤー:□、 ブロック:■とする
 □
 ↓
■  ■
のように、少し左によった状態だけど判定的にはokなとき
■□ ■
のようになって、ここで右側にいけない(右の壁まで数ピクセル進めない)のって気持ち悪いと思うのです
こういう時だけ場合分けするにしても煩雑になってきますし、そもそもの当たり判定の方法がよくないのかなと思いまして質問しました。

83 :
>>82
仕様に合わせた最適な判定は知らんが(仕様が分からないし)
普通は中心じゃなく四隅を判定する
右移動中なら右上、右下だけとかの省略はできるが
で、四隅をプレイヤーサイズじゃなく判定サイズにする
ブロックがこんな感じに敷き詰められてると思っての回答になるが
■ ■ ■
■ ■ ■
■ ■ ■
奇数行だから横に動けないとするんじゃなく
奇数行で右に移動中なら右側の判定x座標も奇数目になったら
めりこんだ座標分戻すってやる
斜め移動ならブロックのどの面に先に当たったかも必要になる

84 :
お〜こんなスレあったのか
ちょっと前にTDぽいの作ったなぁ

85 :
>>83
四隅を判定するのが普通なのか?物凄くソースが汚くなりそうなんだが。
普通Rectangleのintersetsみたいなのを使うんじゃないの?

86 :
訂正:intersectsね

87 :
Javaは知らないからそう言う便利なのがあれば使えば良いけど
やってる事自体は変らないでしょ
升目と矩形の判定を中心一点だけではやらない

88 :
>>85
当たり判定クラスを作るだけだろ。
むしろ四隅を判定しないやり方ってありえないだろ。

89 :
ゲーム(マリオ)だと踏んだとか横から当たったとか
ゲーム独自の判別する必要があるし、
既存クラスライブラリに全部やってもらおうというのは無理だよ。

90 :
>既存クラスライブラリに全部やってもらおうというのは無理だよ。
んなことわかりきってる。だが可能な限りjreに依存するべきだと思うよ。
>むしろ四隅を判定しないやり方ってありえないだろ。
全然ありえなくない。逆になぜ四隅を判定する必要があるか書いてごらんよ

91 :
ちなみに、中心一点というかそれを基準にするのは悪くないと思う
なにより二次元における閉じた図形であれば必ず重心が一点のみ存在する訳で、これほど保守性の高い性質はない。
あと、
if(playerRectangle.intersects(blockRectangle) {
Rectangle intersection = (Rectangle) playerRectangle.createIntersection(blockRectangle);
...
...
}
で重なった矩形が取れるなんつーくっそ便利なモノ使わないと損だと思うよ。
四隅にこだわってる理由がよくわからんし、一応ここJavaスレだで。

92 :
>可能な限りjreに依存するべきだと思うよ。
的外れ。
>なぜ四隅を判定する必要があるか書いてごらんよ
Rectangleを使うと四隅を判定しないのか?
>>82-83の話をしてるから、そこんとこ踏まえてね。

93 :
>>92
>>91が四隅を判定しているように見えるのか?
判定してるのは交差してるか否かだろうよ。
「だけど内部処理は・・」って?どっちが的外れなんだか。

94 :
>>93
プレイヤーとブロックの四隅を判定しているように見えるけど、何か違うのかな?

95 :
>>83(俺じゃないけど)は設計の話をしているわけで、
実装において物理エンジンでもRectangleでも
より原始的な方法(int x,y,w,h)でも好きにすればいい話。
1から10まで書かないとわからないようだな。

96 :
A⊂Bの意味で言ってるのね。
ならなおさらBのRect使えよと言いたいが、設計の段階の話なら
>より原始的な方法(int x,y,w,h)でも好きにすればいい話。
で納得。

97 :
単純にこんな感じでいいんじゃないの?試してないけど
マップチップを敷き詰めた状態でブロックがいちいち矩形座標持ってるとも思えないし
あと上下左右4方向の移動・当たり判定が理解できるまでななめ移動は考えない方がいい
int CHARA_X, CHARA_Y;  // キャラピクセル座標
int CHARA_SIZE;       // キャラサイズ(XY同サイズとして)
int CHARA_MOVE;      // キャラ移動量(CHARA_SIZE < CHARA_MOVEだとすり抜ける)
int CHIP_SIZE;        // マップチップサイズ(XY同サイズとして)
int MAP[][];          // マップ(0:移動可 1:移動不可)
private void moveChara() {
  if (direction == RIGHT) {
    CHARA_X += CHARA_MOVE;
    while (MAP[CHARA_Y / CHIP_SIZE][(CHARA_X + CHARA_SIZE) / CHIP_SIZE] == 1) {
      CHARA_X--;
    }
  }
}

98 :
ブロックの大きさも一律固定だろうしな。
単純なアプリなら単純に作ったほうが工数が少なくて楽。
保守性がどうとか初心者が背伸びして粋がってるとしか思えん。

99 :
別に俺が言ってる方法は複雑じゃないと思うんだけどな〜。(ソース量の面やAPI的にも)
「基本図形を描画するメソッドは使うな!」的な流れも確かにあったが、今は利用できるものは利用したほうが便利でシンプルに書けることに気づいてるじゃん。
Java2D使うのは初心者には無理だと思ってるならそれはバカにしすぎだと思う。
http://www.youtube.com/watch?v=Otl24e_nuyc
例えばこういうチュートリアルみてもビギナー向けの解説としてるけど?

100 :
awt使うのは・・・に訂正。

101 :
なんか感じの悪いスレだな

102 :
>>97
風呂入ってコード思い浮かべたらいきなりバグあったわ。気晴らしは大事だね
while (MAP[CHARA_Y / CHIP_SIZE][(CHARA_X + CHARA_SIZE) / CHIP_SIZE] == 1) {
これだけだと右上しかチェックしてないわ。下記が修正パッチね
while (MAP[ CHARA_Y           / CHIP_SIZE][(CHARA_X + CHARA_SIZE) / CHIP_SIZE] == 1) ||
    MAP[(CHARA_Y + CHARA_SIZE) / CHIP_SIZE][(CHARA_X + CHARA_SIZE) / CHIP_SIZE] == 1) {

>>99
キャラクタ同士の当たり判定ならわかるけどブロックとの判定でもそうなの?
俺は勝手にボンバーマンをイメージしたけど、本当に1つ1つのブロックもRect座標を持つべきなの?

103 :
>本当に1つ1つのブロックもRect座標を持つべきなの?
ボンバーマンなら特殊形状のマップでも
1ブロックの組み合わせに過ぎないから必要ないね。
ゲームがブロック崩しで、各ブロックの大きさや形(長方形・正方形)が
異なるなら、Rectangleが望ましい可能性が高い。

104 :
必要か、必要でないかはアプリケーションの仕様が決める。
オブジェクト指向設計として何が望ましいかはまた別の話。
オブジェクト指向設計としては、定数が各コードに散らばるのは良くない。
そこんとこに拘るなら、ブロッククラスにRect持たせて、
コンストラクタでRectの幅と高さを定数値に初期化すれば
定数(final int BLOCK_SIZE)を使ってる部分を隔離できる。

105 :
そんな話だっけ?
俺は単純に>>71からの一連の質問に対して
>>85(yYWDydAV)の案は合わないなと思ってるだけだけど。

106 :
>単純に>>71からの一連の質問に対して〜
そうだよ。質問者はアプリケーションの実現方法について聞いてる。
でも>>6 = >>59 = >>85 = yYWDydAVの話が噛み合わないのは、
目的を達成すれば、ゲームの仕様を満たせばそれでいいってわけじゃない
みたいな話を押し付けてるからだと思うんだよね。
あえて質問者を無視して「1つ1つRect座標を持つべきなの?」に答えれば
>>104みたいな話にはなる。

107 :
まあオブジェクト指向設計とか一般論としてどうだろうと
質問者にとって良い回答をすべきだろうな。

108 :
>>103
誰も一つ一つにRect座標持たせるなんていってないぞい。
先読みしてぶつかる可能性があればRectangle生成するようにする。

109 :
オブジェクトのサイズが小さくて移動速度がサイズより大きいような
場合はすり抜け対策しようねって話じゃなかったのか。

110 :
>>108
>先読みしてぶつかる可能性
俺ならここでチェックしてしまうけどな。この先読みのソースはどんなものになるか知りたいな。
>>109
最初は単なる当り判定の話だったけど、ひょっこりすり抜けの話も加わってるね

111 :
ショボゲー製作中。
ttp://kie.nu/JdF

112 :
一度だけ実行するときとかのラッチ回路?ってどうかくのがいいんでしょうか
自分はfieldにstaticなintを初期化して、メソッドをくぐれば1にするみたいな書き方をするのですが、
fieldまで遠かったり、それだけのために用意することにためらいがあります

113 :
staticイニシャライザで済むなら

114 :
やってみたが升目あるゲームならrect基準にやるのありだなと思った
むしろ全マスにrectもたせても重くはならんのと違いますかね
マス目クラスにrectを継承させる
描画は
g.fill(this)か
g.draw(this)ですむ
移動しないブロックなら
コンストラクタの引数でsetBoundsして、必要なれば描画も用意
移動するブロックなら(もちろん自キャラでも)
升目クラス描画のところでsetBoundsすれば、スレッド走ってたらレクトも動いてくれる
そしてなにより、intersectsで判定してる様子を描画すると中二病に火がつくww

115 :
あ、もちろん画像なら画像を描画。
別に何もかもrectでやらんでいいがどうせextendsする予定のものがなければ、
継承したrectのwidthとかhight使うと良いんでない?
マップ全体が一つのオブジェクト的な設計より、1マス目事に判定が違うのだから1升目ごとをオブジェクトとみたほうがいいかも
ちなみにswing使って囲碁や将棋作るときってこの考えだよね
1升目をJComponentで作って、必要な数だけgridlayoutでしきつめる
これじゃアクションならさすがに重いからawtのrect使うと。

116 :
とりあえずお前等って何か作ってんの?
目的もなくあたり判定の練習とかしてもしょうがないぜ。

117 :
やらない奴より100倍マシ

118 :
質問なんだけど、MouseListenerやKeyListenerの処理を画面の描画の状態によって切り替えたい場合どうしてる?
例えば
private static final int TITLE = 0;
private static final int MENU = 1;
private static final int BATTLE = 2;
private int status;
private boolean getStatus() {
return status();
}

のように用意して、画面が遷移したらstatusに代入し、getStatus()の値によってswitch文で分けるとか?
もっと上手いやり方あったら教えて欲しい
ここが無駄にコードを膨らませてる気がする

119 :
>>118
とりあえずstatusはenumにするとして,
あとは俺もswitch文で分けてる.

120 :
何だやる気のないやつしかいないのか。
>>118
ひとまずint flagとswitchで分けて、あとでストラテジーパターンに変える。
いきなりストラテジーパターンでやると無駄が出る。

121 :
もうダメだわw
Twitterサイバーテロ事件の原因は話題のJavaの脆弱性wwwww 今すぐアンインストールしろwwwww
http://engawa.2ch.sc/test/read.cgi/poverty/1359787786/

122 :
せやな

123 :
enumがStringだと向きとか困るな。
無名クラスで代用するのはどうよ?
abstract class Angle { int index; }
final Angle left = new Angle(0){};
final Angle right = new Angle(1){};
final Angle down = new Angle(2){};
final Angle up = new Angle(3){};

124 :
Javaは危険だからインストールすらしてない

125 :
スタンドアロンゲームなんだからローカルで全権限与えて実行だろ
WEBの脆弱性とか関係無いんじゃないか?

126 :
>>125
彼らは馬鹿だからそういうの理解出来ないんだよ

127 :
C/C++プログラマーのJavaのネガティブキャンペーンの一貫だな

128 :
>>127
全然関係ないが

129 :
指摘された脆弱性50個のうち40個以上はJavaアプレットの脆弱性。
ブラウザでアプレットの実行をオフにしておけばほとんど影響ない。
そもそもJavaアプレット自体すでに時代遅れの手段で、使っている
サイトはほとんどない。某回線速度測定サイトはアプレットらしいが。

130 :
ですがアプレットもまた元気になって欲しいですね
って、このスレッドを立てておいて言うのも申し訳ないのですが
http://www.java4k.com/
なるサイトを見つけまして、アプレットx基本APIx4k縛りなんていう面白そうなコンテストを毎年やってるみたいです
しかも中々熱い
アプレットを非難する意味で立てたスレッドじゃないということだけわかってくださいまし

131 :
JREとインストールするとアプレットが動いてしまう事、
ブラウザでアプレットの実行をオフにしても起動する脆弱性、
これが問題になったんだろうけど、普通の人にはわけわからんわな。

132 :
今回の脆弱性は最新版 update 13 で全部修正されていると考えていいの?

133 :
update 13のコントロールパネルでアプレットを動かないように指定できる。
でも一般人はそんなこと言われてもわからず、騒ぎ続ける。
C#がSilverLightを捨てたのは正解だったかもな。

134 :
そもそもアプレットの話題はすれ違い
何のために>>1が重複スレともいえるこのスレを建てたか分からなくなる

135 :
質問
自分でレンダリングする場合、敵だったり弾だったりのインスタンス化と描画の時差というか、タイミングはどうすればよいのですかね
原始的?な方法だと
10発撃てる→あらかじめ画面外に10発とも描画しておく→キー入力でsetter使って移動
みたいな感じですか。これは時差?が無いので描画メソッドもスッキリしそうです。
ですが、
まずキー入力→その結果インスタンス化→そして描画
という流れにしたい場合の描画メソッドはどのように書けばいいのですかね。
例えば、
ArrayList<Teki> tekiArray = new ArrayList<Teki>();
を用意しておき、キー入力を受けて
tekiArray.add(new Teki(...));
な設計での描画をどうするかということです。
if(tekiArray.size() != 0) {
for(int i=0; i<tekiArray.size(); i++) {
tekiArray.get(i).draw(g);
}
}
みたいなことも考えましたが、うーん・・・

136 :
質問の意味が全く分からないんだが・・・
時差って何やねん?

137 :
画面外にあるものを描画することはないだろ。
あらかじめインスタンスを弾の数だけ用意しておくのは正解。
画面の外に出た弾はフラグ立てて休ませておいて使いまわすのがよい。
休みフラグの立っている弾は当たり判定と描画をしないでreturn;。
発射時に毎回インスタンスを生成するのを避けるのは
ガベコレ持ち言語でSTG作るうえでの基本。

138 :
敵と敵の弾はどうだろうね。
ものすごい大群とかじゃなけりゃその都度new()+add()でいんじゃね?
どうせしょぼいもんだろうしな。

139 :
>>135 でいいと思うけど
その draw がどこから呼ばれるのかちょっとだけ気になったりする

140 :
>>136
時差というか、前者では実行した瞬間から描画されてますよね?(画面にみえてないだけで)
しかし後者はキー入力を受けてからなのでプログラムを実行した時点では描画されていないですよね?
つまり描画メソッドに条件式必要になるとおもうのですが。
>>139
drawはTekiクラスがもっているメソッドです。(オフスクリーンのBufferedImageに描画するため)

141 :
まずメインループがどうなってる?なんか怪しいぞ

142 :
???

143 :
>>135
玉のテクスチャと透明のテクスチャ作っといてまずそれを自由に
切り替えられるようになるべし。まあ画面外に出しといてもいいけど。

144 :
メインループってRunnableのrun()メソッドのことかな・・・。
@Override
public void run() {
updateKey();
updateRendering();
}
みたいにキー入力をアップデイトしてからダブルバッファリングしてます

145 :
俺は>>137の方法でやってるなぁ.自分の弾も,敵の弾も.
発射の都度にnewしたら,たくさん撃ったときにとても処理が遅くなったし.

146 :
>>145
確かに打つ瞬間が遅くなりますが、しかしその方法だとArrayList使う意味がないというか・・・
シューティングを例にあげたので、「初めから数を決めてnewしておく」が最善かと思いますが、
もしそのインスタンスの数がかなり多い場合を仮定すると、それはプログラム全体を重くしますよね?
それで移動だとかその他の処理の優先度を高くしたい場合致命的だと思うのです

147 :
シューティングで弾が多すぎる場合はむしろ処理落ちさせた方がいいんじゃない
避けれないし

148 :
昔はハードの都合で処理落ちしてたけど
それがむしろ迫力のある演出にもなっていたな。
>>146
メモリが枯渇すれば実行例外でアプリが強制終了。
たぶんオブジェクトを配列で100万超えたあたりから
あとメモリを確保する事自体は重さと全く関係ない。
新規確保+捨てるを繰り返すと重くなる。(捨てたものを回収するから
ならば1つのシーンとかステージの間、ずっと捨てなければ良いってのは
C#やJavaでゲーム作る際のコツ。
もし初心者でなければ、オブジェクトプールを作ればいい。

149 :
あとArrayListでadd()したものをremove()していながら
速度がどうとかいってるのはおかしな話だと思う。
敵が1000いて、300番を1体remove()したら後ろ700体を詰めなおす処理が走るけど。

150 :
え!remove()したほうが重くなるんですか。

151 :
>>150
それが中でどういう処理されてるか想像してるか?

152 :
Javaを使うなら少々の処理落ちには目をつぶれ
ど〜〜〜〜しても処理落ちを許せないならJavaなんか捨ててしまえ
まあ >>135 みたいなこと質問してる時点で
前者しかあるめぇ

153 :
そんな使い方したいならLinkedList使え
これならremove()しても軽いはず

154 :
JavaFX使ってますか?

155 :
たま〜に使ってるけどゲーム開発には使ってませぬ
だけど8きたら使うかも

156 :
壁とキャラの当たり判定難しい。タイルでするなら
if (map[y][x] == 1) {
return true;
} else {
return false;
}
だけど、ピクセルなどよくわからない。

157 :
>>156
ピクセル単位?と思ったが恐らくエスパーすると、矩形同士の交差判定をしたいのではと思った
物理的な接触はそうだが、でも論理レベルだとそのタイルと同じことだと思うよ
…最終的にどんな内容なのか知らないが

158 :
すみません。Rectangleのやつではなく、
■■■■■■■
■ □ ■
■■■■■■■ のピクセル単位です。
Javaでゲーム作りますが何か?のやつで、
今現在、ドラクエみたいな全方向移動をピクセル単位で動かして当たり判定を書きたいと思っています。
そこのマリオで配布されているコードを写して、左右”だけ”の当たり判定をやろうとしたのですが挙動が変になりました。(判定なしは問題無し)
左の壁の判定は大丈夫なのですが、右へ行くと途中で何も無い空間で止まってしまいます。
yも下へある一定下がるとエラーがでます。y方向には何も変更は無いはずなのですがどうなっているのでしょうか?
public void update(){
x += vx; // 当たり判定実装の時は消す
vx = 0; // 上に同じ
y += vy; //
vy = 0; //
double newX = x + vx;
Point tile = map.getTileCollision(this, newX, y);
if (tile == null){
x = newX;
} else {
if (vx > 0){
x = Map.tilesToPixels(tile.x) - WIDTH; // 右の壁にぶつかる前に止まる。なんで?
} else if (vx < 0){
x = Map.tilesToPixels(tile.x + 1); // この左の壁の判定は大丈夫。けど数値を10とかにすると変になる
}
//vx = 0; // もともとあったけど、自分のやつじゃ動いてくれなかった。
}
vx = 0; //これで動く
}

159 :
>>158
どういう計算とか、どういう処理が必要とか、そもそも具体的にイメージ出来てるか?
つまり、そのコードの全てのタイミングで、各々どういう計算でどうなればいい、と。
例えば、そのMapクラスのスタティックメンバみたいなメソッド、それ何やってるの?
普通に書くと、単純に式書いて終わりだと思うけど、その中だとか…
何も考えずにコピペ&丸投げとかダメだよ

160 :
キャラクターが1ピクセル単位で動くとしても
マップの当たり判定はマス毎にあるよね?(1マス=32x32ピクセルとか)
だからキャラクターサイズ(32x32)とマスのサイズ(32x32)で
判定するのをベースに、キャラクターのピクセル単位の移動を混ぜる感じになるのでは?

161 :
>>159, 160
確かに、コピペなどマズかったと思います。
そのサイトやdeveloping games in javaで図を使って説明されているので、何となくは理解しているつもりです。
なぜy方向に影響が出ているのかは分かりませんが
基本的にコードはそのままで数値を変えて学んでいるので、MAPクラスもそのサイト(javaでゲーム作りますが何か?)のマリオと同じです。
ttp://aidiary.hatenablog.com/entry/20050616/1255785698
キャラがピクセルで判定がマス毎ピクセルの混じりだから?難しいです。
タイルならまだ幾分やさしいのですが、動きがカクカクなのでピクセルにしたかったからです。

162 :
なんか勘違いしてるようだが、「タイルだからカクカク」で「ピクセルだから滑らか」ってのは君の思い込みだよ。
1マスごとの移動だってピクセルを基準に動かしているわけだが。
おそらくkeyPressedでフラグ立ててkeyReleasedでフラグ折って動かす場合とその判定をしないときの挙動をわかってない。

163 :
そうなのですか?なるほど、確かに1タイルは32X32ピクセルですね。
フラグってこれ?のことですか?keyReleased も同じみたいですが。
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
if (key == KeyEvent.VK_A){
leftPressed= true;
}
if (key == KeyEvent.VK_D){
rigtPressed= true;
}
if (key == KeyEvent.VK_W){
upPressed= true;
}
if (key == KeyEvent.VK_S){
downPressed= true;
}
}

164 :
>>163
そうそれ。
君がいう「カクカク」な状態って言うのは、そのフラグ判定してるところに直接移動メソッドを書いた場合のことっだとおもう
なぜかっていうとそのkeyPressedメソッドはupdate()されていないよね
だから「押している間動かす」ということをしたければ、キープレスでフラグtrue、キーリリースでフラグfalseにしておいて
メインループに書くupdate()メソッド内で移動処理するわけ

165 :
なるほど。
たしかに、それなら当たり判定はシンプルのままに出来そうですね。
お手本(サイトで配布されているコード)を見てもちょっと混乱してしまったので、もう一度Developing games in javaの当たり判定コードの理解を頑張りたいと思います。当たり判定って難しいです。

166 :
すごい簡単な話で
・移動判定はマス単位
・移動アニメーションはピクセル単位
にするだけじゃないのか?

167 :
いやそれだけじゃないと思う
十字キー押し続けると一回入力あってから少しディレイしてから連打?みたいな挙動になるでしょ?
ようするにこれを「カクカク」した状態と表現したのだと思うよ
だからmousePressedとmouseReleasedでフラグ判定して、メインループでtrueなら移動みたいに、押している間動くようにした状態をなめらかといっているはず

168 :
ぷよぷよ作ってるんだけど移動と回転をどう定義するといいだろうか
とりあえずやったのは
int[][] field = new int[12][6];
のようなフィールドを0に初期化して
int[][] puyo = new int[3][2];

for(int j=0; j<3; j++) {
for(int i=0; i<2; i++) {
if(i == 1) puyo[j][i] = 1;
}
}
のように初期化し、
010
010
で1のときに描画して、移動処理はfield[j+offsetY][i+offsetX] += puyo[j][i];
のようにした
だけどこれじゃプヨを右方向に動かしたらfieldの横幅を超えてしまうよね?だからエラーでてしまう。
C++だと同じやり方でエラーでないんだけど、もしかしてC++の場合は初期化したfieldの幅を超えたら勝手に広げてくれていたのかな?
Javaでこれをするにはどうしたらよいだろう

169 :
>>166, 167,
それもあるのですが、マス(32X32)だと一歩歩くごとに32ピクセルも移動します。
ゼルダの時空の章などはもっと歩幅が小さい(1ピクセルとか?)のでマス移動だと「カクカク」してしまいます。

170 :
>>168
offset足した値が横とか縦を越えていないかチェックしてはじけばいいのでは。
C++の場合はオーバーランしてメモリ壊してるよ。
警告なんて出ない。

171 :
>>168
上下左右に1マスずつ広げて壁の部分もフィールドの一部ということにするのが簡単かと
ちなみにあれ実はフィールドの最上部に見えないけどぷよの置ける部分が存在するから縦は13段だよ

172 :
>>170
>offset足した値が横とか縦を越えていないかチェックしてはじけばいいのでは。
これ、自分も考えたんだけど、そのチェックに加えてpuyo配列自体の1の部分も1列横にシフトとかそういう面倒な操作いるよね・・
だから投げそうになったんだ
>>171
なるほど。だけどそれでもかなり大変なコードになりそうだ・・・。見えているゲーム領域の左上とfield[0][0]が対応しなくなるよねきっと。
やっぱC言語ちっくなpuyoをint型にするような設計はよくないのかな。
fieldの値を基準にpuyoを描画するんじゃなくて、Puyoクラスを作って独立させて描画させるべきか。
でもfieldの状態を更新するのが難しくなりそう・・・

173 :
質問。
http://aidiary.hatenablog.com/entry/20050624/1255786339で、マリオにファイヤーボールを出させたい。
(^o) 〜〜@ な感じ。
どうやったらマリオの場所をスクロール中の画面の場所を特定できるようになるのだろうか?
マップスクロールで大幅に横に移動するー>現在のマリオ場所をとって来るー>ボールにその位置を入力ー>発射ー>ボールは画面外。
ーーーーーーーーーーーーーーーーー
|    (^o)          〜〜|@ <- ボールは画面外
| |
ーーーーーーーーーーーーーーーーー
ボールのクラスで
public void setPos(double x, double y) { // 位置設定
this.x = x;
this.y = y;
}
MainPanelクラスで
Point posX = player.getPos()
weapon.setPos(posX.x + player.getWidth() / 2, posX.y); // posX.x -> 現在のx座標、posX.y -> y座標
これだと、右にいくほどボールの発射場所がマリオから右に遠のいてしまう。

174 :
if(puyo.x % 32 == 0){ // マスのサイズで割った余り0 or not
check(map[x][y]);
}else{
check(map[x][y]);
check(map[x+1][y]);
}
Java以前の初心者スレ化してしまったな。
DXライブラリスレなみのレベルとはなさけない。

175 :
解決しました。
ボールのdraw()にマップスクロール時の座標を書き入れていなかったらかでした。

176 :
ボール発射時:左に向いていたら ー> 左へボール飛んでいく x-= 6;
右に向いていたら ー> 右へボール飛んでいく x+= 6;
private void keyConfiguration() {
if (leftPressed) {
player.move(LEFT);
} else if (rightPressed) { でキーを拾って
public void move(int dir) {
if (dir == LEFT) {
vx = -SPEED;
direction = LEFT; // face to left
} else if (dir == RIGHT) {
vx = SPEED;
direction = RIGHT; // face to right でプレイヤーの向きは分かった。
public void move() {
if (isInStorage()) {
return; // do nothing}
if (player.direction == LEFT){
x -= SPEED;}
if (player.direction == RIGHT){
x += SPEED;}
if (y < 0 || y < -(panel.scrolledHeight())) {
store();
}
コンパイルはokみたいで実行したら
Exception in thread "Thread-2" java.lang.NullPointerException
at theLastSamurai.Weapon.move(Weapon.java:51)
at theLastSamurai.MainPanel.run(MainPanel.java:80)
at java.lang.Thread.run(Thread.java:679) 何故?

177 :
初心者以前に馬鹿じゃねえの。
例外のスタックトレースも読めないとか池沼か。

178 :
javaでRPGをつくりたいのだが、画像の素材は、どこかにかありませんかな
gif,pngの32x32の画像がいい
unityってゲームつくりには役に立つ?

179 :
そうかもしれないし、そうじゃないかもしれない。

180 :
ツクール素材でもググってみれば

181 :
javaをやっていると体にわるいな
過労死、鬱病、倒れそうだ

182 :
javaに関する本を何冊持っていますか?
Javaの本高くて困ります
今の時代amazonがあるから助かっているけどそれでも本代はかさむ
このデフレ時代、値段が下がらなかったのは本と税金、社会保障費ですかね

183 :
良い本知ってるがこれでは教える気にならんな

184 :
>>182
とりあえず三冊かな

185 :
ほとんどネットで十分だからな。
結城のデザインパターンとか役にたたないし、
パーフェクトJavaとサーブレット関連、アンドロイド関連で合計3冊あれば良いだろう。

186 :
ゲームはC++がメイン?
JAVAはサーバーに使われるのがメインですか?

187 :
そうかもしれないし、そうじゃないかもしれない。

188 :
初めJavaでゲーム作るのが難しく感じたけど今やC++よりやりやすく感じる俺は。
やっぱC++はGUIが面白くないしわざわざWINAPI弄ろうという気にもならないしモチベ下がる
あとクラスに分けてちゃんと作っていこうとするとJavaのほうが管理しやすいから好きだ

189 :
>>188
それってJavaが良いわけじゃなくて、Swingとかの
GUIライブラリとか良いってだけじゃん
C++だってクロスプラットフォームのGUIライブラリはあるだろ?
この部分は別にJavaならではって感じがしない

190 :
>>189
いや、そこがでかいんだと思う
同じ「ライブラリ」という概念でもJavaのそれとC++のそれではまるで違うと思う
VC++でライブラリ登録するのだるすぎるし

191 :
マインクラフトみたいなゲームを作りたい。2Dで。
ttps://s3.amazonaws.com/ld48/ld22/index.html
今、プレイヤーとマップは一応出来ている。
プレイヤーに攻撃値を持たせて、壊せるオブジェクト(敵も含める)に耐久値を設定する。
耐久値が0になったら決まったアイテムを落とす。
仮にオブジェがいっぱいあったとして、毎回一個ずつ確認していくのは何か変だ。
こんなゲームを作るときはどうしてます?

192 :
何を確認すんの?

193 :
kdツリーとかRツリーとかオクツリーとかBSPとかそのへんじゃない

194 :
超巨大な一枚マップを8x8分割とかして、各区画オブジェクトがそこにいる
全ての人物などの参照をもっていれば良い。
それでプレイヤーのいる区画以外の全てのオブジェクトを無視できる。

195 :
二分岐探索や二分ヒープ木はhaskellですこし触ったことがある程度。
色々な木を勉強します。
>> 194
もう少し詳しく教えてもらえないでしょうか?
マップを分割することによってオブジェクトの状態検査の数が減るー>メモリ節約?
もしくは、画面に映っているヤツら(プレイヤーからの距離計算で出す)
だけ判定に渡す。<-結局全てのモノを判定しているからボツ?

196 :
http://itpro.nikkeibp.co.jp/article/COLUMN/20070409/267726/

197 :
>>195
あなたの文章がおかしくて推測に苦労しますが、
例えば巨大マップ上に数万のキャラクターがいて、
forループで全部更新するのが重いという話でしょう?
画面外の、それまた遠くにいるようなのが完全に停止していても良いとか、
ゲームの内容しだいで条件もかわるわけで、なんともいえませんなー。

198 :
そうです。
ま〜マインクラフトやゼルダの伝説時空の章などは画面外では完全に停止していると思います。
それで、
敵やオブジェクトが画面内に入った時だけ動くだとうと推測しているノですが。

199 :
マップが1000万x1000万だとして、それを1万x1万エリアに分割すると、1エリアの大きさは1000x1000になる。
それでプレイヤーがいる1エリア内(1000x1000)だけを更新するとすれば次のような形になるはず。
class GameMap {
Area[][] area2D = ...;
}
class Area {
final Point index;// (GameMap.area2D[index.x][index.y] == this)
List<Enemy> enemyList; // エリア内にいるモンスター
List<Item> itemList; // エリア内にいるアイテム
}
Player {
Area area = GameMap.area2D[0][0];
}
class GameScene {
void onUpdate(){
Player player = ApplicationScope.getPlayer();
Area area = player.area;
// プレイヤーのいるエリアを更新する
for(Enemy e : area.enemyList){ ... }
// 例えばプレイヤーがエリア内で西側にいる場合、プレイヤーのいるエリアからひとつ西側にあるエリアも更新する
if(...) {
Area west = GameMap.area2D[area.index.x-1][area.index.y];
for(Enemy e : west.enemyList){ ... }
}
}
}

200 :
おお。すごい!
こんなに丁寧に書いていただきありがとうございます。
これだと、quadtreeを使わなくて済みそうかな?
よし、これで頑張ってみようと思います。

201 :
ゲームボーイの”くにおくん”の様に攻撃ボタンを押した時だけ
キャラの横(キャラの向き)に攻撃画像が表示される。
そしてもし敵がその範囲内であれば敵がダメージを受けるような事をしたいです。
インベーダーの様に弾に攻撃オブジェをいっぱい最初に作って画面外に置いて、
攻撃が呼ばれるたびにそれを取り出す方法ぐらいしか分からないです。
本来?はどうやればいいのでしょうか?

202 :
>>200の人だろうか。まあがんばれよ。

203 :
自分はまだ199で教えてもらったのを勉強してるところですが.
は〜、早くマインクラフトやゼルダみたいなの作りたい。

204 :
Java3Dってなんでこんなに人気ないの・・・

205 :
みんなjavaの基礎文法を習得するだけで疲れるじゃないの?
3DってopenGL,unityがあるからじゃないのか?

206 :
>>204 本気で3Dで色々したいとJavaで頑張る理由が無くて、
むしろJavaで作るのはいろんなデメリットを請け負うから。
3Dだと、いろんな事したくなるとJVMじゃなくてネイティブの方のライブラリを叩きに行く必要があるから、
結局JavaよりもC++なりなんなりの方がずっと素直なんだよ。
そのうえ、結果として、Javaなのに移植性が低くなるし、さらに悪い事にそのくらいの移植性だったら、
C++とかの方がいいライブラリがあったりして、自前で頑張る必要ないし。
ここまでしても、結局の所ゲームだったら素直に対象OSなり固定して、其れに特化したのをC++で作ったほうが性能も生かせる。
さらに今じゃ、C#とかあるんで、選択肢的にJavaは宗教上の理由でもなければ選ぶ利点ないでしょ・・・。

まぁ、単純にJavaなら簡単そうで入ってきた人達が、
3Dをやろうとした途端、とんでもない壁にぶつかって、
その中でやる気のある人はC++なりに行き、そうで無い人はやめた。
って感じがするけどね。

207 :
脇からだけど2Dもどき程度にJava3DやOpenGL使おうって場合はどうかな。

208 :
C#でSlimDXとかやってる人も少ないと思う。
Java3DやJOGLよりLWJGLのほうが海外だと主流みたいだよ。
英語がダメで日本語情報源にしがみつきたいならUnityが良いだろう。

209 :
lwjgl+slick2dが楽で良い

210 :
>>205-209
なるほどありがとう

211 :
組み込みスクリプトにサンドボックスを設定して
ユーザが安全にアドオンを作れるようにしたい
何か良いフレームワークはある?
参考
http://ja.softuses.com/15490

212 :
lwjgl+slick2dほんとに英語しか資料がないからハードルめちゃ高い
日本語の情報なんか個人が作ったブログみたいなの頼りにするしかないもんな
書籍とかいいのあったら教えてほしいわ(日本語の)

213 :
少なくとも書籍があるんなら見つけてると思うぞ。
ちょいと気になったんだけどJOGL、Java3D、lwjgl、slick2D、遊ぶ側の導入が楽なのはどれ?
全部楽だよってなら気にする必要はないけど地味に重要な気がする。

214 :
遊ぶ側ならJVMさえインスコしてあればどれも同じじゃねーの

215 :
slick2Dはlwjglのラッパーだからlwjgl同梱必須だよ
アプレットで動かさなければどれも同じ

216 :
もしかしてJVM+配布側の配慮で全部OKなのか。

217 :
質問があります。よくゲームフィールドを定義するのに
private int[][] map = new [12][24];
のような二次元配列を用意し、
二つのfor文の中で
switch(map[j][i]) {

218 :
}

219 :
おい

220 :
質問
MouseMostionListenerのmouseDragged(MouseEvent e)に関して、
e.getX(), e.getY()で得られる値はどうやらドラッグ開始した地点の座標?
故にドラッグ中マウス移動しててもカレントのマウス座標が得られなくて困った
加えてドラッグ中はmouseMove(MouseEvent e)メソッドのほうのそれらも座標が更新されない(当然?)
e.getXOnScreen()なるメソッドはドラッグ中も更新されるのだけれど、スクリーン基準の座標はどうも扱いづらいしバグを生みそうでできれば避けたい
何か良い方法ないですかね?

221 :
Swingがシングルスレッドなのが原因かもしれない
ドラッグ中は処理が止まって離すときにそれぞれ更新される?
素直に自前でスレッド用意することにします

222 :
うおぉ〜漸く球がキャラの向いている方へ発射されるようになった。
長かった。

223 :
ボンバーマンの爆弾のアルゴリズムってどうすればわかりやすいですかね
爆弾を置くのはボンバーマンだから、ボタン押したときに
ボンバーマンが爆弾クラスをnewする設計でいいのかな
すると、Factoryパターン?
そんなことするより所持可能な最大ボム数(8だっけ?)を、
どのキャラも初めからnewしてリスト登録しておくべきか
・爆弾が時間に左右されること
・爆発の連鎖があること
・後から表示された爆発が先に爆発する可能性があること
この辺りがゲームプログラミング初心者の自分には難しいです

224 :
最初はメインプログラムに全て詰め込んで後々再利用出来そうな処理だけ他クラスで良いんじゃね

225 :
>>130のサイトのマリオカート凄いな
自分の自作ゲームは数十倍もサイズがでかいのに何百倍もクオリティが低くて少し凹む

226 :
かいじょかいじょ

227 :
おお〜やっと規制解除された!

228 :
oggをツクールみたいにループ再生したいんだけど、コメントをどうやって取得すればいいのかわからん

229 :
よかったじゃん

230 :
jnlp を置いたディレクトリの絶対パスが日本語文字を含んでいたら動作しなかった
なんてこった。配布するとき困る

231 :
drawImage とかで指定する ImageObserver って何の意味がありますか?
自分いつも null にしてます。というか this とか指定すると変になりました

232 :
AffineTransform で混乱する…
「座標系」を変換するのか、「座標」を変換するのか
右手系なのか、左手系なのか
どうもはっきりしない

233 :
通常nullだってどっかで読んだ
多分非同期読み込みとかに使うんじゃない

234 :
>>233
サンクス。null で良かったか

235 :
Image をネットワークから読み込んでいる場合、まだダウンロードが完了しておらず、画像を表示できない場合がある
そのような場合に ImageObserver を指定しておくと、読み込みが完了したタイミングを知ることができる
そのタイミングで、例えば、読み込み完了した画像を改めて表示し直すことができる
闇雲に this を指定すれば何か役に立つというわけではない

236 :
>>235
なるほどっす。
Swingのイベントディスパッチスレッドから呼び出されるわけじゃないのかな?
Swingコンポーネント上でImage使ってる時は注意が必要かも

237 :
GCが動いてゲームループがトマトになる現象を防げるか…?
オプション: -XX:MaxGCPauseMillis=200
Sets a target value for desired maximum pause time. The default value is 200 milliseconds.
参照:
http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html

238 :
.classファイルをバイナリエディタで見ると、先頭に
cafe babe
っていうマジックナンバーが見える。凝ってるな

239 :
>>238
あー
よく知らないが、Java開発者達の近所にあった喫茶店だそうだ。

240 :
javaがコーヒーブランド、cafeはコーヒー、+babeって説が一般的だけど諸説あるな。
babeってマジックナンバーは昔はたまに使ってたし。

241 :
javaでゲームって「now loading」のどさくさで(full)GC強制したくならない?

242 :
ざっとぐぐったらfullGCが呼ばれる処理を呼びだすことで間接的に可能っぽいねぇ
ここスタンドアローンってスレタイにあるけど
gcjに関する情報とかないでしょうか?
ゲームでgcj使ってる情報が少なくて、ライブラリ関係をどう扱えば良いのかがわからない・・・
特にライセンスがなんともよくわからない

243 :
>>242
ライセンスはクラスパス例外のないGPLだから成果物もGPLになる。
ライブラリのリンクは元がnativeだとgcjが対応してない部分はリンクに失敗する。
これだけじゃん。いまでもwin用にはクロスコンパイルが必要かは知らん。
それよりgcjがAOTコンパイルしたバイナリよりjavaのJITコンパイルの方が早いからゲームには使いどころないと思うよ。

244 :
>>243
亀だけどありがとう、JITってそこまで進化してたんですね

245 :
javaのJITコンパイラはキャッシュミスして脱最適化しても次の直近のタイミングで
別の最適化されてまたキャッシュされたりするしコンパイル時間かけてでも効率重視だから結構速いよ。
GCとかヒープのデカさが超ネックになってるから全体ではチューニングせんとパフォーマンスでないけど。

246 :
Javaっておいしい?

247 :
初恋の味

248 :
テトリス+ぷよぷよ作ったよ
http://kie.nu/1x45

249 :
あげ

250 :
Slickライブラリでゲームを作ってますが、
どこか参考になるページなどありますか?
ライブラリやyoutubeのチュートリアルを見て実際に動かしていますが、
使い方がイマイチわかりません。

251 :
サンプルコードが入ってるだろ
javadocとそれで分からないことだったら外人に聞いたほうが早いよ

252 :
>>206
JOGLでゲーム作ろうとしている俺涙目

253 :
>>252
Minecraftでもやって自信出せ
Javaでも十分3Dゲームは作れるよ
ただ、やっぱりJavaでゲームっていうのはPC向けオンリーになっちゃうけどな
だけど任天堂とかPS、XboxがJavaVMのせてくれたら最強言語はJavaになると思うけどね俺は

254 :
2Dゲーム製作の勉強がてらにJavaでゲーム作ってるけど
CPUがAMDのE-300で非力マシンなのに60フレームで640*480をヌルヌル描画出来て凄いわ。
これだけパフォーマンスあれば80〜90年代の2Dアーケード程度のゲームは
企画力とゲームデザイン能力があれば楽勝で作れそうだ。
ちなみに今のところゲーム用フレームワークは使わずに自力で擬似スプライトとか
衝突判定機能を作ってる。
ゲームパッドはフリーウェアさんが作った物で普通に使えてる。
とりあえずJavaで1本完成したらPlayStationMobileかiPadとかに移植しようと思う。

255 :
>>254
2Dゲームを作るには、純正Swingだけでもかなり使いやすいよね
困るのは加算半透明が難しいことくらいか

256 :
Swingはキーボードのボタン全部取れないのが嫌だわ
なんかいい方法ある?

257 :
なんでみんなSwing使うんだ
AWTだけじゃいかんの?

258 :
>>250
Slickってまだサポートされてる感じですか?
>>254見て思ったんだけど、Javaでゲームパッド入力取りたいときって
Slickみたいなの使うのがラクかな?
>>257
AWTわからないんだけど、GUI使わずにJava2Dで描画するだけなら
AWTもSwingも一緒なんですかね?
あと、J「avaFXならJava2Dと違って描画にネイティブな機能使ってる」ってどこかで見たんだけど
Java2DのGraphicsクラスなんかもネイティブの機能使ってるんだよね?

259 :
>>258
>パッド
たしかslickが内部で使ってるDirectInputのラッパー
row_input(だっけ)を使うかもっと高水準のライブラリを拾って来たいところ。
>AWT/Swing
ネイティブって普通はJNAで実装してるのかって意味になると思うが
エスパーするとDirect3D/OpenGLだよね?
Direct3D/OpenGLでは三角ポリゴンのテクスチャしか描画できない。
なのにJava/Graphics2Dで自由に図形描いたりできるということは
ソフトウェアレンダリングしてるから。
だから同じようにDirect3Dを内部で使っても
例えばDXライブラリとかより圧倒的に遅いんじゃないかな。

260 :
クリックして進めるゲームはGUI使うもんだよね?
でもGUI途中で追加したりするのが難しいからマウスの反応拾ってやるべきなのかなあ

261 :
例えばslickのフォーラムで見かけた話題だと、
「slickとswing GUIを組み合わせられるのか」という質問に対して
「簡単にできるけどswingの遅い描画と歩調を合わせてOpenGLが描画するから
OpenGLの速度がでなくなる。非推奨だよ」という回答があった。
一応slickにはOpenGLを使った自作ボタンを作る仕組みがあるのだが
JScrollPaneのOpenGL版などは用意されておらず、UI作るのは面倒。
そういったことがあるから、俺は結局swingだけでしょぼいゲーム作ってる。

262 :
TWL - Themable Widget Library
http://twl.l33tlabs.org/
こんなんあるけどどうよ

263 :
そういや、JOGL使ってるとウインドウサイズを激しく動かした時とかにinitが呼ばれてしまうんだが、
そういうときってVRAMが初期化されるんだろうか。
VBO登録しなおしはともかくとして、シェーダーのコンパイルとかもやり直しになるのはけっこうストレスになるなあ…

264 :
なにそれDirect3D9/OpenGLでいうデバイスロストなら
フルスクリーン・ウィンドウモードの変更で起きるかもしれんが
Javaのせいじゃないぞ。

265 :
>>258
ゲームパッドは
ttp://www.ayamenet.com/app/index.html
の人が作られたJInputというのを利用してますが
サンプルもあるので簡単に組み込めてイベント取得も簡単でした。
今日の作業でフルスクリーンで動かした時に処理に余裕があるのに
画面のコマ落ちが酷かったのが疑問だったけど、
DisplayModeのリフレッシュレートをDisplayMode.REFRESH_RATE_UNKNOWN
にしてたのが悪かったようだ、60にしたら
ヌルヌル動く様になった。

266 :
>>259 >>265
ありがとう〜。
ドキュメント読んでみます。

267 :
JInputって同名の海外のもあるよね
そっちはWindows以外にも対応してる

268 :
>>253
>任天堂とかPS、XboxがJavaVMのせてくれたら最強言語はJavaになると思うけどね俺は
Unity経由でC#がそれに近くなるのはありそう

269 :
Javaは実用性が高くてフリーのネイティブコンパイラがあると相当に使いやすくなるんだけどね。
GCJだとまだ完成度に難があるし、完成度が結構高いExcelsiorJETは、ホビープログラマが個人で買うような値段じゃない。

270 :
ん、ノートPCのIntel HDG4000だと、GLSLでウィンドウの大きさが変わったreshape()の時に
VRAMが破壊されているにも関わらずinit()を呼んでくれないみたい。
IntelはOpenGL対応が弱いと言われてるけど、これはOpenGL対応の問題なのかGLSLとの相性なのか良く分からんな…

271 :
直にOpenGL書いてる?
SlickとかEasyWayで適当にウィンドウとスプライト貼って試してみたら?
それでOpenGLの使い方が間違っているのかハードウェアやランタイムの問題か
わかるでしょ。
http://www.jroller.com/bantunes/entry/java_game_engines_and_frameworks

272 :
>>271
昔GL2で書いたコードを動かしたら普通に動いたので、GL3以降を使うと問題があるっぽい様子…
というかシェーダー関係なのかなあ…
自宅のGF560では問題なく動いてたコードなんで、ちょっと悩んでる。
帰省中に最近のOpenGLを勉強しようと思ったら、思わぬところでよく分からん事象に遭遇した。

273 :
そもそもopenglのポーティングは何使ってんの?

274 :
>>272
JOGLです。
>>270でGLSLって書いてるのはJOGLって書こうと思って脳と指がずれてた。
ウェブ情報を参考にVAOを使ったサンプルコードを作ってみたんだけど、
最初の一回は正常に描画できて、2回目以降の描画ではプリミティブが描画されず、
背景色で塗りつぶされてしまう。
VAOを使わないでVBOで描画すると問題ない様子。

275 :
関係有るかわからないけどJOGLはバージョン変わるたびに激変してるからwebの情報は古いよ。
自分で変更点追うしかない。

276 :
原因が分かったので報告。
VAOを使って描画した後、
glBindVertexArray(0)
を呼んでバインドを外してなかった。
GPUによって、それでも動作する場合と動作がおかしくなってしまう場合があるみたい。

277 :
オブジェクト化されたOpenGL APIの規格ができるとゲーム作りなんかは随分楽になりそうだが、
そういうのはもっと上位のフレームワークでやれってスタンスなんだろうな

278 :
インスタンスつくってメソッド呼んでーって感じにしたらってこと?

279 :
>>278
そうそう、VAOとかVBOとかがオブジェクトになる感じ

280 :
>>279
確かに便利だけどそれやると言語によってはAPIにアクセスできなくなってしまうよ

281 :
>>280
理想は、C言語(またはもっと低級な言語)を前提としたOpenGLと
JavaやC#やJavascripstを前提にしたOpenGL++の二本立てになるとありがたい
WindowsAPIとかもそんな感じになってなかったっけ?
とはいえ、Cからドライバにアクセスするための関数は容易に作れるけど、
オブジェクト指向言語のAPIとなるとそうはいかんからなあ…

282 :
>>281
WindowsAPIはよく知らないけど違う気がする
.Netのことかな?
独自に「オブジェクト化」を試みてるプロジェクトならいくつかあるみたいだよ
自分が知ってるのだとOGLplusとか

283 :
JavaFXでUSBゲームパッドの入力取りたくて、今JInputの>>267の方の海外版を
試してみてるんだけどやっぱ日本語情報ってないよね?
更新もかなり頻繁だし、フォーラムも賑わってるのに公式の
Getting Startedが2007年だからなんとも不安

284 :
>>283
キーボードやマウスはもっと前から安定しているだろうし、
DirectX(Input)は8で更新終了。XBOX(XInput)に対応しなければ
更新する必要もないんじゃない?

285 :
>>284
なるほど〜、サンクス

Slick使ってると、Ubuntuで実行したとき書き込み可能テクスチャいじってるとXlib関係のエラーが出て、
内容としては、Xシステムに複数のスレッドからアクセスすんな!みたいなのなんだけど、
mainだけのシングルスレッドで試しても起きるんだよね・・・。似たような経験した人いますか?
いろいろ試した感じだと、テクスチャの解放が終わらない内に次のテクスチャ生成すると起きるんだけど、
ライブラリ側でそういう風に出来てる以上、Sleep挟むくらいしか対処法ないのかな?

286 :
いってる意味分からん
Texture.release()を呼んでも直ちに開放されないってこと?

287 :
>>286
意味というか自分も原因がよくわかってないですね・・・
普通に使っててエラーが出るといいますか、Windowsだとエラーにならないのですが

288 :
前からちょくちょくlinuxでopenGLの挙動がおかしいとか書いてる人?
そんなことばかりしてたら何も作れず時間ばかり無駄にしてしまうぞ

289 :
それでなくても最近のOpenGLは難しいしな。
「久しぶりにゲームとか作りたいなあ。やっぱり漢ならエンジンから自作だぜ!」
と調子に乗ってたら、フォンシェーディングされた三角形をくるくる回すだけで2週間かかったぜ…
glBeginってなんだかんだで便利だったんだな

290 :
矢印キーの押下状態を使いたいのですが
キーが離されたときには必ず key released イベントが発行されると考えて大丈夫でしょうか?
例えば処理がビジーになってるときでも、イベントが取りこぼされたりスキップされたり
しないで、遅れてでも必ずイベントハンドラを呼んでもらえると保証しても大丈夫でしょうか?
キーを離しているのに押しっぱなしと認識されてしまうと困るので
お願いします

291 :
処理がビジーなら何を使うにしてもイベントは取りこぼすだろ
そんなことより、そんなにkeyreleasedの取りこぼしが気になるなら「keydownが連続で2回発生したらどうするか」という考え方で対処したほうが無難

292 :
うう、そうか…キューにためておいてくれて必ずイベント発生してくれると期待していた
コードは
boolean up, down, left. right;

if( ↑キー押下 ) up = true;
if( ↑キー離す ) up = false;
なので、
key release を取りこぼした時点で失敗していて、
後から key down が2回発生したことを検出しても時すでに遅しなんです

293 :
あれ、キューに溜まらないんだっけ?
特に意識してなかったけどなんか不安になったからウインドウのフォーカス判定見直しておこう

294 :
なんの話だろう?swingからdirect inputしかわからんが、
全てのキーの状態を毎フレーム取得して、前回と今回のデータから
判断するのが基本だよ
swingのKeyListenerはそのへん致命的やな

295 :
Slick2D使ってちょっとしたゲーム作ってる

296 :
Javaの場合、2DならSwing直叩きでもどうにかなるような気がするけど、Slickって効率よくなるのかな?
Swingでも、加算半透明がない以外は2Dゲームを作るのに必要な機能は一通り揃ってる気がする。

297 :
Slickは音声の再生とか当たり判定?の機能が結構あったから、そういう部分を最初から作らなくて済むという点ではいいんじゃないかと思う。
でも日本語表示が面倒なうえに遅い。

298 :
>>297
まず、ビルボードフォントのロードが遅いのはしかたないよ。
それはロード画面でも作るしかない。
ただし、UnicodeFontでaddGlyphAscii()で半角英数全部読み込み、
addGlyph(unicode_start, unicode_end()で日本語数千文字全部読み込みは
やめたほうが良い。ロード重くてVRAM消費大きいのは当然。
使う文字だけaddGlyph(String text)ならOK。
でもチャットとか使う文字コード不明だと一工夫必要だな。
ただslickのばあい、"あいうえお"なら、
"あ","い","う","え","お"でそれぞれ別のテクスチャとして
生成or描画してる感はある。
slickのコードを参考にオレオレライブラリつくるべく、
OpenGLを少し勉強中だぜ^^

299 :
ゲーム作るときによく思うんだが、Javaは行列とかベクトルを標準ライブラリでサポートしてもいいんじゃないか?
自前で実装するとjavaコードでループ回して計算させることになるけど、
標準ライブラリに入っていれば、そこはベクトル化してSSEを使うとかの小細工が出来るだろうし。

300 :
>>299
完全に同意。
行列ライブラリは、自作しようにもJavaだとジェネリクスがただの型安全のための機能だから
C++みたいに使いやすくてカッコいいライブラリつくれないんだよね
拡張性と再利用性考慮してインターフェース駆使するとパフォーマンスゴミになるし、
かと言ってvecmathみたいに全部のプリミティブ型別で書いていくと面倒臭すぎる(double限定にしても良いかも知れないけど)
この部分の解決のためだけにScalaを使ってみようかなと思ってしまうほど

ただ、最近だとJVMが賢くなってプリミティブラッパ型で計算しまくっても
さほど遅くならないらしいね

301 :
>>299
普通にあるんじゃね?
おれJavaでシステム構築ばっかりしてる会社で7年ぐらい働いてるけどいまだに標準の中にも新発見のライブラリがゴマンとあるから

302 :
>>299-301
行列とかベクトルって,3Dの?
俺はJava3D使ってるけど,インストールする(してもらう)の多少面倒だから,
確かに標準にあって欲しいねぇ.
# 標準だとLine2DやPoint2Dがあるくらいだよなぁ.
# Vectorはこの場合は違うものだし.

303 :
>>302
Java3Dは俺も最初使ってみたけど、シーングラフを自由に変更したり
描画のタイミングを自由に決めたりしたかったんで、結局自前で実装することにした。

304 :
気になったんですが、
Javaでパソコンで動くスタンドアローンゲーム作るとしたら、
配布はjar形式でJVMにマウントしてもらうってことですか?
その場合、やはりプログラムコードの暗号化は諦めてるんでしょうか?

305 :
埋め込まれたクラス名や関数名から
容易にリバースされてしまうのの対策としては
難読化ツールを使うかもしれないが
難読化したバイトコードから読み取れるほど
スキルのある人に対しては自分は対策は諦めるな

306 :
>>305
ありがとうございます
ProGuardですかね、調べておきます

307 :
パッケージ名に使えるドメイン名を取得したいのですが何か方法はありますか?
Package BOF というのはあるんですが、もうサークル向け用に1つ取得してしまって
一人につき1つなので自分個人用のはもう取得できません
サーバ会社に申し込んでドメイン名を買うのもアリですが
毎年維持費がかかってしまうし、もし失効したときに
配布してしまったアプリをどうすればよいか分からないので困ります
できれば低コストでほぼ永続的にドメイン名を使わせてもらえる方法ないでしょうか?

308 :
>>307
サークル用と個人用は完全に関連性を匂わせたくないってことでしょうか?
匂わせてもいいならサークル用に取得したドメイン以下で自ら割り振れば良いと思いますが
しかし、あのサービスってサークル用と個人用を別々に登録するのってダメなんでしょうかね?
よほど悪意のある登録の仕方(複数組織を名乗って片っ端から登録しまくるなど)をしない限り
違反だと言われることはないんじゃないかなぁとか、甘いこと考えていたのですが・・・

309 :
>>308
確かにゆるい感じしますね
自分はいちおう規約まもっとこうかなと思っただけです
家族はたぶんこれからもプログラミングと縁はなさそうなので
家族に頼んで取得してもらうって使わせてもらうことにしました

310 :
JavaFX 8 の3D機能が結構使いやすそうなんだけど、速度ってどんくらいなんだろうね?
アクションは無理でもそれ以外のゲームに耐えうるくらいならニワカ3Dな俺歓喜

311 :
RPGのダンジョンとかいけるんじゃね

312 :
SwingのときはSwingUtilities#invokeLaterに自作のループマネージャを登録して
FPS管理してたんだけど、JavaFXで同じようなことをやりたい場合はSwingと同じように
Platform#runLaterにループマネージャを登録するやり方と、JavaFX特有のTimeLineで
16ミリ秒ごと処理を呼び出すようにするのとではどっちが良いんでしょうかね?
他にも、JavaFXには「Task」って考え方があるようですが、これはループには
あまり向いてなさそうですね(毎フレームnewするのも気が引ける)

313 :
SwingでSwing Timer使ってたけど自作のループマネージャってなんだろ

314 :
FX分からんけど、TimeLineはSwing Timerにあたるものだから
自分ならそちらでいく

315 :
libgdxってのがslick2dの後継らしい

316 :
Javaで3Dゲーム作ろうと思ってんだけど
どう思う?

317 :
やればいいんじゃね?
JOGLかLWJGLになるんだろうけど、ゲームを作る環境としては特に悪いとは思わない。

318 :
3Dのオブジェクトファイルとか読み込んで描画したり、物理演算に苦労するよ
物理演算等のライブラリは多数存在するけど、ドキュメントが英語だしイマイチ低機能、最低限の機能しかないからやめた方がいい

319 :
そもそも何故java.awt.ComponentにPaintListenerが無いんだぜ?
void paint(Graphics g)なりpaintComponent の中で自前の部品を使って描画する時に、
gに紐付いたComponentのサイズや他の情報にアクセスする時に、
結局部品のコンストラクタなりでComponentを渡してやる必要がでてくるだろ。
ListenerでPaintEventさえもらえればそんに手間も要らなくなるし、
gと部品が受け取ったComponentとの不一致の可能性もなくなる訳だし。
1.7では軽量・重量コンポーネントの混在も可能になったりしてるし、
gがComponentと紐付いていないパターン(ただのImageとか)でも判断できるように作れる筈なんだけどな。
JLayerだっけ?あんなの利用させられるくらいなら、この方が楽だろ。

320 :
もう少しまとめなさい

321 :
paintイベントが発生したComponentを知る仕組みがイベントハンドルとして用意されてないから、
設計が素直にできないって話だよ。
swtにはあるし、他の有名なgui絡んだ言語じゃ当たり前にハンドルできるだろ。
何故ここを棄てたのか理解に苦しむ。
java.awt.ComponentでaddPaintListener()が出来て、普通にPaintEvent.getSource()できればスマートだろう。
ここを開放してないから、paintを弄り倒したいアプリだと、
paintのタイミングとは別の入り口でComponentを保持する必要が出てくる。
この制約のせいで、クラス設計がキモくなる。
それを無くす為に導入されたのがJLayerのつもりかもしれないが、余計にコードが汚くなるわ。
って話です。

322 :
アプリにもよるけど、俺はコンポーネントをシングルトンにしてる
もしくはシングルトンクラスに相互参照するようなコンポーネントを全部いれてる
class UI {
private UI(){}
public static final object = new UI();
public MyWindow window = new MyWindow();
public MyCanvas canvas = new MyCanvas();
public MyTextPane text = new MyTextPane();
...
}

323 :
話の流れが良く判らんが、final付けとかないとダメだろ。参照を上書きされるぞ。

public "final" MyWindow window = new MyWindow();

324 :
final忘れてた。でも一人でやってるなら体裁はどうでもいのだよ
セッター・ゲッターとかね
主題は相互参照。それで俺は例を出したのだけど
オブジェクトの初期化・コンストラクタで循環しないように気をつけてな

325 :
たったこれだけの話なのに、>>322はどんな作り方すりゃそうなるんだ。
public class App extends Frame {
  public static void main(String[] args) {
    final App app = new App();
    //(ry
    app.setVisible(true);
  }
  private final Game game;
  public App() {
    game = new Game(this);
  }
  public void paint(Graphics g) {
    game.paint(g);
  }
}
class Game {
  private final Component comp;
  public Game(Component comp) {
    this.comp = comp;
    comp.addKeyListener(this);
    comp.addComponentListener(this);
    //comp.addPaintListener(this); ←これがありゃ楽だろ糞がって話。
  }
  public void paint(Graphics g) [
    // ゲームの描画
  }
}

326 :
>>325
たったそれだけの単純な例ならPaintListenerだっていらないだろw
JSplitPane, JTabPane, JScrollPaneとかで何層にも囲まれている場合、
上に挙げた様なやりかたでごり押しするのがやりやすいというのが俺の経験則

327 :
でも>>319の変な独り言ぶつぶつをよくみたら
そもそもComponent間の絡みという話ではないようだな

328 :
PaintListenerが存在すれば、Game側は相手が誰とか知る必要なく楽に書ける。
public class App extends Frame {
  public static void main(String[] args) {
    final App app = new App();
    //(ry
    final Game game = new Game();
    app.addKeyListener(game);
    app.addPaintListener(game);
    app.setVisible(true);
  }
}
class Game implements PaintListener {
  public Game() {}
  public void keyPress(KeyEvent e) {
    final Component comp = e.getSource();
    final int w = comp.getWidth();
    // ゲームの更新
  }
  public void paint(PaintEvent e) {
    final Component comp = e.getSource();
    final Graphic g = e.getGraphics();
    final int w = comp.getWidth();
    // ゲームの描画
  }
}

329 :
>>326
> JSplitPane, JTabPane, JScrollPaneとかで何層にも囲まれている場合、
> 上に挙げた様なやりかたでごり押しするのがやりやすいというのが俺の経験則
一つのゲーム画面の中で利用される様々なUIにSwingを利用してる人?
それともゲームのメイン画面を表示するframeとは別に、メッセージウィンドウを別のframeに表示するような内容のもの?
こっちはUI自前で描画するので何言ってるのか良く判らんわ。

330 :
質問者が何をしたいのかさっぱりわからん
paint(Graphics g)のオーバーライドをしたくないだけか?
じゃあPaintListenerに代替する委譲を組み込んだ
abstract class GameWindow extends Frame でもあらかじめ定義すれば
いいだけの話だろう。コンポーネントはひとつなんだろうし。
>UI自前で描画するので
OpenGLを使ってるわけでもなさそうだし
マップとかパラメータのエディタの話だと思った
OpenGL Canvasを囲ってるswing UIとかとの連携とか面倒なとこなんで

331 :
ここは質問スレじゃねーよ。
> abstract class GameWindow extends Frame でもあらかじめ定義すれば
> いいだけの話だろう。コンポーネントはひとつなんだろうし。
たかがComponentのKey, Mouse, +αのイベントをトリガーとして、
そのComponentのGraphicsに対して描画するだけのプログラムなのに、
何で態々GameWindow なんて作らないといけないのか判らん。
public class App {
  public static void main(String[] args) {

}

332 :
もう好きにやったらいんじゃないの?
単なる好みの話のようだし

333 :
ミスった。
public class App {
  public static void main(String[] args) {
    final Frame frame = new Frame();
    final Game game = new Game(); //
    frame .addKeyListener(game); // この三行だけで済む←(1)
    frame .addPaintListener(game); //
    frame.setVisible(true);
  }
}
これで済む話だから愚痴ってんだろ。
それからゲーム自体が所詮はイベントをハンドリングし、ハンドリング対象に描画するだけのプログラムなのだから、
Frameの中のPanelの中の適当なComponentに対して、素直に(1)だけすりゃサクッと動く訳なんだから。
それを自前のComponentクラスを作って使うとか、設計的に糞だな〜。とぼやいただけ。

334 :
タイマーで0.1秒毎に更新とかしないのね

335 :
だから、java.awt.ComponentにPaintListenerがあれば綺麗になるって話。
ついでにComponentにgetInsets()も追加しとけと。
上のContainerクラスにはあるし、JComponentはそれ継承してるから当然ある訳だが、
Component継承した自前クラスでInsetsの概念使って描画させた場合、
Componentクラスを引数にとって、Insetsの概念使ったメソッドでも用意しようとしたら、
void func(Component comp) {
  if (comp instanceof Container) {
    insets = ((Container)comp).getInsets();
  } else if (comp instanceof MyInsetsComponent) {
    insets = ((MyInsetsComponent)comp).getInsets();
  } else {
    insets = new Insets(0, 0, 0, 0);
  }
}
みたいな形にしなくちゃならない。
どう考えても糞だろ。
>>334
それはタイマーなりゲームループなりが、
osに再描画要求するなり、そのコンポーネント再描画を実行するなりして、
結果、ゲーム側は描画イベントをハンドリングしてんだから、そこで処理すりゃ済む話だろ。
GUIのイベントドリブンってのは、そこを共通化できるからいいんだろん。
コンソールベースの古典ゲームだろうと、アニメーションしまくりのゲームだろうとな。
pure java 100%での話だよ。

336 :
つまり、>>333の実装方法でも別にアニメーションするゲームでも問題なく実装できる。

337 :
SwingとかJavaFXでジョイスティック取りたい時ってどうしてる?

338 :
みんなJavaでゲーム作ってどこで、どんな形で配布しての?

339 :
>>336
俺ならまず要件を見直す。
どうしても棄てられないのなら対応osや言語選定を見直す。
LWJGLなんかが対応してるとは言われてるが、実際の所は最新版落として試して見ないのと判らんすぎる。
それから将来的な対応状況も未知数。素敵なライブラリだとは思うけどね。
MinecraftってLWJGL使ってる癖にアプリ側でその辺対応してないような気がするのだが、
やはり棄てた方が無難って事なんじゃないのかな。
俺なら勿論サクッ棄てる。
実際fpsとかのPCゲーなんてマウスとキーボードで十分ですし。
一応、このスレを「ジョイスティック」で検索すると、幾らか鮮度の高そうな情報が出てくるよ。
>>338
executable jarでいいんでね。
windowsに限りexeに変換して配布してる人いるね。
俺は面倒だからjarで済む要件に何が何でも留める。
結局さ、人気の出るゲームってのは、プレイヤー側が能動的に問題解決に動くから、
アプリ側がそこまで親切にする必要なんて無いと思うけどね。
Minecraftだってjoytokey経由でジョイパッド使ったりとかしてるじゃん。
とりあえず最低限の入力に対応だけして、ゲーム内容に特化するのが吉だよ。
ゲームのコアさえ生きてれば、UI周り、描画周りを別のモノに置き換えて、バージョン2とか言っちゃってもいいんだしさ。

340 :
>>337の間違いだった。
W3Cがゲームコントローラ対応の為の標準仕様を作り出してるから、
5年・10年後には状況が変わってるかもしれんけど。

341 :
>>340
サンクスー
レトロゲー作りたいからゲームコントローラでやりたいんだよな
まぁ個人制作ゲームってことで、手を出してくるのもゲーマーだろうし
Joytoykeyくらい普通に使ってくれるか

342 :
jinput使えばいいよ

343 :
>>342
Ubuntuだとroot権限無いせいかわからないけど入力取得できなかったんだよなぁ
あと、ちょい低級すぎるのと、自分でGUIスレッドと連動させるとなると
ウインドウに対してのフォーカス有無とか考慮するのが大変な気がした
同人ゲーのバギーなネタの1つだよね、フォーカス無しで暴れるの

344 :
JavaFX使ってる人いない?
POJOでモデル作ろうとか考えずにモデルごとJavaFXの上で作った方がいいよね

345 :
IDかっこいい記念カキコ
UR SEL あなたのセル
だって

346 :
住都公団の売物件がどうした?

347 :
Javaの生産性はゲーム制作にも有用そうだと思っていたが、結局Javaによるゲーム開発はブレイクしないままだったな
ネイティブで性能を引き出すならそれぞれのプラットフォームに特化してC系でゴリゴリ最適化すればいいし、
マルチプラットフォームならそれこそwebベースになっちゃってるし

348 :
javaでゲーム作ろうと思ってようやく一通り動くようなものができた。
といってもクリックで指定した座標に向かってキャラが歩き、接触した物体に自動的に攻撃して破壊するだけのものだが。
さて、これをオンラインにしてマルチプレイに対応しようとしたが、全く実現できずに3ヶ月。
javaは通信周りは強いと聞いていたし、楽に実装できるかと思っていたが、基本中の基本部分が全然動かない。
・非同期通信を実現しなくてはならないが、サンプルを見ながらjava.nioパッケのセレクタ、selectNowを使っているのに数回ループ後に何故かブロックされる。
・マルチキャストをしなくてはならないが、SeverSocketChannelから取得したSocketChannelをリストに保持してクライアント送信時にループで送信しているが、受信しない。
・ゲームではUDP通信が基本らしいが、画像やDBデータ、インスタンス、文字列ですら正常に送受信できない。
・TCPでも試したが、通信処理のスレッドループでよく判らなくなってきて、どこにメインループの処理を書いたらいいのかわからない。
段々めちゃくちゃになってきたので、非同期通信、マルチキャスト、インスタンスの送受信なんかをカバーしたフレームワークがないか、
どうせならマルチプレイオンライン対応のフレームワークがないかと探しているが見つからず。
何か情報をください。できればオープンソースで日本語の情報があるものを

349 :
言ってる事が横文字だらけでちんぷんかんぷんです
もう少しわかりやすく記述してください

350 :
失礼しました。
要するに通信周りで苦労しているのですが、一向に実装できないので、通信周りをカバーしたフレームワークがないか情報があれば教えて欲しいということです。

351 :
一気に飛躍しすぎ
まずはチャットを作ってみては?
FWについては知らん
少なくとも有名なものは無い

352 :
いくつかのサンプルを参考にチャットは作成しましたが、TCP通信のストリームを用いての文字列データだけのやり取りに留まっています。
画像を含めたインスタンスをサーバクライアント間でやり取りをしようとObjectOutput(input)Streamを利用するとブロッキングが発生してしまい、
別スレッドで起動する必要が出てくる上、今のところ画像データのやり取りはできていません。
UDP通信の送受信も試しましたが、今度は文字列データすらやり取りができなくなりました。
ノンブロッキング方式となるjava.nioパッケージもいくつかサンプルに沿って作ってみましたが、こちらもうまく行くのは文字列データのみで、
インスタンスの送受信はできていない上、何回か繰り返し処理をしているうちに何故かブロッキングが発生しないはずのメソッドでブロッキングされます。
使い方がよくないのは分かるのですがコードも煩雑になり手に負えなくなってきたので、通信周りの処理はオンラインゲームでは極当たり前のものだし、
フレームワークで存在しているかもしれないと思い探したものの見つからず、何か情報がないかと質問した次第です。
少なくとも有名どころにはないというのは大変残念。
Webアプリケーションのフレームワークならいくつもあるのに、通信あたりのとりわけマルチキャストに対応している物となると情報がない。

353 :
自分も同じような段階なので非常に興味があります
僕の場合は通信にはプロトコルを定めて4バイト以下でやり取りしているので、オブジェクトの送受信は今ちょっと調べただけですが……
ハッキリとは分かりませんが、ObjectOutputStream自体がブロッキングするioなんじゃないでしょうか?
調べてみたところ以下の実装が綺麗な気がします
http://stackoverflow.com/questions/5862971/java-readobject-with-nio
ByteArrayOutputStreamでラップしてデータの長さを調べて、さらにByteBufferでラップして先頭に長さを埋め込んでおきます
受け取る側ではまず先頭の長さ情報(4バイト)を読み込みます
続いて長さ分確保したbufferに本体を読み込み、あとは逆順にObjectInputStreamに落とし込みます
僕も簡単なフレームワークがあったらなあとも思いますが、お互い頑張りましょう

354 :
通信用スレッド作ってブロッキングでやれば簡単だと思うよ
ノンブロッキング化なんて後からやればいいじゃない

355 :
TCPではなくUDPで通信するのは俺もわからんし興味はある
データを受け取った側が一々受け取り成功したことを発信側に返信していたら
遅いTCPと実質同じになってしまうとか、注意点ふぁありそうな気がするけど
この辺は言語問わず情報がなさすぎて困る

356 :
UDPの主な問題点は、パケットの到着が保証されない(途中で消えることがある)、順序が保証されない(前後が入れ替わることがある)の2点
どうにかこれに対処しないといけないが、だからといってこれを完全に保証するのなら、素直にTCPを使った方がいいわけで、
UDPを使うなら、パケットが消えたり入れ替わったりすることを前提に、最初からそれを受け入れる方針で設計しないと意味が薄い
一部重要な情報だけ到着確認や再送信など手厚い保証を作り込むという選択肢もあるが、TCPと併用し情報の重要度によって送信し分けるという選択肢もある
俺が作ったときは、通常はTCPを使い、性能的な懸念のある一部の情報だけUDPで送るようにした
念のため、UDPがちゃんと届くか送信テストを行い(返事はTCPで貰う)、だめだったときは全部TCPで動くようにした
特定のメッセージをUDPで送るかTCPで送るかはbooleanの引数1個で簡単に変更できた

357 :
>>353
 提示されたソースを参照しながら色々と試しております。
 とりあえずシンプルチャットの文字列のマルチキャストはできましたが、インスタンスのやり取りはまだうまく行っていません。
 ObjectOutputStreamについては仰るとおり、ブロッキングが発生するストリームです。
 ブロッキングを回避するためにマルチスレッドにして、受信したメッセージとインスタンスをプールして一元的に処理しようとして・・・
などとやっているうちにデッドロックが発生して頭を抱えておりました。
 Webアプリケーションフレームワークでもそうであるように、通信部分はほぼ共通の処理だろうし、
C/S型MOGの実装とて大きな違いがあるとは思えないのですが、ないものですかね・・・
 一応、Jogreとか言うゲームエンジンがC/S型を想定したものらしいのですが、使い方がまるで判らず
オープンソースだからせめてどこか参考にできないかと見てみましたが私の頭では理解できませんでした。
>>354
 ゲームの根幹となるシステムはサーバ側で実装しようと考えており、その際にクライアントの通信待ちでブロックされてしまうと処理が進まなくなってしまうので、初めからノンブロッキングで行くつもりです。
 前述の通りマルチスレッド化の段階でうまく行かなくなってしまいました。
>>355
 通信方式には特にこだわっているわけではないのですが、今後内輪で一人複数キャラ起動で20〜100程の同時接続を想定しており、
そうなると今後はUDPでないとまずいのかな、などと漠然と考えておりますが、実装が楽なはずのTCPですら躓いている状態です。

358 :
ブロッキングの場合は通信相手1人ごとに受信用スレッド1個と送信用スレッド1個を作って、それに通信処理を全部まかせるのがいい
相手側に何があってもブロックするのはそこだけで済む
何か送信したいときは、その相手用の送信キューに情報を詰め込んで、送信スレッドに送信してもらう
受信の方はそのまま受信スレッド上で処理してもいいが、スレッド間の同期が心配なら、受信した情報をメインスレッドの処理キューに積んでメインスレッドに処理してもらってもいい
もちろん各キュー自身は同期しなければならないが、LinkedBlockingQueueでも使っとけば心配なかろう
欠点は通信相手が増えすぎるとスレッドが増えすぎることだが、まぁ100くらいは大丈夫じゃない?
ノンブロッキングの場合は一箇所で全ソケットの送受信の面倒を見ることになる
基本的には Selector#select を回し続け、個々のソケットがそれぞれ受信可能になっていれば受信し送信可能になっていれば送信するわけだが、
受信したいときに受信したい量が受信できるとは限らないし、送信したいときに送信したい量が送信できるとも限らないので、
ブロックさせずに1スレッドですべてを回すためには送受信共にバッファ管理が必要になる
相手に何か送信したいときは、その相手用の送信バッファにデータを詰め込んでselectのループに戻り、
ソケットが送信可能な状態になったときに送信できる量ずつ送信する(そしてまたselectのループに戻る)
受信の方も、必要な量のデータが受信バッファに溜まるまでselectのループを回しておき、
じゅうぶん溜まったら受信バッファから必要量のデータを取り出して処理する感じ?
通信相手が増えてもスレッド数を抑えられるのが利点だが、実装は面倒い

359 :
Java信者がまだ生き残っていて嬉しい

360 :
今日一日がんばってはみたがやはり実装できず。
シンプルチャットは動いたものの、画像を含めたバイナリデータのやり取りはできておらず、
何故か353で提示していただいたコード部分でOutOfMemoryErrorが発生する始末。
使わなくなった瞬間に明示的にnullを入れてみたりはしたものの、全く解決せずで、
相変わらず手に負えない感じがあります。
今度はブロッキングのマルチスレッドを試してみようとは思いますが、以前この方法を取った際、
キューの中に受け取ったメッセージを格納しておき、メインスレッドで順番に処理する、
というようなコードを書いてみたところ、キューへのアクセスで何故かデッドロックが発生して
動作しなくなってしまったこともあり、うまく行くようにできるか心配です。
また、なんだか最終的に数千人規模の運営にも耐えられるようなもの(MMOみたいなものか)
みたいな要望(若干語弊がありますが)もあり、スレッドの数とか心配ですが。

361 :
どうしても上手くいかないならソース晒せば添削しよう
そのときはzipにまとめて適当なところにupしてくれ

362 :
ブロッキングのマルチスレッドを試していた所、
今度はループ上で2度目のObjectInputStraemのreadObjectメソッドで
StreamCorruptedException: invalid type code: ACが発生し、
シンプルチャットすら動作しなくなりました。
ObjectIOストリームを使うこと自体が間違いなのかもしれませんが、
今後サーバ側のDBに保存してある画像ファイル等をクライアント側に送信して表示することを考えると、
他にどうすべきかが判りませんが。
一応ソースを挙げてみました。
http://fileup.jp/up/4753.zip.htm

363 :
 
お世話になります。
私、責任者の加茂と申します。以後、宜しくお願い致します。
http://www.apamanshop.com/membersite/27009206/images/kamo.jpg
浪速建設様の見解と致しましては、メールによる対応に関しましては
受付しないということで、当初より返信を行っていないようで、今後につい
てもメールや書面での対応は致しかねるというお答えでした。
http://www.o-naniwa.com/index.html 事務員 東条 南野
http://www.o-naniwa.com/company/
このように現在まで6通のメールを送られたとのことですが、結果一度も
返信がないとう状況になっています。
http://www.apamanshop-hd.co.jp/
http://www.data-max.co.jp/2010/10/01/post_11983.html
私どものほうでも現在までのメール履歴は随時削除を致しております
ので実際に11通のメールを頂戴しているか不明なところであります。
  
・ハンガー・ゲーム   http://s-at-e.net/scurl/TheHungerGames-Aircraft.html
・アバター        http://s-at-e.net/scurl/Avatar-Shuttle.html
 
・艦これ   http://s-at-e.net/scurl/KanColle.html
・BRS     http://s-at-e.net/scurl/BRS.html
・ベヨネッタ http://s-at-e.net/scurl/BAYONETTA.html
・風ノ旅ビト http://s-at-e.net/scurl/JOURNEY.html
 
      http://s-at-e.net/scurl/kabetokyojinto.html
 
・2012    http://s-at-e.net/scurl/2012.html
 
大阪府八尾市上之島町南 4-11 クリスタル通り2番館203
に入居の引きこもりニートから長期にわたる執拗な嫌がらせを受けています。
この入居者かその家族、親類などについてご存知の方はお知らせ下さい。
hnps203@gmail.com

364 :
マルチスレッドにだけは手を出すな、というのが定説だよ
なぜならタイミングによって、
デッドロックになったりならなかったりして、
バグが再現できず、まともにテストができない
結局、バグが出ても、気のせいにしてリリースするので、
本番でバグが出て、どうにもならない
マルチスレッドはスレッド間で、リソースを共有するから、
共有リソースを使うすべての関数で、排他処理が必要
それでも資源A→B、B→Aの順で、
ロックするスレッドがあると、デッドロックが生じるため、
資源をロックする順番にも、矛盾があってはならない

365 :
コンカレント・パッケージを使ったら?

366 :
ソース見た。
エラーの原因は、サーバ側では送信のたびにObjectOutputStreamを作り直してるのに、クライアント側では同じObjectInputStreamを使い続けていることだ。
作り直すなら両方とも作り直す(この場合resetは要らない)、使い続けるなら両方とも使い続ける。混ぜてはいけない。
あと、現時点では大丈夫かもしれないが、潜在的な問題がある。
受信がブロックするのは当然なので別スレッドにするのは自然だけど、実は送信もブロックするから別スレッドにした方がいいんだ。
TCPには一定サイズのバッファがあって、相手側が読み出してくれなければ、バッファが一杯になった時点でそれ以上書き込めなくなり、ブロックする。
相手側が読み出してるつもりでも、例えば何かネットワークのトラブルでデータが届かなくなれば、同じようになる。
サーバ側で synchronized (this.recvMessageQueue) { } の中で sendClients 呼んでその中で writeObject してるけど、こういうロックを握ったままブロックする可能性があるのは非常によくない。
受信キューを握ったままブロックすると受信スレッドがみんな動けなくなるし、そうなるといずれクライアントの送信側もバッファが一杯になってみんな止まってしまう。
あとは、 clientSocketList が複数のスレッドから読み書きされてるから synchronized するべき。
いちいち synchronized するのが面倒なら元からスレッドセーフな CopyOnWriteArrayList を使うという手もある。
キューも LinkedBlockingQueue とか使えば synchronized する必要なくなる。 まぁこのへんはどっちでもいいけど。
ObjectIOストリームは、性能面では劣るけど、開発は楽だから、使いたければそれでいいんじゃない。
他の方法といっても、ファイルと一緒で、フォーマットを決めて読み書きするだけだよ。
いわゆるType-Length-Value的なやり方が普通だと思うけど、例えば文字列化して行単位で送るとか、XML形式で送るという方法もなくはない。
こういうのは性能やらメンテナンス性やら開発速度やらのトレードオフだから、好みの方法を使えばいいと思うよ。

367 :
>>366
 添削ありがとうございます。とりあえず基本的な通信周りは動くようになりました。
 エラーの原因は結局の所Streamの基本的な利用方法を理解していなかったことであり大変お恥ずかしい限りです。
 受信以外に送信もスレッド化しなくてはならないとなると、1クライアント接続毎に2スレッド起動することになるのですね。
 100の接続があれば200、1000の接続があれば2000も起動するということで、今後仕様に耐えられるか心配ではあります。
 364の方が仰るようなバグの内包は自分はやらかしそうなので。
 こういったミスがなくなるよう、通信周りで信頼性の高い実装済みのフレームワークを利用したいと切に願います。
 ともあれ、ようやく動くようになりました。ありがとうございました。

368 :
心配なら簡単なテストプログラムを作って実際に高い負荷をかけてみるのもひとつの方法
大量のソケットを作って自分のサーバに接続しまくるとか
何か簡単なメッセージでもやり取りすればより実際の状況に近い
もう1台PCを用意してネットワーク越しに実験できればもっと良い
仮にフレームワークがあったとしても十中八九マルチスレッドだろうからその種の心配は無くならないんじゃないかな
このマルチコア時代に1コアしか活用できないとか汎用のフレームワークとしてはありえないだろう
何かプログラマの負担を多少なりとも軽くする仕組みはあるかもしれんけどね

369 :
教えてJava仙人!

370 :
こちらで聞いて良いものかどうか判りませんが、一応Javaも絡んでいるので質問。
プレイヤーキャラクターが装備を変えた時、見た目も変わる2Dの作品を作っています。
パーツごとに見た目が変わるため、頭部、胴体、下半身、右手、左手等に
パーツを分け、それぞれでアニメーションのスプライトを製作しています。
しかし、全体像が判らないとパーツの動きがわかりにくくて製作が大変面倒な上、
PGに起した時に正面を向いている場合には髪→顔の順に表示するが、
後ろを向いた場合には顔→髪のように順番を変えて表示をする必要があり、
全体像になったときにパーツの表示位置も調整しなければならず、
難しくはないが大変手間がかかって製作が難航しています。
複数のパーツの画像を組み合わせて全体像およびアニメーションを表示しつつ画像編集ができ、
且つ保存時にアニメーションのソースコード(位置情報や表示順序・java、できればLibGDXフレームワーク準拠の)
に自動的に起すようなツールは何かないでしょうか。
Unityに似たようなツール?があるようですが、言語がJavaではないので手を出していません。
Googleでも「画像編集 パーツ アニメーション 組み合わせ」などで探していますが、
望むような情報が得られていません。

371 :
一人称視点にしてプレイヤーキャラを表示しない

372 :
キャラクタークラスで制御すれば済むはなしじゃないの?
ツール、それもソース生成ツールなんて大げさなもの必要ないでしょ

373 :
髪でサンドイッチして、片方透明にするだけだわな

374 :
>>371
2Dの作品ですし、他キャラクターも同様にパーツの組み合わせで表示しているので、
全く解決になっていません。
>>372 373
前の書き込みどおり、難しくはないのですが手間がかかりすぎるので、
作業を楽にするためにツールを所望しています。

375 :
ツールをツクールべし

376 :
画像素材を規格化してピクセル単位の調整不要にするのが普通だと思う

377 :
ゲームは一応動いてはいるのですが、
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GameManager.MainPanel.paintComponent(MainPanel.java:127)
at javax.swing.JComponent.paint(JComponent.java:1053)
at javax.swing.JComponent.paintChildren(JComponent.java:886)
at javax.swing.JComponent.paint(JComponent.java:1062)
at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at javax.swing.JComponent.paintChildren(JComponent.java:886)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5230)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1572)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1495)
at javax.swing.RepaintManager.paint(RepaintManager.java:1265).......
なエラーが2/5の頻度で発生します。
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
gsm.draw(g2d); ココが(MainPanel.java:127)
}
gsmはちゃんとインスタンス化してあります。
原因究明の為調べていた所、スレッドの非同期が問題なのかな?と思い、
//enableEvents(AWTEvent.KEY_EVENT_MASK); を無効化しましたが解決には至りませんでした。
エラーが発生してもゲームは一応動いているので表示系統の問題ではないとおもうのですが。

378 :
gsm.draw(g2d); の前に
System.out.println("gsm=" + gsm);
って入れて本当にインスタンス化されてるか見てみるべき

379 :
改行多すぎとエラーが出てしまった。
>>378
gsm=null
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GameManager.MainPanel.paintComponent(MainPanel.java:128)
at javax.swing.JComponent.paint(JComponent.java:1053).......
のあとに
gsm=GameState.GameStateManager@13236af
と出ました。
public MainPanel() {
// set the recommended panel size
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true); // allow panel to receive key-enters
requestFocus(); }
public void addNotify() {
super.addNotify();
if (gameLoop == null) {
gameLoop = new Thread(this);
addKeyListener(this); // register the key-event listener
//enableEvents(AWTEvent.KEY_EVENT_MASK); // [髱槫酔譛溘く繝シ]縺悟次蝗&amp;#65533;縺ァ[繝後Ν繝昴〒繧ャ&amp;#65533;シ‐?
gameLoop.start();}}

380 :
連投すいません。続きです。

private void inti() {
running = true;
gsm = new GameStateManager(WIDTH, HEIGHT);}
public void run() {
inti();
while (running) {
gsm.update();
repaint();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}}}
という構成になっています。このMainPanelが呼ばれた時の基本的な流れがおかしいのですかな?

381 :
おそらくそのコードでは、intiが必ずpaintComponentより先に実行されるという保証がないだろう
保証がなければ、どちらが先に実行されても (paintComponentがinitより先に実行されても) いいように書かねばならないのが当然

382 :
ありがとうございます。
addNotify()の中身をMainPanelのコンストラクタに放り込んだらエラーが出なくなった。
ところで皆さんはゲームのキー処理の問題で、
ゲームメッセージや選択肢なのでず〜っとキーを長押ししていても「一回しか押してない」というのはどういう風にしてます?

383 :
swingだとどうすべきか難しいところだな
DirectInputだと毎フレームすべてのキーの状態を取得しちゃうのが一般的だけど

384 :
中々サンプルコードみたいなのが見つからない。日本語と英語両方検索したけど。
while(true){....}
public void keyPressed(KeyEvent e) {...}
public void keyReleased(KeyEvent e) {...}
な構造にしているから
ずっとあるキーを押していたらkeyPressed()での処理が行われるし。その関数の中でwhileを使ったら永久ループなりそうだし。
推理ゲームのサンプル探したほうがいいですかね?

385 :
1↓ 2↓ 3↓ 4↓ 5↑
もし2↓を取ったら、これに対応するのは5↑だから、
3,4は無視しないといけないのでは?

386 :
普通に入力関係をラッピングすればいい話じゃ…?
//フィールド
bool isPressed;
bool tmpPressed;
//ループ内
void keyPressed(event e){
isPressed = true;
}
void keyReleased(event e){
isPressed = false;
}
if( !tmpPressed && isPressed ){ //押された1フレーム目だけ
onFirstPressed();
}
tmpPressed = isPressed;
//ループ外
void onFirstPressed(){}
みたいな感じで

387 :
>>385, 386
なるほど。
ちょっとそれ試してみます。
今ソースはこんな感じでしています。http://pastebin.com/u/TortoiseshellCat

388 :
>>387
すまん>>386は冗長だったかも
bool isPressed;
void keyPressed(event e){
if(isPressed) return;
isPressed = true;
onFirstPressed(e);
}
void keyReleased(event e){
isPressed = false;
}
void onFirstPressed(event e){}
フラグを外から参照して使わないなら
これで充分な話だった。

389 :
>>388
ありがとうございます。
そのコードだったら確かにず〜っとキー押していても大丈夫みたいですね。
ケド、思ったんじゃけど、多くのゲームにあるように
たとえばセレクトボタンを一回押したらアイテム欄が表示されて、その間ずっとボタンを押してなくてもいいような感じのをがんばろうとしているのですが。
387でそれっぽく動いているのすが、アイテムの売り買いや色々な機能を追加しようとしたらスバゲッティーは確実なので。

390 :
そういうのは普通setVisible()とかsetActive()とかいうメソッドで
パネルの表示/非表示を切り替えればOK

391 :
いつかきっと、SOAだとかクラウドだとか実現する方式は何にせよ、無料でサーバが持てて個人でネトゲ、ちょっとがんばればMMORPGみたいなのが簡単に作れる時代が来ると、自分は思っている。
今でも個人で作っている人は居るが、技術的にも金銭的のも負担が大きい。これがもっと楽になる時代がきっと来る。
そんな時、マルチプラットホーム、オープンソースで無料、完全なオブジェクト指向で学習も比較的容易、例外処理でエラーも比較的追いやすい、速度も大分改善しているJavaは、今後のスタンダードになるに違いないと思っている。
これで後はゲームエンジンやゲーム用統合開発環境等ののキラーソフトがあれば、もっと盛り上がると思うんだが。
Android系では色々あるようだが今一これというものがない。(日本語情報が少ないというのもあるが)

392 :
iPhoneがダメな時点でマルチプラットフォーム()なんだよなぁ

393 :
>>390
なるほど。Listの中にメッセージダイアログボックスを格納して管理をしているのですが
キーとの関連で表示、非表示をするのが大変だ。

394 :
アプレットをスタンドアローンでうごかしたいんだけど
アプレットをswingのパネルにhsったりできるの?

395 :
×hsったり
○貼ったり

396 :
appletviewerっていうコマンドがある

397 :
人に渡すとき
APPLET viwerなるもので動かせますか

398 :
JREを同梱して渡せば無問題であろう
JREは(一定の条件下で)再配布が認められている

399 :
あ、ごめん
JREにappletviewer入ってなかったかも
だめだわ

400 :
ありがとう
swingパネルにアプレット貼れたら
実行ファイルにできそうだけどねえ

401 :
ゲームのメインループだけど
PCのモニタ環境によってリフレッシュレートが60ヘルツとか50ヘルツの
場合があるけど60FPSで画面書き換えると50ヘルツ設定時にカクつくし
60と50FPSに切り替え可能にした場合はそれぞれ1秒辺りのゲーム速度が
変わってしまうし(フレーム毎に1ドットスクロールとか)。その辺は皆どうしてるんだろ?
単純な2Dゲーム作りたいだけなんだけど。

402 :
deltaTime

403 :
Java過疎ってんなぁ
ところでJRE8で日本語入力ができないんだが
今はJRE7をメインで使ってる

404 :
960×544の解像度でBufferdImageで前回の背景表示内容をキャプチャし、
ずらして画像表示して擬似スクロールしてスクロールした分だけ新規描画というのを
60FPSでやってみたけどCore i3でCPU40%消費。ちょっと食いすぎじゃん?
スクロールはブロック単位で再描画した方が良いのかねー。

405 :
自分もスクロールやろうとしたことあったけど厳しかった
Win7 発売され始め時期のかたおちPCだけど。
>>404 と同じぐらいの画面サイズで
BufferedImage だと 30 fps でもかなりカクカクな感じで
OpenGL使っても 60 fps だとたまにカクッとなった。
組み方が悪いのか、スペックが足りないのか、
ビデオメモリに入りきらないのか、ガベコレか、Javaの限界か、
Cとかでハードウェアに密着して書けば早くなるのか、
ようわからんかった

406 :
>>405
たぶんそれはモニタのリフレッシュレートが描画と合ってないからだわ。
少なくともセレロン程度でも60FPS程度ではカクカクなんてしない、CPUは食うけど。

407 :
質問させて下さい
どこかで、JavaのGUIがAWT/SwingからJavaFXへ移行するとの記事を読みました
これからゲーム作る場合、SwingではなくJavaFXを勉強すべきですか?

よろしくお願いいたします

408 :
あんまり詳しくないけど、2Dのゲームを作る分にはSwingでも十分だし、いろいろな解説サイトや本もだいたいSwingだからJavaFXをわざわざ勉強する必要はないんじゃないかと

409 :
>>408
レスありがとうございます
確かに、ネットで勉強していると、ほとんどSwingなんですよね
ただ、これからJavaが本当にGUIをJavaFXに絞る場合、そちらに切り替えたほうがいいのかと心配しています
JavaFXに対するOracleの本気度を知りたいですね

410 :
GUIが変更されても大丈夫な設計にしてSwingで作ればいいじゃない

411 :
>>410
そのレスで、もう一個質問したいことを思い出しました
私はシミュレーションやRPGが作りたいです
色々と、windowを作る必要があると思うのですが、ゲームの場合、それらは自作すべきですか?

たとえば、モンスターが出てきたときに、windowで「たたかう」「にげる」「防御」「魔法」とか表示するとします
その場合、その4個の選択しを表示する枠のようなものはJavaのDialogを使うべきなのか、それとも自前で絵として描画すべきなのかどっちなのかイマイチわかりません
一般的な方法を知りたいです

仮に、自前で絵として表示する場合、SwingでもJavaFXでもあんまり変わらない気になりました

412 :
自作というか、継承してカスタマイズするパターンが一番多いよ
JPanelを継承してCommandPanelとか、そういう感じ。
ボタンとかも押した時のイベント処理とか画像の変化とか備わってるものをベースにするのが現実的。

413 :
guiを自前で実装しようとするとフォーカス制御という面倒事が待ってるからswingなりfxなり使った方が手堅いよ。

414 :
199を参考にマップの処理を実装しようとしているのですが、いまだに詰まっていることがあります。
現在実装中の方法
1000万x1000万等の巨大なマップは自分じゃ一気に作れないので、20x30位のエリアを何個か作り最後に結合する。
一エリアはpublic class Area {
private int[][] map = { {1,1,...,1,1}, .. {1,0,...,0,1} };に格納。
マップはpublic class Map {
    private Area[][] map;//全体地図
private int[][] area;// 画面に表示する範囲(エリアじゃない)
map[0][0] = new Area(1);map[0][1] = new Area(2);map[0][2] = new Area(3);
map[1][0] = new Area(4);map[1][1] = new Area(5);map[1][2] = new Area(6);
map[2][0] = new Area(7);map[2][1] = new Area(8);map[2][2] = new Area(9);のように格納。

そしてプレイヤーの現在位置からどの”エリア”にいるかを算出して
int indexTPX = (int) (topLeft.getX() / (areaWidth * TILE_SIZE));//topLeftは表示画面の為の座標
int indexTPY = (int) (topLeft.getY() / (areaWidth * TILE_SIZE));
area = map[indexTPY][indexTPX].getArea();

そのエリアを描画する。

問題は、例えばmap[0][0],map[0][1],map[1][0]とmap[1][1]の境界付近(+)にプレイヤーがいて
「そのときの描画はどうやればいいのか?」です。
for (int i = 0; i < areaHeight; i++) {for (int j = 0; j < areaWidth; j++) {.....}}だと4つの該当するエリア描画できないし。

415 :
先ず、更新と描画は別。

416 :
表示される範囲座標一つ一つ、どのエリアのどこの座標になるか見ればいいんじゃないの。

417 :
複数の座標系は変換して使うもの。
グローバル座標、タイル座標(=グローバル座標の場合あり)、エリア座標は相互変換できないとおかしい。
そしてそれら座標系が描画時にウインドウのクライアント座標に変換できないといけない。

この辺が整理できていないからやり方が判らないんだよ。

418 :
>>415 ~ 417
変換系の整理ですか...
int indexTPX等で表示画面の左上座標を算出して後は表示画面の幅や高さでそれぞれの座標計算は出来るのですが。
/** private Area[][] map
* [1][2][3]
* [4][5][6] 5 -> はじまりの町
* [7][8][9]
*/
1,2,4,5の中心付近にいて4つのエリアを描画するとき、
どうやって各エリア情報を取得して使用するかが確かに整理できない気がします。

419 :
>>418
4つの中心付近とか関係ないだろ…?
今プレイヤーは何番のマップにいるのか。
そのマップはどれだけオフセットしてるのか。
チップのサイズ、マップのサイズはいくらか。

420 :
>>418
エクセルでも方眼紙でも何でもいいから、簡単に入子の箱書いてみれば理解しやすいんじゃない。

421 :
>>419~420
一つの大きなマップはいくつのも小さなエリアの集合体で構成されているので,
その小さなエリアの幅が決まっています。
よって描画画面がそのエリア幅を超えたら、そのエリアに接している別のエリアも映し始めなければならないので。
後、今プレイヤーが何番のマップにいるのかはわかる様にしています。

ちょっと説明が出来ないのでソース上げてもいいですか?

422 :
仕組みは理解できてると思うよ。

表示範囲が1エリアの範囲を超えるでもなければ、プールしておくべきは最大4エリア
その4エリアから表示範囲分を表示すれば良いだけ。

423 :
エリア座標(0, 0)               エリア座標(1, 0)
    グローバル座標(0, 0), (1, 0)        グローバル座標(2, 0), (3, 0)
              (0 1), (1, 1)                  (2, 1), (3, 1)
エリア座標(0, 1)               エリア座標(1, 1)
    グローバル座標(0, 2), (1, 2)        グローバル座標(2, 2), (3, 2)
              (0 3), (1, 3)                  (2, 3), (3, 3)


描画するべき範囲が四つのエリアに跨っていようとも、
グローバル座標で考えればいいんだよ。

グローバル座標(1, 1), (2, 1)
          (1, 2), (2, 2)

グローバル座標からエリア座標に変換する関数が一つあれば十分でね。

プレイヤーの居る座標(グローバル座標)が判るのだから、
後はプレイヤーを中心に表示する仕様だとして、
クライアント領域に描画する必要なタイル数も判るのだから、
描画の開始点となるグローバル座標も判るし、その座標から何座標分(もしかするとタイル分)描画するかも判るよね。

後はその範囲をfor文でループでもさせて、毎回グローバル座標からエリア座標に変換させて、
エリア上の該当する位置の情報にアクセスすればいいだけでしょ。

これは理屈の話であって、もっと効率的にアクセスできるように設計し実装することも、個々の仕様により可能な場合もあるでしょう。
とかくこれで問題ない筈だよね?

424 :
>>422~423

なるほどなるほど。グローバル座標などで処理する等で問題は解決しそうです。
ちょっと道が見えてき始めたのでがんばってみます。
ありがとうございます。

425 :
2年経っても同じことやっててワロタ

4エリアだと計算が難しいから、エリアを少し小さくして
主人公の周り全方向8エリアを処理するようにすれば?

426 :
全体マップをエリア単位で分けた座標をブロック座標とした場合、
現在位置の要素を調べるのには、全体マップでの現在位置を1エリアの大きさで割って、商が全体マップ中のエリアのブロック座標、余りがエリア内の要素座標。
これは現在位置の足元の要素を調べる考え方だけど、右隣の要素を調べたいなら右隣を現在位置座標とした同じ計算をしてみればいいだけ。
プレイヤー周囲3x3の要素を調べたいのなら、計9回分基準となる座標を入れ替えて同じ事をすればいい。

427 :
巨大マップを作るのにしても迷路状のMAPなら、迷路生成の為のツール作って大枠を作成、その上で細部を手直しするとか、
2Dのフィールドマップならマップタイル1つを1色の色に見立ててペイントで大雑把に描いて、その後に通常のマップタイルを組み合わせた表示で細部を手直しするとか。
3Dのフィールドマップなら上記のやり方に組み合わせて、等高線地図的なもので凸凹のMAPを生成し、細部を手直しようにするとか。

巨大な皿に一つ一つ米粒並べるよりも、米をぶちまけて均等にならした方が早い。
グローバル座標からブロック座標、エリア内座標を生成するのも、それと似たような考え方。

428 :
ふお===
何かスパゲッティー通りこしてペペロンチーノになってきた。
ちょっと今思ったのですが、もう一つグローバル変数だけのマップをつくればいいかな。
小さいエリア集合のマップを最初から一つの大きなマップ(グローバル座標もち)にすればいいんじゃね?
そうすればエリアからG座標の計算やエリアが跨った時の計算も楽になるので。

しかし、問題はどうやって
エリア座標(0, 0)               エリア座標(1, 0)
    グローバル座標(0, 0), (1, 0)        グローバル座標(2, 0), (3, 0)
              (0 1), (1, 1)                  (2, 1), (3, 1)
エリア座標(0, 1)               エリア座標(1, 1)
    グローバル座標(0, 2), (1, 2)        グローバル座標(2, 2), (3, 2)
              (0 3), (1, 3)                  (2, 3), (3, 3)

(0, 0), (1, 0), (2, 0), (3, 0)
(0 1), (1, 1), (2, 1), (3, 1)
(0, 2), (1, 2), (2, 2), (3, 2)にするのにはどういう風にループまわそう?
concatみたいなものjavaにありますかね?

皆さんの助言凄く助かるのですが、如何せん実装時にペペロンチーノ化する。

429 :
グローバルマップのサイズはGX256xGY256。
エリアマップのサイズはAX32xAY32。
すると、グローバルマップは、BX4xBY4のブロックマップとなります。

プレイヤーの現在位置は、PX72,PY24。
この場合、プレイヤーが存在する場所は、

PX72 (プレイヤーのグローバル座標)
PY24

(PX72 / AX32) = bPX2 (プレイヤーの存在するブロック座標)
(PY24 % AY32) = bPY0

(PX72 / AX32) = aPX8 (エリア内のプレイヤー座標)
(PY24 % AY32) = aPY24

演算子は理解できてるよね?

430 :
エリアマップの集合体がグローバルマップなわけで、その集合体を管理するのがブロックマップでありブロック座標。
エリアマップの集合体を管理する座標体系が、まるっきりすっぽ抜けてんだよ。

431 :
チップ単位 32x32(ピクセル)
エリア単位 16x16(チップ)
ワールド単位 64x64(エリア)

int theWarldWidth = 32 x 16 x 64; // 全ての合計
int theWarldHeight = 32 x 16 x 64;
int oneAreaWidth = 32 x 16; // エリアひとつ当たり
int oneAreaHeight = 32 x 16;
int oneTipWidth = 32; // チップひとつ当たり
int oneTipHeight = 32;

プレイヤー座標(Pixel単位)
int x;
int y;

int getAreaX() {
return x / oneAreaWidth;
}

int getTipX() {
return (x % oneAreaWidth) / oneTipWidth;
}

int getPixelX() {
return (x % oneAreaWidth) % oneTipWidth;
}

※真になる
boolean isOK = (x == getAreaX() * oneAreaWidth + getTipX() * oneTipWidth + getPixcel()):

432 :
>>429
はい。 % は余りで、/は除です。
>>430~431
こんなに助けて貰っていてまだ出来ない自分が情けなく思います。まじで。
ちょっと今までの過程を上げて見ます。
ttp://fileup.jp/up/6184.zip.html

433 :
2DのアクションRPGとかその辺かねぇ
ttp://gesei.sub.jp/kami/src/up0358.zip

434 :
>>433
おおおおお。すごい。
完璧に出来ている。
今コードを読んでいて関心させられるばかりです。
もう少し完全把握に時間がかかるので出来次第また書きます。
本当にありがとうございます。これでまたちょっとがんばれるかな。

435 :
漸く432で上げたコードに組み込むことが出来たました。
一つ質問があります。

例えば敵がある一定のエリアにいてArea.update()で更新するのがいいのか。
若しくは、Areaクラスの集合管理をしているMapに敵(自己のエリア番号保有)を格納しているのがいいのか。
クラスダイアグラム考えているんですけど、普通は前者ですかね?

436 :
1.ゲーム仕様的に敵が少なければ敵全員forループで回す
実装が簡単、どこかに敵全員入ったList<Enemy>があれば良い

2.全エリア合計で10万とか敵がいる場合、巨大なforループ自体を回したくない
その場合はAreaクラスにList<Enemy>をもたせておき、Area.update()する
こちらの場合、敵が動いてエリアを跨いだ時に移動前と移動後のエリアに変更を通知する

437 :
>>433をベースにした場合、これで十分だろう

Application.java

public class Application {
 private static List<Enemy> enemys = new List<>();
 public static List<Enemy> getEnemyAll() { return enemys; }
}

MainPanel.java

private void onUpdate(){
 Map map = Application.getMap();
 map.update();

 Player player = Application.getPlayer();
 player.update();

 List<Enemy> enemys = Application.getEnemyAll();
 for(Enemy e : enemys){
  e.update();
 }
}

438 :
なるほど。わかりました。次は当たり判定を実装してみます。


後、皆さんゲーム作るときって何か雛形や構造など参照にしてるものってあります?
自分はテンプレにある-> 大量のソースコードを公開して下さっている国内サイト
ttp://aidiary.hatenablog.com/entry/20040918/1251373370
を使っていますが。

439 :
さすがにちょっとenemysは頂けないわ

440 :
がびーん

441 :
>>439
enemies?

442 :
一つのエリア内での壁の当たり判定は出来ましたが、またエリア境界を跨ぐ所で詰まった。
>>426みたいにするのを考えていますが中々うまくいかない。
いっそのこと>>428の方法を取ったほうが周りのエリアのことを考えなくて住むので計算は楽になるかな?

443 :
いや、何でやねんww
同じ座標変換で、進行方向のオブジェクト調べりゃええだけやがなw

444 :
これは流石に草

445 :
まるで成長していない

446 :
基本的にプレイヤーの操作によっていじる座標は、キャラの位置を示すグローバル座標のみ。
その他の、全体マップ内でのエリアの位置を示すブロック座標や、該当エリア内でのプレイヤーの位置を示すエリア座標は、必要なときに都度グローバル座標から変換すればいい。
そうすりゃエリア跨いだ場合の処理がー、とか悩む必要もなくなるよ。

447 :
横から補足すると、
エリアというのも、全エリアの中の更新範囲のエリア群になる筈なんだよ。
それを決定するのもプレイヤーまたはカメラのグローバル座標から行われる。

一度、セーブ・ロードの視点でデータの持ち方、データへのアクセスフローを考えてみるといいよ。
何をトリガーにしてフローが産れるのか?が理解できる。

448 :
>>446~447
ありがとうございます。
>>431の変換関数を基本にしてグローバル座標からエリア座標に変換していますが、
多分壁判定に使っているarea[y][x] == 1系に不備があるんだと思います。

一応シーケンス図を考えながらフローに気をつけて見ます。
4日位でギブアップはやはり早いのでもう少し頑張ってみてみます。

449 :
http://www.m9-www.com/lwjglgameproject

450 :
ttp://gesei.sub.jp/kami/src/up0358.zip
が限界。頭禿げそう。

451 :
まずは速度をタイル単位(32)からはじめるこった
ttp://gesei.sub.jp/kami/src/up0360.zip

452 :
>>451
199さんでしたか。色々助言やコードなどありがとうございます。
しかも世界ループ機能まで実装してもらってますし。読み易い。
今からプログラムを追っていく作業に取り掛かります。

これでなんとか地図上で動き回れるようになりそうです.

453 :
名前に番号入ってないのは俺じゃないよ

454 :
それは失礼しました。
ちょっと判定時々バグるけどこんなかんじでしてます。
ttp://gesei.sub.jp/kami/src/up0361.zip

455 :
アローン☆スタンド

456 :
今度こそちゃんとしたゲームが作りたい!
目標は動物の森みたいな2Dゲーム。グラや操作性は大体80s~90s的なゲームが理想。
ゲーム中の機能としてはキャラ移動はもちろん、店での買い物や魚釣りなど色々な事が出来たらいいな。
ま〜最低店での買い物やメニュー画面を開いてアイテム確認や装備変更が出来ればいい。
ゲーム外の機能としては多くのゲームに共通する”新しくゲームをはじめる”、”ロードする”等選択出来るようにする。

今までに何回か簡単なゲームを作っては失敗しX2を繰り返したので上に列挙した機能は多分実装可能。
しかし、それらを管理する方法(構造)が現在未熟な為不明。

http://en.wikibooks.org/wiki/Video_Game_Design/Structure にあるState Machineの機能を実装したい。

現在の方法はfrontEndとmainGameをリストで管理し、各stateに固有のIDを持たせて初期化やupdate等をしている。
ココで今問題になっているのはfronEndで”ロード”されたゲームデータをどのようにしてmainGameで受け取り処理するか?等だ。

ゲームの構造は作製回数を重ねるごとに洗練されてくると聞き及ぶ。
貴方達はこのような時どんな構造にしていますか?

457 :
文章おかしくて外人みたいだな
質問内容が分からないのでもう一度書き直せ

458 :
失礼。何年も日本にいなかったのでまだ少し文章が変かもしれない。
質問内容は
start up
licenses
introductory movie
front end
 game options
 sound options
 video options
loading screen
main game
 introduction
 game play
  game modes
 pause options
end game movie
credits
shut down
というゲームの基本要素をstate machineを使ってどのように実装したら、これらの管理が容易になるだろうか?です。

ここにコード全部乗せるのは文字制限の関係で無理みたいっだし。

459 :
グローバル変数ばんざい

460 :
ゲームの進行を管理するクラスが必要だなー。
データをセーブロードするクラスも必要だな。
データそのもののクラスがあったほうがいいな。
プレイヤーというクラスもあるな。
アイテムというクラスを作ったら、
プレイヤーにアイテムのリストを持たせる?
いやアイテムボックスというクラスを作って、
それをプレイヤーに持たせるか。
満タン判別とか簡単に引っ張って来られたら便利だなー…
あ、データクラスに含ませてセーブしたほうがいいな。
ロードしたらアイテムボックスにリストをセットしたいな。

…って感じで、まずは想像を膨らませながら
具体的に設計したら後々楽だよ。

461 :
ゲームの進行を管理するクラスが必要だなー。
データをセーブロードするクラスも必要だな。
データそのもののクラスがあったほうがいいな

から下は既存のコードを流用しようと思っていますので再設計などは他聞問題ないと思います。
http://www012.upp.so-net.ne.jp/flab/javatuto/javatuto8.html なものを見つけたので今勉強中。
もっと何かいいのがあれば教えてもらえればうれしいです。
stack exchangeやgamedev漁るのちと疲れてきた。

462 :
シーン単位の設計とかそういう設計指針立てるのが苦手ってことなら、
ゲームエンジン使えば?って話になっちゃうかも

あと遷移図とか画面構成イメージとか描いたりしてる?
コード書く→リファクタリングばっかりでもいいけど、
適当に手書きで整理してみるだけでも違うもんだよ

463 :
シーンの遷移が分からないってはなしだろ?
シーンのインスタンスをstaticとかシングルトンにすれば
そのインスタンスがもってるプロパティもイモヅル式にどこからでもアクセスできる

https://pastebin.mozilla.org/8828264

464 :
期限が短すぎたので上げなおし
https://pastebin.mozilla.org/8828750

465 :
継承や関連性はなんとなく図を描いている所。
DFDしかちゃんと出来なくて困る。
コード見ましたところ、dispose関数がありますが、そのシーンを廃棄するのでしょうか?

基本的な流れとしては、
GameStateManagerでgame options, sound options, video optionsそしてmain game突入まで管理する。
STARTは単に"Presse Start"を表示させるだけにして、後でその他のoptionsをリストに追加する。

PLAYに(遷移:読み方知らん)かんい?したらPlayStateManagerに移る。
PlayStateManagerではキャラ移動,店での買い物,メニュー画面を開いてアイテム確認や装備変更等をそれぞれstateで管理する。
例えばPlayStateでキャラ移動, MenuStateでメニュー画面を開いてアイテム確認や装備変更等に分けている。

これで各state特有の処理は出来るのだが、ここで一つ問題が発生する。
問題とは、どのようしてリストに収納されている各stateで”GameStateに無い関数”にアクセスできるか?です。

例:
PlayStateでキャラ(player)を移動させているときにアイテム確認の為にメニューを開いた。
その時PlayStateManagerにあるsetPlayer(Player p)の関数を呼び参照準備完了。
そしてPlayStateManagerでstateの移行を実行しPlayStateからMenuStateに移行する。
その後MenuStateでPlayStateManagerにあるgetPlayer()を呼び参照取得。そしてアイテムの使用や廃棄等の操作をした後再びPlayStateに移行する。
その時PlayStateManagerにあるsetPlayer(Player p)の関数を呼び参照準備完了。
その後PlayStateにあるsetPlayer(Player p)を呼んで参照のセットを計る。

しかし、その関数はGameStateに記述されていないから参照できない。

goto的になっちゃんだよな〜


https://pastebin.mozilla.org/8828836

466 :
普通にGameStateをPlayStateにダウンキャストすればよいだけだろ
ダウンキャストしたくなければ、そもそもリストに詰めないことだ

467 :
確かにダウンキャストすれば出来そうですが、それをしようとしたら各要所で条件分岐させなきゃならないし、
前呼んだ”javaで学ぶリファクタリング”の本でDCは余り良い手ではないと書いてあったので。

468 :
アホガキまるだしでうんざりする

469 :
そういえば春だね

470 :
Thread.sleep() を呼び出すと15ミリ秒も処理が帰ってこないという話があり

http://dobon.net/vb/bbs/log3-23/14028.html

最高精度の 1 ミリ秒にできたとしても
UI スレッド、描画スレッド、AIスレッドなどを同期させながら 60fps 出したいときに
スレッド切り替えるたびに 1 ミリ秒かかっていたのでは致命的だ

この辺みんなどうやってクリアしていますか?

471 :
src.zip, Thread.java, sleep(millis, nanos):

if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
   millis++;
}

sleep(millis);

本当に丸められていた・・・

472 :
java.util.concurrent.lock.LockSupport.parkNanos(1L);

も15ミリ秒待たされた。
新しめの win 8.1 マシンでさえこんな状況

473 :
>>470
同期させるならsleepのタイムアウト待つんじゃなくて割り込みかけない?
もうちょっとちゃんとするならjava.util.concurrentのCyclicBarrierやらCountDownLatchやらPhaser使うんじゃない?

>>472
うちの環境だとThread.sleep(1);やjava.util.concurrent.locks.LockSupport.parkNanos(1L);は約1msで戻ってくるけどなー
Windows 8.1 64bit/Java8/Pentium G6950
Windows 8.1 32bit/Java8/Atom Z3735F

ideoneも約1msだった
http://ideone.com/Hlp4cu

474 :
>>473
アクティブレンダリングの待ちが念頭にあったから sleep と考えていたけど
確かに同期させるという用途なら wait / notify とかが良いかも。

そちらでは1ミリ秒の精度あるのですね。
環境によってばらつきがあるのかな?
parkNanos(1L) はさすがに1ナノ秒の精度は期待できないにしても
マイクロ秒単位の精度はあってほしかったですが

475 :
>>470
リンク先の内容って2005年の.NET C#の話でしょ?
なんでJava板で?・・・
System.nanoTime()使えばナノ秒単位の精度が出るでしょ。
http://aidiary.hatenablog.com/entry/20070429/1251463673

476 :
nanoTime() は確かに 100 ナノ秒単位くらいの精度がでるかもしれないが
それは時間を「測る」ほうの精度で、sleep で「待つ」ほうの精度はもっと悪い。

リンク先を貼ったのは探すのをさぼってしまったからだけど、
Java で、最近の Windows でも状況は似たり寄ったりなのは >>471,472 の通り

ぬるぬる動くゲームを作ろうとしていて、Thread.sleep() を呼んでいる場合は、
けっこうオーバーヘッドになっているかもしれません

477 :
そりゃ寝てる間に別のタスク呼んでるんだから

478 :
sleep(millis, nanos) とあるから、ナノ秒単位で寝かせられる
と思うじゃん、

479 :
JavaFXってグラボのアクセラレーションかかるのかな?
って誰もいないかw
PCで携帯スマホのOpenGLくらいのパフォーマンスは出そうなんだが…

480 :
age

481 :
http://video.fc2.com/mycontents.php

482 :
新板age

483 :
簡単にお金が稼げる方法興味ある人だけ見てください。

グーグル検索⇒『来島のモノノリウエ』

SCVG4A16FM

484 :2018/02/17
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆

カードワースのシナリオを作ってみませんか?
MMORPGっぽいRPG開発会議室 Ver1.0.0
【サウンド】ゲーム制作者の為の音楽理論【初歩】
【3Dゲームエンジン】CryENGINE3【商用有料】
flashでネトゲー作らない?
「ゲーム学会」発足記念スレ
flashゲームでロックマンの同人ゲーム作ろうぜ
Unityで何かゲームを作りたいんだがね
ゲームにおけるデータ構造・クラス設計・パターン2
ゲームの作り方2〜悪霊の神々〜
--------------------
校長「部員全員で結託をしてヒグマ一匹を殺せ!」←勝てそうな部活www
【現役ファンドマネージャー】西山孝四郎・石原順★37
iPhone6民集合
☆岡山印刷製本業界5☆
好きな人におやすみを言うと会えるスレ173
尾田栄一郎 「5年以内にはワンピースを終わりたい」
世界好況に乗った俺は戸田さんに導かれた?18株目
神戸市職員、緊急事態宣言後にゴルフで陽性。神戸崩壊か [328733795]
Bobby Caldwell ★ ボビー・コールドウェル
★ヤマト運輸の受付事務・内勤事務 パート7
【自動車】“匠の技”を注入! 「ホンダS660モデューロX」発売
【灰と幻想のグリムガル】ユメはおしりかわいい3
【バイト先で】うまくいくもんなの?【恋愛】
ネカフェ難民になってこそ現代人だろ!
小中学校でうんこしてるの見つかるとあだ名がウンコマンになるからな
●●●●●国立大学至上主義の終焉●●●●●
【遠征】旅の窓口@宝塚【追っかけ】 4日目
【間もなくGSOMIA失効】韓国にはどんな変化が訪れる?韓国ネット「GSOMIAのない時代も韓国は平和に暮らしていた」[11/22]
【早期】郵政や〜めた♪5【退職】
【正産期】妊娠37週目からの奥様219
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼