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

このエントリーをはてなブックマークに追加
1名前は開発中のものです。
スレタイはアプレットとの対比的な意味と考えてください。
Javaでのゲーム開発は賛否ありますが、国外では割と盛んになってきているように思います。
裏を返せば日本語だけでは情報が得辛い状況であり、寂しく開発してる人が多いのでは・・・。

関連スレ
JAVAアプリでゲーム
http://toro.2ch.net/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名前は開発中のものです。:2012/12/27(木) 19:55:38.03 ID:v30jHeKj
アプレットと切り離す意味が分からん。モバイル等もあるだろうに。
Java自体は好きだけど、こういう排他的な方向性は気に食わん。クソが
3名前は開発中のものです。:2012/12/28(金) 00:13:36.77 ID:6C5ZFHM5
スマホは知らんけどガラケー向けはむしろスタンドアロンなんじゃないか。
ガラケー向けに一杯出てるだろ。
4名前は開発中のものです。:2012/12/29(土) 00:34:25.41 ID:bpd6cCoW
アプレットだろうがWebStartだろうが
クライアントがJREインストールさせる壁があるのと
アプレットの起動時にブラウザが固まるのがうざくて

どうせ敷居が高いならスタンドアロンで作るほうがいいかなと思ったり
5名前は開発中のものです。:2012/12/29(土) 00:51:13.88 ID:bpd6cCoW
Java愛好家の仲間が欲しい
OpenGL2DならSlickライブラリお勧めだよ
6名前は開発中のものです。:2012/12/29(土) 02:50:09.55 ID:Z41Rv9on
俺はアプレットと切り離したほうがいいと思う
アプレットは目的が違って来るよね(ウェブで気軽に触って欲しいみたいな)
やはりソースコードもそういう方向に行っちゃうし、何せネットにあるアプレットのソースに酷いのが多いのは有名(古いのが多いのも理由)

学び始めた子がここに嵌まっちゃってる感がみてられん
「排他的」というのは被害妄想すぎるし、Swingのそれをわかってくると面白くなってくるというもの
7名前は開発中のものです。:2012/12/29(土) 09:51:49.28 ID:bpd6cCoW
アプレットもSwingじゃん。的外れだと思うぞ。
8名前は開発中のものです。:2012/12/29(土) 12:09:44.18 ID:NMQ+6QlP
JApplet使えってことだろ?
アプレットに限らずだが未だにJFrame使わずFrame使ってたりJApplet使わずApplet使ってるのは不勉強だと思われても仕方が無い
人気無くなったのか知らんがJavaって2004年5年あたりで時が止まってる気さえする
とかいう俺もjre1.6から離れられないわけだが
9名前は開発中のものです。:2012/12/29(土) 22:17:51.01 ID:bpd6cCoW
JDKは1.7だとjavadocが英語しか使えなかった覚えがあって、まだ1.6使ってますw
JREは自動更新したりアプレットとか開くと更新を要求されるから1.7になってる。
swingではなくawtを使うのは1.6後期までOpenGLと相性悪かったからだろうね。

swingコンポーネント使うとOpenGLの速度潰すからボタンとか自作しろって
slickフォーラムに書いてあったが、もうOpenGL捨ててswingだけでなんか作ろうと思う。
10名前は開発中のものです。:2012/12/29(土) 22:26:18.14 ID:bpd6cCoW
webアフィ広告をしこんだスタンドアロンゲームを作ってみるつもりだ
(ちなみに俺のホームページは1年間あたり500円稼ぐのがやっとw)

何かいいゲームネタをもってるやついたら、俺と組もうぜ! m6(・∀・)ビシッ!
11名前は開発中のものです。:2012/12/29(土) 22:53:17.04 ID:M5vPsEyE
チーム・シンコロールのJava使いですチャオ!
同じJava使いとして応援してます

組むのはプログラマがかぶるかなという気もしますが
ゲームネタの雑談するのは乗り気です
12名前は開発中のものです。:2012/12/30(日) 00:51:47.07 ID:Z7980Zcb
そうですか。

今のところ、とりあえず凸画像だけで作るRTSとか、ローグとか、
そんなゲームがいいかなと思ってます。
13名前は開発中のものです。:2012/12/30(日) 01:23:33.01 ID:UmoPsOLw
今って描画はレンダーメソッド作ってマルチバッファリングするのかな?
そこで質問なんですが、ダブルにするかトリプルにするかってどうやって決めればいいのでしょうか
14名前は開発中のものです。:2012/12/30(日) 12:05:17.90 ID:Z7980Zcb
子供はあんまり相手したくないかなっと
15名前は開発中のものです。:2012/12/30(日) 12:53:40.81 ID:Z7980Zcb
XULRunner+Swingで行こうと思ったが、JavaFX2.0でwebkitが使えるんだね
まだ情報量の少ないFXの調べ物でつまづくとまずいから、swingでいくことにしよう
16名前は開発中のものです。:2012/12/30(日) 13:47:50.21 ID:J6TBE/fQ
へえ〜トリプルバッファリングていうのがあるんだ
自分はいつもデフォのダブルバッファリングしか使ってないので何とも言えないが

欠点: プレイヤー入力から画面出力までに1フレーム遅延が発生する
利点: 処理落ち時に1フレーム分余裕がある

ググったらこんな感じでした
17名前は開発中のものです。:2012/12/30(日) 13:55:12.28 ID:J6TBE/fQ
>>15
XULRunner とは意外な組み合わせ
と思ったらいまではJavaXPCOMで呼びだせるのか
時代は進んでるなあ
18名前は開発中のものです。:2012/12/30(日) 15:14:18.96 ID:Z7980Zcb
>>17
XULRunnerでweb広告を貼るわけだが、
同根するネイティブ(dll, so)が100MBくらいになる。
これをwindows限定ならば20MBぐらいで済む。

どうせゲームクライアントはwindowsだから
windows以外はバッサリ切り捨てる。
19名前は開発中のものです。:2012/12/30(日) 15:29:19.54 ID:Z7980Zcb
アクションゲームは重くなったら処理落ちさせた方がいいだろう。
追尾ミサイルが100発ぐらい飛んできてスローモーションの中避けるのは
むしろ盛り上がる。画面が止まったまま当たり判定くらったら嫌なはずだ。

エフェクトなどが重要ではないリアルタイムSLGなんかでは
画面の更新を飛ばしてでもとにかくロジックを更新せねばいかん。

前者はダブルバッファ、後者はトリプルバッファが向いてそうだが、
迷うぐらいならとりあえずダブルバッファを選んだほうが無難だと思う。
20名前は開発中のものです。:2012/12/30(日) 20:41:02.66 ID:Z7980Zcb
休みなのに人いないな。流石アローンスレだぜ。
21名前は開発中のものです。:2012/12/30(日) 21:24:35.59 ID:J6TBE/fQ
ところで凸画像でなんですか?
ググるとデコレーションメールの画像? ゲームに使えるん?
22名前は開発中のものです。:2012/12/30(日) 21:48:58.76 ID:Z7980Zcb
そのまんま凸のキャラチップだよ。
八方向のキャラグラ素材作ったら大変だろ?

だから例えばマップ上では簡素なアイコンとして凸絵を表示して、
マウスで駒を選択すると右上にキャラ名と正面向いたキャラ絵を表示するんだ。
それなら前向きの絵だけ用意すればゲームが作れる。

ttp://uploda.cc/img/img50e0368219f69.png
23名前は開発中のものです。:2012/12/30(日) 22:36:08.72 ID:J6TBE/fQ
ナルホド!
24名前は開発中のものです。:2012/12/31(月) 05:57:14.62 ID:mCWlGEJ8
こいつぁ臭い
25名前は開発中のものです。:2012/12/31(月) 13:37:17.72 ID:SbWtF6xH
HSPでRPG作りたいんですが、正直難しいと思います。
でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
HSPの基礎からすべてを叩き込んでくれませんか??
お願いします。
26名前は開発中のものです。:2012/12/31(月) 21:30:22.02 ID:8YamBsSw
スレチだ出て行け坊主
27名前は開発中のものです。:2013/01/01(火) 13:25:32.10 ID:bDDsDYAo
ゲ製は不毛だな
28名前は開発中のものです。:2013/01/01(火) 18:00:17.04 ID:5xGtRyAR
ゲームを製作すること自体が不毛?
29名前は開発中のものです。:2013/01/01(火) 18:49:44.03 ID:bDDsDYAo
ゲームを製作すること自体が不毛だが、それ以前の問題だろ
ゲ製板でゲームを製作してるやつはまずいないしな

この板にいるのはせいぜいこの程度の初心者ちゃん↓
【Eclipse】Android ゲームApp作成【初心者】
ttp://toro.2ch.net/test/read.cgi/gamedev/1355211405/l50

vipゲ製スレもエロ画像貼って雑談してるだけ
30名前は開発中のものです。:2013/01/01(火) 19:07:34.78 ID:qZjxFetx
実際本腰入れ始めると気軽にあげたくないし、逆に気軽にあげちゃう奴は教えを乞う立場なのに何故か自分に酔ってたり・・・
31名前は開発中のものです。:2013/01/01(火) 19:58:07.51 ID:5xGtRyAR
ゲームを製作すること自体が不毛だと思ってるなら
ゲ製板にゲームを製作している人がいなくても無問題では?
不毛だと思うことをしていないのだからむしろ喜ばしいのでは?
32名前は開発中のものです。:2013/01/01(火) 20:09:24.28 ID:bDDsDYAo
ソースや成果物は上げなくてもいいけど、出し惜しみせずに情報交換しないとね。
雑談の中ですら批判専門家や乞食くんばかりでまともなやつが出て行ったのがゲ製板だろう。
33名前は開発中のものです。:2013/01/01(火) 20:28:58.56 ID:5xGtRyAR
情報提供したいけど大した情報持ってないんだよな
個人的には javax.sound.midi で midi を
プログラムレベルで叩けるのを知ったのが自分の最近のヒット。

音はショボ目かもしれんがデフォの gervill シンセを鳴らして遊んでる

自動作曲とか興味ある人いるかな
34名前は開発中のものです。:2013/01/01(火) 21:21:46.11 ID:5xGtRyAR
switch 文しばらく使わなかったら文法忘れてた
35名前は開発中のものです。:2013/01/01(火) 21:33:36.72 ID:qZjxFetx
javaのmidi関係は割と素敵だけどそっから何か作りたいとは思わんな
それならsteinbergからSDK落としてきて素直にVST開発するのがいいが、これまた同志がいない
ファミコンゲームしか作る気ないし音はNSF一択
36名前は開発中のものです。:2013/01/01(火) 22:05:29.06 ID:bDDsDYAo
switch文はJDK1.7から文字列分岐ができるようになった。

String var = "hello";
switch(var){ case "fuck" : break; }
37名前は開発中のものです。:2013/01/01(火) 22:09:57.60 ID:oH3eRw/7
>>36
知らなかった…
早速,自分のコードを書き直してみよう.
38名前は開発中のものです。:2013/01/03(木) 17:37:40.90 ID:VLgNVUQ7
ちゃちぃのやウェブ系ならいいが、やはりswingはゲームに合わんなと思う
lwjglみたいなの使うか、SWTとawtを上手いこと使うのがいいね
ただswingはやはり気楽で便利だ
39名前は開発中のものです。:2013/01/03(木) 18:38:49.37 ID:iQ8H96lh
自前でコンポーネント一揃いを作って持っておきたいけど
あんまり作り方を説明してる文書ってないよな

良く知らんけど、
Swingは描画の更新をイベントディスパッチのスレッドが行わないといけないから
OpenGL の速度が生かせないのかな?

はじめから OpenGL の描画に同期したコンポーネントとして設計すれば良さ気か
Swing を移植できたらすばらしいけど、根元の動作原理を良く分かってないからムズイ
40名前は開発中のものです。:2013/01/03(木) 18:46:17.66 ID:/e5l6Kgw
Swingコンポーネントはメモリイメージで
VRAMに固定されてるテクスチャじゃないからじゃねーの?
41名前は開発中のものです。:2013/01/03(木) 19:08:59.04 ID:iQ8H96lh
これマジか?
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248211/

swingで974FPSも出てるぞ。

でも自分で試すと58FPSくらいしか出ないんだよな
どうやるんだろう
42名前は開発中のものです。:2013/01/03(木) 19:40:05.56 ID:iQ8H96lh
eclipseで-Dsun.java2d.opengl=trueを設定するにはどうすればいいんだぜ?
43名前は開発中のものです。:2013/01/03(木) 19:48:31.67 ID:HH4MlVNk
MinecraftはJava製だが
44名前は開発中のものです。:2013/01/03(木) 20:51:42.45 ID:/e5l6Kgw
>自分で試すと60FPSくらいしか出ないんだよな
ディスプレイのリフレッシュレート調べろ。

>eclipseで-Dsun.java2d.opengl=trueを設定するにはどうすればいいんだぜ?
ググればすぐ分かる

こんなレベルで一個一個質問してたらゲームは遠いぞw
45名前は開発中のものです。:2013/01/03(木) 21:17:38.19 ID:VLgNVUQ7
肝心のゲームよりゲームエンジン作るのが楽しい
スプライトシートに特化したソフトが仮完成した
マップエディタを改良していきたい
エディタ側からイベント追加、フリーハンドでの当たり判定生成ができるよう改良する予定
46名前は開発中のものです。:2013/01/03(木) 21:28:04.63 ID:iQ8H96lh
設定はできていたけど、エラーが出ていたみたい

$ 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名前は開発中のものです。:2013/01/03(木) 22:10:32.44 ID:iQ8H96lh
できたー。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名前は開発中のものです。:2013/01/03(木) 23:17:38.07 ID:iQ8H96lh
う〜ん、出来たような

http://uploda.cc/img/img50e5927fb81f4.png

グラジエントが縞模様っぽいのは仕様か…?
49名前は開発中のものです。:2013/01/03(木) 23:40:29.62 ID:sM7fMx9K
みんなは、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名前は開発中のものです。:2013/01/03(木) 23:41:04.36 ID:iQ8H96lh
でも垂直同期に合わせられないから旨くないかなあ

いい加減寝るか―
51名前は開発中のものです。:2013/01/04(金) 03:31:47.90 ID:2zju+Vqy
>>49
スマホで作らない限りスマホにも使える系は面倒かなと。
あとSpringてDIのあれとは別物?
52名前は開発中のものです。:2013/01/04(金) 08:28:30.04 ID:1BGKtbhX
何を目指すかによるとしか言えんな
最新ゲーム機の出力に近づけたいならゴージャスなもの用意すべきだし
俺は物理演算をどうするかを判断基準にしている
割とその辺の数学が好きだったり、ファミコン時代の試行錯誤が体感できるからあまりライブラリは使わない
というか個人製作でリアルさ求め始めると血迷うのが見えている
53名前は開発中のものです。:2013/01/04(金) 12:11:35.78 ID:2zju+Vqy
素材も作りきれんからな
54名前は開発中のものです。:2013/01/04(金) 20:09:31.36 ID:1BGKtbhX
初心者です

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名前は開発中のものです。:2013/01/04(金) 20:16:03.85 ID:1BGKtbhX
ちゃんと書きます

public class Player {
public Player(int x, int y, int id) {

}
public void draw(Graphics g) {
g.drawImage(idの値によってイメージ切り替える処理);
}
}

これをJPanelを継承したクラスに自機と敵と言う形で二つインスタンス化したいです
JPanelを継承したクラスのコンストラクタでインスタンス化し、paintComponentでそれぞれdrawしています
56名前は開発中のものです。:2013/01/04(金) 21:18:20.32 ID:DZkdsCuI
見た感じ大丈夫そうだけど。。

思いつくところとしては
・画像データはちゃんと読み込まれているか
・描画位置が完全に画面の範囲外になって見えていないのでは
・画像が重なって下になった画像が見えていないのでは
→ 試しに JPanel の paintComponent で直に drawImage してみる
→ Player の draw(g) で drawImage の代わりに fillRectangle とかしてみる(setColorを忘れずに)
57名前は開発中のものです。:2013/01/05(土) 18:37:55.23 ID:7YyAinFW
MineCraftってあれJavaでつくってるんですよねJavaであんなクオリティ高いゲームつくれんだと思ったね
58名前は開発中のものです。:2013/01/06(日) 01:03:10.14 ID:TLA3zZTm
>>57
出来と言語は関係ねーぜ。
59名前は開発中のものです。:2013/01/06(日) 02:44:54.43 ID:3UF0yBuP
>>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名前は開発中のものです。:2013/01/06(日) 14:46:29.78 ID:WWISgZLW
JavaSE7からAWTとSwingが混ぜて使えるようになったってホント?
61名前は開発中のものです。:2013/01/06(日) 15:19:47.88 ID:WWISgZLW
62名前は開発中のものです。:2013/01/06(日) 17:12:28.42 ID:fwb+peuo
AWTとSwing混ぜる必要ある?

それよりもSWTとSwing混ぜて使えるようにしてほしい
63名前は開発中のものです。:2013/01/08(火) 12:22:51.60 ID:j4bi2qlI
ディプロマシー系統っていうのかわからんけど
このぐらいのゲームなら簡単に作れそうだ

ttp://clovergames.3zoku.com/game.html
64名前は開発中のものです。:2013/01/09(水) 00:13:31.24 ID:01Ag3FRy
idによって違うイメージがdrawされるってのはやりたいことは
なんとなくわかるんだけど設計としては評価しづらいな。
65名前は開発中のものです。:2013/01/09(水) 10:01:05.86 ID:+AhcB4EJ
ImageとかTextureとかSoundもってるオブジェクトをセーブするとか?
XML形式だと入らないだろうし、Serializeしてバイナリで吐いても素材分巨大化する
66名前は開発中のものです。:2013/01/10(木) 20:00:43.65 ID:Z8txJRHv
JMF使おうかと思ってたけどいまいちだな。

midiはJDKに入ってるJavaSound、MP3はこのライブラリが使いやすそう。
ttp://www.javazoom.net/mp3spi/mp3spi.html

あとは.wavが使えるものがあれば十分なはず。
67名前は開発中のものです。:2013/01/10(木) 20:17:21.39 ID:Z8txJRHv
wavはjavax.soundで普通にならせるようだ
68名前は開発中のものです。:2013/01/13(日) 12:30:28.95 ID:lTSbLWgL
swingのルックアンドフィールってsubstanceの他にいいのある?
69名前は開発中のものです。:2013/01/14(月) 19:15:31.00 ID:ZaVCszmy
>>62
>それよりもSWTとSwing混ぜて使えるようにしてほしい

謎杉。何がしたいの?

アクションにも対応できる骨格をまともに作ろうとするとawt要素が増えてくるよね
自分でレンダリングするならbufferstragegy使わないと損だし。
そしてSWT使うならダブルバッファリングするのは当然だ
何が言いたいって、awtはゲーム開発において偉大だということ。
これは低速GUIと呼ばれるSwingと対比してではない。
70名前は開発中のものです。:2013/01/14(月) 20:26:39.35 ID:7Mvy01UC
OpenGL使うならフレームワークとか使うだろうし
今更awtとかswtを直接使う人いないんじゃないの?
71名前は開発中のものです。:2013/01/15(火) 01:15:38.71 ID:MWRm0sFJ
当たり判定について教えて欲しいのですが、
壁にめり込む前に修正してやるのか、とりあえず動いてみてめり込んでいたら修正するのかどっちがいいのでしょうか
前者の場合、
(壁までの距離)<(1フレームで動ける距離)のとき、壁との距離分だけ動かす かな?
こっちのほうが何だかカッコイイ気もするけど、何か自由度が下がりそうな気がするんですよね
ただ後者は楽だけど、めり込んだ瞬間にアクション起こされた時の対策を加えないといけないですよね
72名前は開発中のものです。:2013/01/15(火) 13:28:47.99 ID:2cbm43tf
STGだろうか。。。

・全てのオブジェクトの移動前と移動後(予定)の座標を取得する
・当たり判定
・予定通り動かす or 衝突アクション

マウスでドラッグしながら塗るようなアプリ(マップエディタとか)だと
マウスの座標現在値だけでやると早くマウスを動かしたときに
ドラッグ間の線が途切れるんだよね。そんなときにもこのやり方が役に立つ。
73名前は開発中のものです。:2013/01/15(火) 21:16:07.30 ID:+k1g4zRO
>>71
どういうゲームを想定してるのか分からないけど,
俺が作ってる3D STGの場合,後者でやってるよ.
…次のフレームで本当に衝突するか分からないし.
74名前は開発中のものです。:2013/01/15(火) 22:04:46.84 ID:2cbm43tf
動きが速いとすり抜けたりしない?
7573:2013/01/16(水) 00:12:37.78 ID:FvBTwx9m
>>74
俺の場合は,衝突判定オブジェクトは球とか単純な形状のみでやってて,
例えば移動球同士の場合は,相対距離(の二乗)を
時刻tを変数とした二次方程式で表して,それを解くような感じでやってる.
なので基本的には,すり抜けはおきない.はず.(バグってなければ)
7673:2013/01/16(水) 00:22:16.17 ID:FvBTwx9m
ああ,1フレーム前と現在のフレームの位置情報を各々保持してて,
その間はそれぞれ等速直線運動をしている,という前提でね.
7771:2013/01/16(水) 02:47:44.41 ID:+L+Om9AH
作ってるのはマップチップを敷き詰めたスクロール無しの平面でのアクションゲーです
移動は上下左右斜めも可能でピクセル単位です
また一つ質問なんですが、プレイヤーの当たり判定をするポイントってどこにするべきなのでしょうか
自分はプレイヤーの中央に判定点を取っているのですがいつもグチャグチャになります

当たり判定を円のような面積?で取る方法はやったことがないです。2Dでも使えますか?
点ではなくて面積で当たり判定を取る方法・・・
ブロックのサイズから面積を計算して、プレイヤーと重なった面積が○○以上になれば当たったことにする みたいなことですか?
78名前は開発中のものです。:2013/01/16(水) 10:43:20.41 ID:U+SCJlI3
普通、2Dだと四角か円で判定とるだろ。
人の形をしたものにはキャラグラの80%ぐらいの大きさにあたる
四角形で判定とればいいし、巨大なヘビとか曲がるレーザーなら
小さい四角の判定を鎖のように繋げて判定にすればいい。
79名前は開発中のものです。:2013/01/16(水) 12:12:30.09 ID:vH/BKNi/
ヒット判定のすりぬけ問題は前もって交点検出しないとだめよ。
80名前は開発中のものです。:2013/01/17(木) 17:15:05.18 ID:+cKRqKg2
>>77
って、言うか
今どんな判定してんの?
まさかブロックの座標を総当りで判定?
81名前は開発中のものです。:2013/01/17(木) 18:33:38.80 ID:gBLtOCQt
スクリーンショットとか上げてよ
82名前は開発中のものです。:2013/01/17(木) 22:57:41.07 ID:3HVRASXD
>>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名前は開発中のものです。:2013/01/18(金) 00:06:12.20 ID:cE8dsg28
>>82
仕様に合わせた最適な判定は知らんが(仕様が分からないし)
普通は中心じゃなく四隅を判定する
右移動中なら右上、右下だけとかの省略はできるが
で、四隅をプレイヤーサイズじゃなく判定サイズにする

ブロックがこんな感じに敷き詰められてると思っての回答になるが
■ ■ ■

■ ■ ■

■ ■ ■

奇数行だから横に動けないとするんじゃなく
奇数行で右に移動中なら右側の判定x座標も奇数目になったら
めりこんだ座標分戻すってやる

斜め移動ならブロックのどの面に先に当たったかも必要になる
84名前は開発中のものです。:2013/01/18(金) 02:20:15.70 ID:YeFFrDV3
お〜こんなスレあったのか
ちょっと前にTDぽいの作ったなぁ
85名前は開発中のものです。:2013/01/18(金) 23:19:47.41 ID:OrI6e3yP
>>83
四隅を判定するのが普通なのか?物凄くソースが汚くなりそうなんだが。
普通Rectangleのintersetsみたいなのを使うんじゃないの?
86名前は開発中のものです。:2013/01/18(金) 23:22:12.80 ID:OrI6e3yP
訂正:intersectsね
87名前は開発中のものです。:2013/01/18(金) 23:46:53.86 ID:cE8dsg28
Javaは知らないからそう言う便利なのがあれば使えば良いけど
やってる事自体は変らないでしょ
升目と矩形の判定を中心一点だけではやらない
88名前は開発中のものです。:2013/01/18(金) 23:52:51.60 ID:/+2FrF0Y
>>85
当たり判定クラスを作るだけだろ。
むしろ四隅を判定しないやり方ってありえないだろ。
89名前は開発中のものです。:2013/01/18(金) 23:57:49.81 ID:/+2FrF0Y
ゲーム(マリオ)だと踏んだとか横から当たったとか
ゲーム独自の判別する必要があるし、
既存クラスライブラリに全部やってもらおうというのは無理だよ。
90名前は開発中のものです。:2013/01/19(土) 00:50:01.89 ID:yYWDydAV
>既存クラスライブラリに全部やってもらおうというのは無理だよ。

んなことわかりきってる。だが可能な限りjreに依存するべきだと思うよ。

>むしろ四隅を判定しないやり方ってありえないだろ。

全然ありえなくない。逆になぜ四隅を判定する必要があるか書いてごらんよ
91名前は開発中のものです。:2013/01/19(土) 01:39:37.12 ID:yYWDydAV
ちなみに、中心一点というかそれを基準にするのは悪くないと思う
なにより二次元における閉じた図形であれば必ず重心が一点のみ存在する訳で、これほど保守性の高い性質はない。

あと、

if(playerRectangle.intersects(blockRectangle) {
Rectangle intersection = (Rectangle) playerRectangle.createIntersection(blockRectangle);
...
...
}

で重なった矩形が取れるなんつーくっそ便利なモノ使わないと損だと思うよ。
四隅にこだわってる理由がよくわからんし、一応ここJavaスレだで。
92名前は開発中のものです。:2013/01/19(土) 01:42:43.12 ID:fS2RAsj1
>可能な限りjreに依存するべきだと思うよ。
的外れ。

>なぜ四隅を判定する必要があるか書いてごらんよ
Rectangleを使うと四隅を判定しないのか?

>>82-83の話をしてるから、そこんとこ踏まえてね。
93名前は開発中のものです。:2013/01/19(土) 01:58:37.40 ID:yYWDydAV
>>92
>>91が四隅を判定しているように見えるのか?
判定してるのは交差してるか否かだろうよ。
「だけど内部処理は・・」って?どっちが的外れなんだか。
94名前は開発中のものです。:2013/01/19(土) 02:03:27.73 ID:fS2RAsj1
>>93
プレイヤーとブロックの四隅を判定しているように見えるけど、何か違うのかな?
95名前は開発中のものです。:2013/01/19(土) 02:17:39.53 ID:fS2RAsj1
>>83(俺じゃないけど)は設計の話をしているわけで、
実装において物理エンジンでもRectangleでも
より原始的な方法(int x,y,w,h)でも好きにすればいい話。

1から10まで書かないとわからないようだな。
96名前は開発中のものです。:2013/01/19(土) 02:20:19.61 ID:yYWDydAV
A⊂Bの意味で言ってるのね。
ならなおさらBのRect使えよと言いたいが、設計の段階の話なら
>より原始的な方法(int x,y,w,h)でも好きにすればいい話。
で納得。
97名前は開発中のものです。:2013/01/19(土) 12:23:53.82 ID:DHDneNpc
単純にこんな感じでいいんじゃないの?試してないけど
マップチップを敷き詰めた状態でブロックがいちいち矩形座標持ってるとも思えないし
あと上下左右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名前は開発中のものです。:2013/01/19(土) 15:59:40.56 ID:fS2RAsj1
ブロックの大きさも一律固定だろうしな。
単純なアプリなら単純に作ったほうが工数が少なくて楽。

保守性がどうとか初心者が背伸びして粋がってるとしか思えん。
99名前は開発中のものです。:2013/01/19(土) 16:59:27.07 ID:yYWDydAV
別に俺が言ってる方法は複雑じゃないと思うんだけどな〜。(ソース量の面やAPI的にも)
「基本図形を描画するメソッドは使うな!」的な流れも確かにあったが、今は利用できるものは利用したほうが便利でシンプルに書けることに気づいてるじゃん。
Java2D使うのは初心者には無理だと思ってるならそれはバカにしすぎだと思う。

http://www.youtube.com/watch?v=Otl24e_nuyc
例えばこういうチュートリアルみてもビギナー向けの解説としてるけど?
100名前は開発中のものです。:2013/01/19(土) 17:03:50.09 ID:yYWDydAV
awt使うのは・・・に訂正。
101名前は開発中のものです。:2013/01/19(土) 18:25:25.58 ID:w/KP0xlb
なんか感じの悪いスレだな
10297:2013/01/19(土) 20:16:33.84 ID:DHDneNpc
>>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名前は開発中のものです。:2013/01/19(土) 21:38:54.76 ID:fS2RAsj1
>本当に1つ1つのブロックもRect座標を持つべきなの?

ボンバーマンなら特殊形状のマップでも
1ブロックの組み合わせに過ぎないから必要ないね。

ゲームがブロック崩しで、各ブロックの大きさや形(長方形・正方形)が
異なるなら、Rectangleが望ましい可能性が高い。
104名前は開発中のものです。:2013/01/19(土) 22:23:26.72 ID:fS2RAsj1
必要か、必要でないかはアプリケーションの仕様が決める。
オブジェクト指向設計として何が望ましいかはまた別の話。

オブジェクト指向設計としては、定数が各コードに散らばるのは良くない。
そこんとこに拘るなら、ブロッククラスにRect持たせて、
コンストラクタでRectの幅と高さを定数値に初期化すれば
定数(final int BLOCK_SIZE)を使ってる部分を隔離できる。
105名前は開発中のものです。:2013/01/19(土) 22:58:15.32 ID:DHDneNpc
そんな話だっけ?
俺は単純に>>71からの一連の質問に対して
>>85(yYWDydAV)の案は合わないなと思ってるだけだけど。
106名前は開発中のものです。:2013/01/20(日) 00:17:41.28 ID:4zHHxylz
>単純に>>71からの一連の質問に対して〜
そうだよ。質問者はアプリケーションの実現方法について聞いてる。

でも>>6 = >>59 = >>85 = yYWDydAVの話が噛み合わないのは、
目的を達成すれば、ゲームの仕様を満たせばそれでいいってわけじゃない
みたいな話を押し付けてるからだと思うんだよね。

あえて質問者を無視して「1つ1つRect座標を持つべきなの?」に答えれば
>>104みたいな話にはなる。
107名前は開発中のものです。:2013/01/20(日) 00:20:40.09 ID:4zHHxylz
まあオブジェクト指向設計とか一般論としてどうだろうと
質問者にとって良い回答をすべきだろうな。
108名前は開発中のものです。:2013/01/20(日) 02:37:11.99 ID:nh4X0/d8
>>103
誰も一つ一つにRect座標持たせるなんていってないぞい。
先読みしてぶつかる可能性があればRectangle生成するようにする。
109名前は開発中のものです。:2013/01/20(日) 04:42:00.77 ID:/X06gwxp
オブジェクトのサイズが小さくて移動速度がサイズより大きいような
場合はすり抜け対策しようねって話じゃなかったのか。
110名前は開発中のものです。:2013/01/20(日) 08:45:04.14 ID:Phml2DNM
>>108
>先読みしてぶつかる可能性
俺ならここでチェックしてしまうけどな。この先読みのソースはどんなものになるか知りたいな。

>>109
最初は単なる当り判定の話だったけど、ひょっこりすり抜けの話も加わってるね
111名前は開発中のものです。:2013/01/21(月) 01:52:02.04 ID:g1EOdFo1
ショボゲー製作中。

ttp://kie.nu/JdF
112名前は開発中のものです。:2013/01/21(月) 06:54:29.41 ID:ryBrhTVB
一度だけ実行するときとかのラッチ回路?ってどうかくのがいいんでしょうか
自分はfieldにstaticなintを初期化して、メソッドをくぐれば1にするみたいな書き方をするのですが、
fieldまで遠かったり、それだけのために用意することにためらいがあります
113名前は開発中のものです。:2013/01/21(月) 12:30:21.04 ID:g1EOdFo1
staticイニシャライザで済むなら
114名前は開発中のものです。:2013/01/22(火) 13:47:00.06 ID:f+1h22s8
やってみたが升目あるゲームならrect基準にやるのありだなと思った
むしろ全マスにrectもたせても重くはならんのと違いますかね

マス目クラスにrectを継承させる
描画は
g.fill(this)か
g.draw(this)ですむ

移動しないブロックなら
コンストラクタの引数でsetBoundsして、必要なれば描画も用意
移動するブロックなら(もちろん自キャラでも)
升目クラス描画のところでsetBoundsすれば、スレッド走ってたらレクトも動いてくれる

そしてなにより、intersectsで判定してる様子を描画すると中二病に火がつくww
115名前は開発中のものです。:2013/01/22(火) 14:07:40.54 ID:f+1h22s8
あ、もちろん画像なら画像を描画。
別に何もかもrectでやらんでいいがどうせextendsする予定のものがなければ、
継承したrectのwidthとかhight使うと良いんでない?

マップ全体が一つのオブジェクト的な設計より、1マス目事に判定が違うのだから1升目ごとをオブジェクトとみたほうがいいかも

ちなみにswing使って囲碁や将棋作るときってこの考えだよね
1升目をJComponentで作って、必要な数だけgridlayoutでしきつめる
これじゃアクションならさすがに重いからawtのrect使うと。
116名前は開発中のものです。:2013/01/22(火) 17:48:44.90 ID:RDu6P5AG
とりあえずお前等って何か作ってんの?
目的もなくあたり判定の練習とかしてもしょうがないぜ。
117名前は開発中のものです。:2013/01/22(火) 19:23:35.49 ID:J/j3awaF
やらない奴より100倍マシ
118名前は開発中のものです。:2013/01/23(水) 01:15:45.88 ID:OcjBEIOU
質問なんだけど、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名前は開発中のものです。:2013/01/23(水) 01:32:11.34 ID:7Y/TJ1Py
>>118
とりあえずstatusはenumにするとして,
あとは俺もswitch文で分けてる.
120名前は開発中のものです。:2013/01/23(水) 02:31:45.51 ID:Lru99+Rw
何だやる気のないやつしかいないのか。

>>118
ひとまずint flagとswitchで分けて、あとでストラテジーパターンに変える。
いきなりストラテジーパターンでやると無駄が出る。
121名前は開発中のものです。:2013/02/02(土) 17:38:30.08 ID:5TmS7BCD
もうダメだわw

Twitterサイバーテロ事件の原因は話題のJavaの脆弱性wwwww 今すぐアンインストールしろwwwww
http://engawa.2ch.net/test/read.cgi/poverty/1359787786/
122名前は開発中のものです。:2013/02/02(土) 19:57:25.02 ID:ho+JptWp
せやな
123名前は開発中のものです。:2013/02/02(土) 21:14:23.35 ID:w8UuMgVB
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名前は開発中のものです。:2013/02/02(土) 21:46:18.43 ID:F8+ZpjXe
Javaは危険だからインストールすらしてない
125名前は開発中のものです。:2013/02/02(土) 22:56:21.12 ID:/ZPG5ns4
スタンドアロンゲームなんだからローカルで全権限与えて実行だろ
WEBの脆弱性とか関係無いんじゃないか?
126名前は開発中のものです。:2013/02/02(土) 23:54:27.00 ID:dS7Wgo8I
>>125
彼らは馬鹿だからそういうの理解出来ないんだよ
127名前は開発中のものです。:2013/02/03(日) 00:45:51.50 ID:yvoivLaM
C/C++プログラマーのJavaのネガティブキャンペーンの一貫だな
128名前は開発中のものです。:2013/02/03(日) 01:19:45.37 ID:tR9xZRWf
>>127
全然関係ないが
129名前は開発中のものです。:2013/02/03(日) 10:21:42.46 ID:4SWakuUQ
指摘された脆弱性50個のうち40個以上はJavaアプレットの脆弱性。
ブラウザでアプレットの実行をオフにしておけばほとんど影響ない。
そもそもJavaアプレット自体すでに時代遅れの手段で、使っている
サイトはほとんどない。某回線速度測定サイトはアプレットらしいが。
130名前は開発中のものです。:2013/02/03(日) 11:15:13.91 ID:+zDTg20m
ですがアプレットもまた元気になって欲しいですね
って、このスレッドを立てておいて言うのも申し訳ないのですが
http://www.java4k.com/
なるサイトを見つけまして、アプレットx基本APIx4k縛りなんていう面白そうなコンテストを毎年やってるみたいです
しかも中々熱い
アプレットを非難する意味で立てたスレッドじゃないということだけわかってくださいまし
131名前は開発中のものです。:2013/02/03(日) 12:05:01.48 ID:UF2FAEQp
JREとインストールするとアプレットが動いてしまう事、
ブラウザでアプレットの実行をオフにしても起動する脆弱性、
これが問題になったんだろうけど、普通の人にはわけわからんわな。
132名前は開発中のものです。:2013/02/03(日) 13:31:24.07 ID:ySwMub6z
今回の脆弱性は最新版 update 13 で全部修正されていると考えていいの?
133名前は開発中のものです。:2013/02/03(日) 17:35:19.90 ID:UF2FAEQp
update 13のコントロールパネルでアプレットを動かないように指定できる。
でも一般人はそんなこと言われてもわからず、騒ぎ続ける。
C#がSilverLightを捨てたのは正解だったかもな。
134名前は開発中のものです。:2013/02/03(日) 23:55:32.89 ID:Mbh8ibVn
そもそもアプレットの話題はすれ違い
何のために>>1が重複スレともいえるこのスレを建てたか分からなくなる
135名前は開発中のものです。:2013/02/09(土) 20:55:58.67 ID:qUl0WJoZ
質問
自分でレンダリングする場合、敵だったり弾だったりのインスタンス化と描画の時差というか、タイミングはどうすればよいのですかね
原始的?な方法だと
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名前は開発中のものです。:2013/02/09(土) 22:14:33.38 ID:WpmhzhIL
質問の意味が全く分からないんだが・・・
時差って何やねん?
137名前は開発中のものです。:2013/02/09(土) 23:02:11.08 ID:Wbmgsh6G
画面外にあるものを描画することはないだろ。
あらかじめインスタンスを弾の数だけ用意しておくのは正解。
画面の外に出た弾はフラグ立てて休ませておいて使いまわすのがよい。
休みフラグの立っている弾は当たり判定と描画をしないでreturn;。

発射時に毎回インスタンスを生成するのを避けるのは
ガベコレ持ち言語でSTG作るうえでの基本。
138名前は開発中のものです。:2013/02/09(土) 23:17:25.67 ID:Wbmgsh6G
敵と敵の弾はどうだろうね。
ものすごい大群とかじゃなけりゃその都度new()+add()でいんじゃね?

どうせしょぼいもんだろうしな。
139名前は開発中のものです。:2013/02/10(日) 01:33:03.92 ID:Pq+qNEOO
>>135 でいいと思うけど
その draw がどこから呼ばれるのかちょっとだけ気になったりする
140名前は開発中のものです。:2013/02/10(日) 04:16:31.60 ID:WHx69qPW
>>136
時差というか、前者では実行した瞬間から描画されてますよね?(画面にみえてないだけで)
しかし後者はキー入力を受けてからなのでプログラムを実行した時点では描画されていないですよね?
つまり描画メソッドに条件式必要になるとおもうのですが。

>>139
drawはTekiクラスがもっているメソッドです。(オフスクリーンのBufferedImageに描画するため)
141名前は開発中のものです。:2013/02/10(日) 12:10:15.72 ID:jiG/EP1U
まずメインループがどうなってる?なんか怪しいぞ
142名前は開発中のものです。:2013/02/10(日) 12:54:26.23 ID:WHx69qPW
???
143名前は開発中のものです。:2013/02/10(日) 13:24:56.51 ID:F36VQJ9Y
>>135
玉のテクスチャと透明のテクスチャ作っといてまずそれを自由に
切り替えられるようになるべし。まあ画面外に出しといてもいいけど。
144名前は開発中のものです。:2013/02/10(日) 13:44:16.59 ID:WHx69qPW
メインループってRunnableのrun()メソッドのことかな・・・。

@Override
public void run() {

updateKey();
updateRendering();

}
みたいにキー入力をアップデイトしてからダブルバッファリングしてます
145名前は開発中のものです。:2013/02/10(日) 15:27:52.05 ID:zG3XFfdb
俺は>>137の方法でやってるなぁ.自分の弾も,敵の弾も.
発射の都度にnewしたら,たくさん撃ったときにとても処理が遅くなったし.
146名前は開発中のものです。:2013/02/10(日) 16:08:37.65 ID:WHx69qPW
>>145
確かに打つ瞬間が遅くなりますが、しかしその方法だとArrayList使う意味がないというか・・・
シューティングを例にあげたので、「初めから数を決めてnewしておく」が最善かと思いますが、
もしそのインスタンスの数がかなり多い場合を仮定すると、それはプログラム全体を重くしますよね?
それで移動だとかその他の処理の優先度を高くしたい場合致命的だと思うのです
147名前は開発中のものです。:2013/02/10(日) 16:13:08.41 ID:bN2ZkHK3
シューティングで弾が多すぎる場合はむしろ処理落ちさせた方がいいんじゃない
避けれないし
148名前は開発中のものです。:2013/02/10(日) 16:55:26.05 ID:veEgKXC1
昔はハードの都合で処理落ちしてたけど
それがむしろ迫力のある演出にもなっていたな。

>>146
メモリが枯渇すれば実行例外でアプリが強制終了。
たぶんオブジェクトを配列で100万超えたあたりから

あとメモリを確保する事自体は重さと全く関係ない。
新規確保+捨てるを繰り返すと重くなる。(捨てたものを回収するから

ならば1つのシーンとかステージの間、ずっと捨てなければ良いってのは
C#やJavaでゲーム作る際のコツ。

もし初心者でなければ、オブジェクトプールを作ればいい。
149名前は開発中のものです。:2013/02/10(日) 17:03:17.27 ID:veEgKXC1
あとArrayListでadd()したものをremove()していながら
速度がどうとかいってるのはおかしな話だと思う。

敵が1000いて、300番を1体remove()したら後ろ700体を詰めなおす処理が走るけど。
150名前は開発中のものです。:2013/02/10(日) 21:13:15.85 ID:WHx69qPW
え!remove()したほうが重くなるんですか。
151名前は開発中のものです。:2013/02/10(日) 21:43:22.70 ID:Uc/9fu94
>>150
それが中でどういう処理されてるか想像してるか?
152名前は開発中のものです。:2013/02/11(月) 18:11:27.91 ID:GJsWhCTi
Javaを使うなら少々の処理落ちには目をつぶれ
ど〜〜〜〜しても処理落ちを許せないならJavaなんか捨ててしまえ

まあ >>135 みたいなこと質問してる時点で
前者しかあるめぇ
153名前は開発中のものです。:2013/02/12(火) 20:08:58.69 ID:lS9hcN8q
そんな使い方したいならLinkedList使え
これならremove()しても軽いはず
154名前は開発中のものです。:2013/02/19(火) 23:28:13.96 ID:ZJutE4OQ
JavaFX使ってますか?
155名前は開発中のものです。:2013/02/20(水) 18:26:13.94 ID:MPmWlwS/
たま〜に使ってるけどゲーム開発には使ってませぬ
だけど8きたら使うかも
156名前は開発中のものです。:2013/03/04(月) 16:50:08.02 ID:ut1yMHRq
壁とキャラの当たり判定難しい。タイルでするなら
if (map[y][x] == 1) {
return true;
} else {
return false;
}
だけど、ピクセルなどよくわからない。
157名前は開発中のものです。:2013/03/04(月) 17:15:36.43 ID:0rLxVrMp
>>156
ピクセル単位?と思ったが恐らくエスパーすると、矩形同士の交差判定をしたいのではと思った
物理的な接触はそうだが、でも論理レベルだとそのタイルと同じことだと思うよ
…最終的にどんな内容なのか知らないが
158名前は開発中のものです。:2013/03/04(月) 18:05:20.38 ID:ut1yMHRq
すみません。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名前は開発中のものです。:2013/03/05(火) 09:33:04.36 ID:9UKwWdsd
>>158
どういう計算とか、どういう処理が必要とか、そもそも具体的にイメージ出来てるか?
つまり、そのコードの全てのタイミングで、各々どういう計算でどうなればいい、と。

例えば、そのMapクラスのスタティックメンバみたいなメソッド、それ何やってるの?
普通に書くと、単純に式書いて終わりだと思うけど、その中だとか…

何も考えずにコピペ&丸投げとかダメだよ
160名前は開発中のものです。:2013/03/05(火) 17:30:28.05 ID:vAYNDQg9
キャラクターが1ピクセル単位で動くとしても
マップの当たり判定はマス毎にあるよね?(1マス=32x32ピクセルとか)
だからキャラクターサイズ(32x32)とマスのサイズ(32x32)で
判定するのをベースに、キャラクターのピクセル単位の移動を混ぜる感じになるのでは?
161名前は開発中のものです。:2013/03/05(火) 18:07:32.87 ID:/vuQmpHV
>>159, 160
確かに、コピペなどマズかったと思います。
そのサイトやdeveloping games in javaで図を使って説明されているので、何となくは理解しているつもりです。
なぜy方向に影響が出ているのかは分かりませんが
基本的にコードはそのままで数値を変えて学んでいるので、MAPクラスもそのサイト(javaでゲーム作りますが何か?)のマリオと同じです。
ttp://aidiary.hatenablog.com/entry/20050616/1255785698
キャラがピクセルで判定がマス毎ピクセルの混じりだから?難しいです。
タイルならまだ幾分やさしいのですが、動きがカクカクなのでピクセルにしたかったからです。
162名前は開発中のものです。:2013/03/05(火) 21:58:35.97 ID:z0yFi9Ty
なんか勘違いしてるようだが、「タイルだからカクカク」で「ピクセルだから滑らか」ってのは君の思い込みだよ。
1マスごとの移動だってピクセルを基準に動かしているわけだが。
おそらくkeyPressedでフラグ立ててkeyReleasedでフラグ折って動かす場合とその判定をしないときの挙動をわかってない。
163名前は開発中のものです。:2013/03/05(火) 22:41:16.35 ID:/vuQmpHV
そうなのですか?なるほど、確かに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名前は開発中のものです。:2013/03/05(火) 23:01:22.81 ID:z0yFi9Ty
>>163
そうそれ。

君がいう「カクカク」な状態って言うのは、そのフラグ判定してるところに直接移動メソッドを書いた場合のことっだとおもう
なぜかっていうとそのkeyPressedメソッドはupdate()されていないよね
だから「押している間動かす」ということをしたければ、キープレスでフラグtrue、キーリリースでフラグfalseにしておいて
メインループに書くupdate()メソッド内で移動処理するわけ
165名前は開発中のものです。:2013/03/06(水) 18:23:56.13 ID:25OFm7+P
なるほど。
たしかに、それなら当たり判定はシンプルのままに出来そうですね。
お手本(サイトで配布されているコード)を見てもちょっと混乱してしまったので、もう一度Developing games in javaの当たり判定コードの理解を頑張りたいと思います。当たり判定って難しいです。
166名前は開発中のものです。:2013/03/09(土) 03:05:43.17 ID:LK3aqlXO
すごい簡単な話で
・移動判定はマス単位
・移動アニメーションはピクセル単位
にするだけじゃないのか?
167名前は開発中のものです。:2013/03/09(土) 03:25:33.88 ID:fdlPur7i
いやそれだけじゃないと思う
十字キー押し続けると一回入力あってから少しディレイしてから連打?みたいな挙動になるでしょ?
ようするにこれを「カクカク」した状態と表現したのだと思うよ
だからmousePressedとmouseReleasedでフラグ判定して、メインループでtrueなら移動みたいに、押している間動くようにした状態をなめらかといっているはず
168名前は開発中のものです。:2013/03/09(土) 07:39:04.60 ID:fdlPur7i
ぷよぷよ作ってるんだけど移動と回転をどう定義するといいだろうか
とりあえずやったのは

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名前は開発中のものです。:2013/03/09(土) 07:47:34.35 ID:zFoVh09F
>>166, 167,
それもあるのですが、マス(32X32)だと一歩歩くごとに32ピクセルも移動します。
ゼルダの時空の章などはもっと歩幅が小さい(1ピクセルとか?)のでマス移動だと「カクカク」してしまいます。
170名前は開発中のものです。:2013/03/09(土) 09:00:20.72 ID:P2CiH7FT
>>168
offset足した値が横とか縦を越えていないかチェックしてはじけばいいのでは。

C++の場合はオーバーランしてメモリ壊してるよ。
警告なんて出ない。
171名前は開発中のものです。:2013/03/09(土) 11:43:02.11 ID:0odFk7am
>>168
上下左右に1マスずつ広げて壁の部分もフィールドの一部ということにするのが簡単かと
ちなみにあれ実はフィールドの最上部に見えないけどぷよの置ける部分が存在するから縦は13段だよ
172名前は開発中のものです。:2013/03/10(日) 00:01:43.20 ID:KiVYlmzQ
>>170
>offset足した値が横とか縦を越えていないかチェックしてはじけばいいのでは。

これ、自分も考えたんだけど、そのチェックに加えてpuyo配列自体の1の部分も1列横にシフトとかそういう面倒な操作いるよね・・
だから投げそうになったんだ

>>171
なるほど。だけどそれでもかなり大変なコードになりそうだ・・・。見えているゲーム領域の左上とfield[0][0]が対応しなくなるよねきっと。

やっぱC言語ちっくなpuyoをint型にするような設計はよくないのかな。
fieldの値を基準にpuyoを描画するんじゃなくて、Puyoクラスを作って独立させて描画させるべきか。
でもfieldの状態を更新するのが難しくなりそう・・・
173名前は開発中のものです。:2013/03/10(日) 06:42:22.32 ID:QFv44VdC
質問。
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名前は開発中のものです。:2013/03/10(日) 07:15:40.28 ID:G1JW1DEQ
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名前は開発中のものです。:2013/03/10(日) 08:53:11.38 ID:QFv44VdC
解決しました。
ボールのdraw()にマップスクロール時の座標を書き入れていなかったらかでした。
176名前は開発中のものです。:2013/03/10(日) 20:29:07.98 ID:QFv44VdC
ボール発射時:左に向いていたら ー> 左へボール飛んでいく 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名前は開発中のものです。:2013/03/10(日) 21:25:31.59 ID:G1JW1DEQ
初心者以前に馬鹿じゃねえの。
例外のスタックトレースも読めないとか池沼か。
178名前は開発中のものです。:2013/03/10(日) 22:04:44.96 ID:pLC1ThRb
javaでRPGをつくりたいのだが、画像の素材は、どこかにかありませんかな
gif,pngの32x32の画像がいい
unityってゲームつくりには役に立つ?
179名前は開発中のものです。:2013/03/10(日) 23:16:48.90 ID:G1JW1DEQ
そうかもしれないし、そうじゃないかもしれない。
180名前は開発中のものです。:2013/03/10(日) 23:19:48.97 ID:nHCM+efj
ツクール素材でもググってみれば
181名前は開発中のものです。:2013/03/13(水) 21:25:47.68 ID:XNwjXgJc
javaをやっていると体にわるいな
過労死、鬱病、倒れそうだ
182名前は開発中のものです。:2013/03/13(水) 22:20:25.22 ID:WmJDWgdc
javaに関する本を何冊持っていますか?
Javaの本高くて困ります
今の時代amazonがあるから助かっているけどそれでも本代はかさむ
このデフレ時代、値段が下がらなかったのは本と税金、社会保障費ですかね
183名前は開発中のものです。:2013/03/13(水) 22:45:21.50 ID:NdWAfqh4
良い本知ってるがこれでは教える気にならんな
184名前は開発中のものです。:2013/03/14(木) 01:08:10.88 ID:nocQ9en/
>>182
とりあえず三冊かな
185名前は開発中のものです。:2013/03/14(木) 01:50:02.10 ID:yH7ud9UQ
ほとんどネットで十分だからな。
結城のデザインパターンとか役にたたないし、
パーフェクトJavaとサーブレット関連、アンドロイド関連で合計3冊あれば良いだろう。
186名前は開発中のものです。:2013/03/24(日) 02:38:51.86 ID:ua68AVRh
ゲームはC++がメイン?
JAVAはサーバーに使われるのがメインですか?
187名前は開発中のものです。:2013/03/24(日) 04:27:20.54 ID:crOzGDtU
そうかもしれないし、そうじゃないかもしれない。
188名前は開発中のものです。:2013/03/24(日) 07:28:35.65 ID:dL5F+tAI
初めJavaでゲーム作るのが難しく感じたけど今やC++よりやりやすく感じる俺は。
やっぱC++はGUIが面白くないしわざわざWINAPI弄ろうという気にもならないしモチベ下がる
あとクラスに分けてちゃんと作っていこうとするとJavaのほうが管理しやすいから好きだ
189名前は開発中のものです。:2013/03/24(日) 21:13:37.97 ID:wYx6jnbT
>>188
それってJavaが良いわけじゃなくて、Swingとかの
GUIライブラリとか良いってだけじゃん
C++だってクロスプラットフォームのGUIライブラリはあるだろ?
この部分は別にJavaならではって感じがしない
190名前は開発中のものです。:2013/03/25(月) 07:26:50.10 ID:Qbfd/Wlz
>>189
いや、そこがでかいんだと思う
同じ「ライブラリ」という概念でもJavaのそれとC++のそれではまるで違うと思う
VC++でライブラリ登録するのだるすぎるし
191名前は開発中のものです。:2013/03/25(月) 22:48:08.00 ID:+DXzcTUj
マインクラフトみたいなゲームを作りたい。2Dで。
ttps://s3.amazonaws.com/ld48/ld22/index.html
今、プレイヤーとマップは一応出来ている。
プレイヤーに攻撃値を持たせて、壊せるオブジェクト(敵も含める)に耐久値を設定する。
耐久値が0になったら決まったアイテムを落とす。
仮にオブジェがいっぱいあったとして、毎回一個ずつ確認していくのは何か変だ。
こんなゲームを作るときはどうしてます?
192名前は開発中のものです。:2013/03/25(月) 23:28:51.88 ID:7w1M9Wru
何を確認すんの?
193名前は開発中のものです。:2013/03/25(月) 23:33:00.13 ID:e+5SoecM
kdツリーとかRツリーとかオクツリーとかBSPとかそのへんじゃない
194名前は開発中のものです。:2013/03/26(火) 02:48:42.95 ID:IUgsCEv1
超巨大な一枚マップを8x8分割とかして、各区画オブジェクトがそこにいる
全ての人物などの参照をもっていれば良い。
それでプレイヤーのいる区画以外の全てのオブジェクトを無視できる。
195名前は開発中のものです。:2013/03/26(火) 06:29:02.73 ID:CLcgDKur
二分岐探索や二分ヒープ木はhaskellですこし触ったことがある程度。
色々な木を勉強します。
>> 194
もう少し詳しく教えてもらえないでしょうか?
マップを分割することによってオブジェクトの状態検査の数が減るー>メモリ節約?
もしくは、画面に映っているヤツら(プレイヤーからの距離計算で出す)
だけ判定に渡す。<-結局全てのモノを判定しているからボツ?
196名前は開発中のものです。:2013/03/26(火) 10:09:24.68 ID:l0lOFTp+
197名前は開発中のものです。:2013/03/26(火) 14:17:30.58 ID:IUgsCEv1
>>195
あなたの文章がおかしくて推測に苦労しますが、
例えば巨大マップ上に数万のキャラクターがいて、
forループで全部更新するのが重いという話でしょう?

画面外の、それまた遠くにいるようなのが完全に停止していても良いとか、
ゲームの内容しだいで条件もかわるわけで、なんともいえませんなー。
198名前は開発中のものです。:2013/03/27(水) 07:28:58.94 ID:f6Hx9aPx
そうです。
ま〜マインクラフトやゼルダの伝説時空の章などは画面外では完全に停止していると思います。
それで、
敵やオブジェクトが画面内に入った時だけ動くだとうと推測しているノですが。
199名前は開発中のものです。:2013/03/27(水) 19:51:56.53 ID:4U1a8RUn
マップが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名前は開発中のものです。:2013/03/27(水) 21:37:10.40 ID:f6Hx9aPx
おお。すごい!
こんなに丁寧に書いていただきありがとうございます。
これだと、quadtreeを使わなくて済みそうかな?
よし、これで頑張ってみようと思います。
201名前は開発中のものです。:2013/03/29(金) 14:13:20.69 ID:ygLK74i7
ゲームボーイの”くにおくん”の様に攻撃ボタンを押した時だけ
キャラの横(キャラの向き)に攻撃画像が表示される。
そしてもし敵がその範囲内であれば敵がダメージを受けるような事をしたいです。
インベーダーの様に弾に攻撃オブジェをいっぱい最初に作って画面外に置いて、
攻撃が呼ばれるたびにそれを取り出す方法ぐらいしか分からないです。
本来?はどうやればいいのでしょうか?
202名前は開発中のものです。:2013/03/30(土) 22:57:51.86 ID:ecRAb5Av
>>200の人だろうか。まあがんばれよ。
203名前は開発中のものです。:2013/03/31(日) 08:56:54.87 ID:C9rWy5ii
自分はまだ199で教えてもらったのを勉強してるところですが.
は〜、早くマインクラフトやゼルダみたいなの作りたい。
204名前は開発中のものです。:2013/04/01(月) 10:34:18.32 ID:kEB/FLx8
Java3Dってなんでこんなに人気ないの・・・
205名前は開発中のものです。:2013/04/01(月) 17:27:30.15 ID:rGhu5lL8
みんなjavaの基礎文法を習得するだけで疲れるじゃないの?
3DってopenGL,unityがあるからじゃないのか?
206名前は開発中のものです。:2013/04/01(月) 19:25:16.71 ID:VcD7kLeu
>>204 本気で3Dで色々したいとJavaで頑張る理由が無くて、
むしろJavaで作るのはいろんなデメリットを請け負うから。

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



まぁ、単純にJavaなら簡単そうで入ってきた人達が、
3Dをやろうとした途端、とんでもない壁にぶつかって、
その中でやる気のある人はC++なりに行き、そうで無い人はやめた。
って感じがするけどね。
207名前は開発中のものです。:2013/04/01(月) 20:31:04.88 ID:8P8EUzuA
脇からだけど2Dもどき程度にJava3DやOpenGL使おうって場合はどうかな。
208名前は開発中のものです。:2013/04/01(月) 22:04:45.67 ID:/CRE6+rF
C#でSlimDXとかやってる人も少ないと思う。
Java3DやJOGLよりLWJGLのほうが海外だと主流みたいだよ。

英語がダメで日本語情報源にしがみつきたいならUnityが良いだろう。
209名前は開発中のものです。:2013/04/02(火) 07:16:54.12 ID:aeIJC38X
lwjgl+slick2dが楽で良い
210名前は開発中のものです。:2013/04/02(火) 09:56:30.01 ID:NVgqGr2P
>>205-209
なるほどありがとう
211名前は開発中のものです。:2013/04/15(月) 19:17:38.68 ID:UO+MIpzy
組み込みスクリプトにサンドボックスを設定して
ユーザが安全にアドオンを作れるようにしたい
何か良いフレームワークはある?

参考
http://ja.softuses.com/15490
212名前は開発中のものです。:2013/04/15(月) 20:07:38.56 ID:OCp/UaRz
lwjgl+slick2dほんとに英語しか資料がないからハードルめちゃ高い
日本語の情報なんか個人が作ったブログみたいなの頼りにするしかないもんな
書籍とかいいのあったら教えてほしいわ(日本語の)
213名前は開発中のものです。:2013/04/15(月) 21:18:59.55 ID:81X1iHjQ
少なくとも書籍があるんなら見つけてると思うぞ。

ちょいと気になったんだけどJOGL、Java3D、lwjgl、slick2D、遊ぶ側の導入が楽なのはどれ?
全部楽だよってなら気にする必要はないけど地味に重要な気がする。
214名前は開発中のものです。:2013/04/15(月) 22:12:25.73 ID:OxLvLhMT
遊ぶ側ならJVMさえインスコしてあればどれも同じじゃねーの
215名前は開発中のものです。:2013/04/16(火) 14:57:09.19 ID:kYWnrLY4
slick2Dはlwjglのラッパーだからlwjgl同梱必須だよ
アプレットで動かさなければどれも同じ
216名前は開発中のものです。:2013/04/16(火) 18:28:14.08 ID:cWQohAwT
もしかしてJVM+配布側の配慮で全部OKなのか。
217名前は開発中のものです。:2013/06/04(火) 20:52:20.90 ID:4z/LrXQA
質問があります。よくゲームフィールドを定義するのに

private int[][] map = new [12][24];
のような二次元配列を用意し、

二つのfor文の中で
switch(map[j][i]) {
218名前は開発中のものです。:2013/06/04(火) 22:50:24.24 ID:h/v7VZKU
}
219名前は開発中のものです。:2013/06/05(水) 00:24:25.51 ID:JVViz8+I
おい
220名前は開発中のものです。:2013/06/05(水) 02:25:23.16 ID:iKNZD4WR
質問
MouseMostionListenerのmouseDragged(MouseEvent e)に関して、
e.getX(), e.getY()で得られる値はどうやらドラッグ開始した地点の座標?
故にドラッグ中マウス移動しててもカレントのマウス座標が得られなくて困った

加えてドラッグ中はmouseMove(MouseEvent e)メソッドのほうのそれらも座標が更新されない(当然?)
e.getXOnScreen()なるメソッドはドラッグ中も更新されるのだけれど、スクリーン基準の座標はどうも扱いづらいしバグを生みそうでできれば避けたい
何か良い方法ないですかね?
221220:2013/06/09(日) 16:03:16.49 ID:k71SnmVJ
Swingがシングルスレッドなのが原因かもしれない
ドラッグ中は処理が止まって離すときにそれぞれ更新される?
素直に自前でスレッド用意することにします
222176:2013/06/28(金) 12:42:09.96 ID:U3hHRtQl!
うおぉ〜漸く球がキャラの向いている方へ発射されるようになった。
長かった。
223名前は開発中のものです。:2013/07/05(金) NY:AN:NY.AN ID:p077YvOc
ボンバーマンの爆弾のアルゴリズムってどうすればわかりやすいですかね
爆弾を置くのはボンバーマンだから、ボタン押したときに
ボンバーマンが爆弾クラスをnewする設計でいいのかな
すると、Factoryパターン?

そんなことするより所持可能な最大ボム数(8だっけ?)を、
どのキャラも初めからnewしてリスト登録しておくべきか

・爆弾が時間に左右されること
・爆発の連鎖があること
・後から表示された爆発が先に爆発する可能性があること

この辺りがゲームプログラミング初心者の自分には難しいです
224名前は開発中のものです。:2013/07/05(金) NY:AN:NY.AN ID:RaygrmWM
最初はメインプログラムに全て詰め込んで後々再利用出来そうな処理だけ他クラスで良いんじゃね
225名前は開発中のものです。:2013/07/11(木) NY:AN:NY.AN ID:YrFP7L1n
>>130のサイトのマリオカート凄いな
自分の自作ゲームは数十倍もサイズがでかいのに何百倍もクオリティが低くて少し凹む
226名前は開発中のものです。:2013/07/14(日) NY:AN:NY.AN ID:xl2VX9QI
かいじょかいじょ
227名前は開発中のものです。:2013/07/14(日) NY:AN:NY.AN ID:xl2VX9QI
おお〜やっと規制解除された!
228名前は開発中のものです。:2013/08/06(火) NY:AN:NY.AN ID:tPkwuHiT
oggをツクールみたいにループ再生したいんだけど、コメントをどうやって取得すればいいのかわからん
229名前は開発中のものです。:2013/08/16(金) NY:AN:NY.AN ID:w8E+MSLB
よかったじゃん
230名前は開発中のものです。:2013/08/24(土) NY:AN:NY.AN ID:+f+kX8MI
jnlp を置いたディレクトリの絶対パスが日本語文字を含んでいたら動作しなかった
なんてこった。配布するとき困る
231名前は開発中のものです。:2013/09/14(土) 14:10:40.99 ID:cy1XSJ6p
drawImage とかで指定する ImageObserver って何の意味がありますか?
自分いつも null にしてます。というか this とか指定すると変になりました
232名前は開発中のものです。:2013/09/14(土) 15:16:45.85 ID:cy1XSJ6p
AffineTransform で混乱する…
「座標系」を変換するのか、「座標」を変換するのか
右手系なのか、左手系なのか
どうもはっきりしない
233名前は開発中のものです。:2013/09/14(土) 15:38:41.06 ID:zONL1qkf
通常nullだってどっかで読んだ
多分非同期読み込みとかに使うんじゃない
234名前は開発中のものです。:2013/09/14(土) 18:11:37.03 ID:cy1XSJ6p
>>233
サンクス。null で良かったか
235名前は開発中のものです。:2013/09/14(土) 19:31:47.44 ID:GBbBS2U3
Image をネットワークから読み込んでいる場合、まだダウンロードが完了しておらず、画像を表示できない場合がある
そのような場合に ImageObserver を指定しておくと、読み込みが完了したタイミングを知ることができる
そのタイミングで、例えば、読み込み完了した画像を改めて表示し直すことができる
闇雲に this を指定すれば何か役に立つというわけではない
236名前は開発中のものです。:2013/09/14(土) 22:22:34.81 ID:cy1XSJ6p
>>235
なるほどっす。
Swingのイベントディスパッチスレッドから呼び出されるわけじゃないのかな?
Swingコンポーネント上でImage使ってる時は注意が必要かも
237名前は開発中のものです。:2013/09/15(日) 20:30:00.65 ID:cXwe4017
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名前は開発中のものです。:2013/09/19(木) 14:57:32.91 ID:teJIpav3
.classファイルをバイナリエディタで見ると、先頭に

cafe babe

っていうマジックナンバーが見える。凝ってるな
239名前は開発中のものです。:2013/09/27(金) 00:44:08.10 ID:FOeLnzNv
>>238
あー
よく知らないが、Java開発者達の近所にあった喫茶店だそうだ。
240名前は開発中のものです。:2013/09/28(土) 02:14:26.45 ID:1G2ugWm1
javaがコーヒーブランド、cafeはコーヒー、+babeって説が一般的だけど諸説あるな。
babeってマジックナンバーは昔はたまに使ってたし。
241名前は開発中のものです。:2013/09/29(日) 17:08:46.52 ID:kgbSHSbg
javaでゲームって「now loading」のどさくさで(full)GC強制したくならない?
242名前は開発中のものです。:2013/10/09(水) 22:56:30.33 ID:JeIpUTuA
ざっとぐぐったらfullGCが呼ばれる処理を呼びだすことで間接的に可能っぽいねぇ

ここスタンドアローンってスレタイにあるけど
gcjに関する情報とかないでしょうか?

ゲームでgcj使ってる情報が少なくて、ライブラリ関係をどう扱えば良いのかがわからない・・・
特にライセンスがなんともよくわからない
243名前は開発中のものです。:2013/10/10(木) 01:21:00.33 ID:rWd2dlNb
>>242
ライセンスはクラスパス例外のないGPLだから成果物もGPLになる。
ライブラリのリンクは元がnativeだとgcjが対応してない部分はリンクに失敗する。
これだけじゃん。いまでもwin用にはクロスコンパイルが必要かは知らん。

それよりgcjがAOTコンパイルしたバイナリよりjavaのJITコンパイルの方が早いからゲームには使いどころないと思うよ。
244名前は開発中のものです。:2013/10/24(木) 17:20:16.75 ID:BIU10uO4
>>243
亀だけどありがとう、JITってそこまで進化してたんですね
245名前は開発中のものです。:2013/10/24(木) 23:21:24.86 ID:HkVOqNBP
javaのJITコンパイラはキャッシュミスして脱最適化しても次の直近のタイミングで
別の最適化されてまたキャッシュされたりするしコンパイル時間かけてでも効率重視だから結構速いよ。
GCとかヒープのデカさが超ネックになってるから全体ではチューニングせんとパフォーマンスでないけど。
246名前は開発中のものです。:2013/11/02(土) 21:57:26.98 ID:wzULkq5O
Javaっておいしい?
247名前は開発中のものです。:2013/11/03(日) 08:19:18.45 ID:h3H0javF
初恋の味
248名前は開発中のものです。:2013/12/08(日) 20:51:14.66 ID:K3VE5nXT
テトリス+ぷよぷよ作ったよ

http://kie.nu/1x45
249名前は開発中のものです。:2013/12/08(日) 20:52:04.42 ID:K3VE5nXT
あげ
250名前は開発中のものです。:2013/12/21(土) 23:50:19.82 ID:iQvUwIgS
Slickライブラリでゲームを作ってますが、
どこか参考になるページなどありますか?
ライブラリやyoutubeのチュートリアルを見て実際に動かしていますが、
使い方がイマイチわかりません。
251名前は開発中のものです。:2013/12/23(月) 02:52:57.10 ID:o56P3+7D
サンプルコードが入ってるだろ
javadocとそれで分からないことだったら外人に聞いたほうが早いよ
252名前は開発中のものです。:2013/12/26(木) 00:14:49.70 ID:dQLQT8i8
>>206
JOGLでゲーム作ろうとしている俺涙目
253名前は開発中のものです。:2013/12/26(木) 00:33:50.91 ID:Vr4Op8xr
>>252
Minecraftでもやって自信出せ
Javaでも十分3Dゲームは作れるよ

ただ、やっぱりJavaでゲームっていうのはPC向けオンリーになっちゃうけどな
だけど任天堂とかPS、XboxがJavaVMのせてくれたら最強言語はJavaになると思うけどね俺は
254名前は開発中のものです。:2013/12/26(木) 02:49:04.09 ID:ERqude5/
2Dゲーム製作の勉強がてらにJavaでゲーム作ってるけど
CPUがAMDのE-300で非力マシンなのに60フレームで640*480をヌルヌル描画出来て凄いわ。
これだけパフォーマンスあれば80〜90年代の2Dアーケード程度のゲームは
企画力とゲームデザイン能力があれば楽勝で作れそうだ。
ちなみに今のところゲーム用フレームワークは使わずに自力で擬似スプライトとか
衝突判定機能を作ってる。
ゲームパッドはフリーウェアさんが作った物で普通に使えてる。
とりあえずJavaで1本完成したらPlayStationMobileかiPadとかに移植しようと思う。
255名前は開発中のものです。:2013/12/26(木) 02:54:26.64 ID:dQLQT8i8
>>254
2Dゲームを作るには、純正Swingだけでもかなり使いやすいよね
困るのは加算半透明が難しいことくらいか
256名前は開発中のものです。:2013/12/26(木) 17:13:59.78 ID:fCfxjEwL
Swingはキーボードのボタン全部取れないのが嫌だわ
なんかいい方法ある?
257名前は開発中のものです。:2013/12/26(木) 20:09:22.25 ID:IHbxv94i
なんでみんなSwing使うんだ
AWTだけじゃいかんの?
258名前は開発中のものです。:2013/12/26(木) 20:18:57.03 ID:yA5nEDHu
>>250
Slickってまだサポートされてる感じですか?
>>254見て思ったんだけど、Javaでゲームパッド入力取りたいときって
Slickみたいなの使うのがラクかな?

>>257
AWTわからないんだけど、GUI使わずにJava2Dで描画するだけなら
AWTもSwingも一緒なんですかね?

あと、J「avaFXならJava2Dと違って描画にネイティブな機能使ってる」ってどこかで見たんだけど
Java2DのGraphicsクラスなんかもネイティブの機能使ってるんだよね?
259名前は開発中のものです。:2013/12/26(木) 21:00:03.90 ID:fCfxjEwL
>>258
>パッド
たしかslickが内部で使ってるDirectInputのラッパー
row_input(だっけ)を使うかもっと高水準のライブラリを拾って来たいところ。

>AWT/Swing
ネイティブって普通はJNAで実装してるのかって意味になると思うが
エスパーするとDirect3D/OpenGLだよね?

Direct3D/OpenGLでは三角ポリゴンのテクスチャしか描画できない。
なのにJava/Graphics2Dで自由に図形描いたりできるということは
ソフトウェアレンダリングしてるから。

だから同じようにDirect3Dを内部で使っても
例えばDXライブラリとかより圧倒的に遅いんじゃないかな。
260名前は開発中のものです。:2013/12/26(木) 21:08:06.74 ID:cBobrvWL
クリックして進めるゲームはGUI使うもんだよね?
でもGUI途中で追加したりするのが難しいからマウスの反応拾ってやるべきなのかなあ
261名前は開発中のものです。:2013/12/26(木) 22:15:54.82 ID:fCfxjEwL
例えばslickのフォーラムで見かけた話題だと、
「slickとswing GUIを組み合わせられるのか」という質問に対して
「簡単にできるけどswingの遅い描画と歩調を合わせてOpenGLが描画するから
OpenGLの速度がでなくなる。非推奨だよ」という回答があった。

一応slickにはOpenGLを使った自作ボタンを作る仕組みがあるのだが
JScrollPaneのOpenGL版などは用意されておらず、UI作るのは面倒。

そういったことがあるから、俺は結局swingだけでしょぼいゲーム作ってる。
262名前は開発中のものです。:2013/12/26(木) 23:44:15.36 ID:Ct7GHZvi
TWL - Themable Widget Library
http://twl.l33tlabs.org/

こんなんあるけどどうよ
263名前は開発中のものです。:2013/12/27(金) 00:42:06.83 ID:xQKugg9x
そういや、JOGL使ってるとウインドウサイズを激しく動かした時とかにinitが呼ばれてしまうんだが、
そういうときってVRAMが初期化されるんだろうか。

VBO登録しなおしはともかくとして、シェーダーのコンパイルとかもやり直しになるのはけっこうストレスになるなあ…
264名前は開発中のものです。:2013/12/27(金) 02:02:34.89 ID:RcX+Zbl3
なにそれDirect3D9/OpenGLでいうデバイスロストなら
フルスクリーン・ウィンドウモードの変更で起きるかもしれんが
Javaのせいじゃないぞ。
265名前は開発中のものです。:2013/12/27(金) 05:17:41.48 ID:P+1BALO6
>>258
ゲームパッドは
ttp://www.ayamenet.com/app/index.html
の人が作られたJInputというのを利用してますが
サンプルもあるので簡単に組み込めてイベント取得も簡単でした。

今日の作業でフルスクリーンで動かした時に処理に余裕があるのに
画面のコマ落ちが酷かったのが疑問だったけど、
DisplayModeのリフレッシュレートをDisplayMode.REFRESH_RATE_UNKNOWN
にしてたのが悪かったようだ、60にしたら
ヌルヌル動く様になった。
266258:2013/12/27(金) 12:06:33.28 ID:x+/UZ836
>>259 >>265
ありがとう〜。
ドキュメント読んでみます。
267名前は開発中のものです。:2013/12/27(金) 17:00:30.44 ID:iL78j3sI
JInputって同名の海外のもあるよね
そっちはWindows以外にも対応してる
268名前は開発中のものです。:2013/12/28(土) 14:10:21.89 ID:os0Do0OO
>>253
>任天堂とかPS、XboxがJavaVMのせてくれたら最強言語はJavaになると思うけどね俺は
Unity経由でC#がそれに近くなるのはありそう
269名前は開発中のものです。:2014/01/01(水) 00:57:35.76 ID:bSKouUWX
Javaは実用性が高くてフリーのネイティブコンパイラがあると相当に使いやすくなるんだけどね。
GCJだとまだ完成度に難があるし、完成度が結構高いExcelsiorJETは、ホビープログラマが個人で買うような値段じゃない。
270名前は開発中のものです。:2014/01/01(水) 22:00:44.61 ID:bSKouUWX
ん、ノートPCのIntel HDG4000だと、GLSLでウィンドウの大きさが変わったreshape()の時に
VRAMが破壊されているにも関わらずinit()を呼んでくれないみたい。

IntelはOpenGL対応が弱いと言われてるけど、これはOpenGL対応の問題なのかGLSLとの相性なのか良く分からんな…
271名前は開発中のものです。:2014/01/01(水) 23:33:21.62 ID:TDYNLr8C
直にOpenGL書いてる?

SlickとかEasyWayで適当にウィンドウとスプライト貼って試してみたら?
それでOpenGLの使い方が間違っているのかハードウェアやランタイムの問題か
わかるでしょ。
http://www.jroller.com/bantunes/entry/java_game_engines_and_frameworks
272名前は開発中のものです。:2014/01/01(水) 23:52:05.83 ID:bSKouUWX
>>271
昔GL2で書いたコードを動かしたら普通に動いたので、GL3以降を使うと問題があるっぽい様子…
というかシェーダー関係なのかなあ…

自宅のGF560では問題なく動いてたコードなんで、ちょっと悩んでる。
帰省中に最近のOpenGLを勉強しようと思ったら、思わぬところでよく分からん事象に遭遇した。
273名前は開発中のものです。:2014/01/03(金) 23:20:28.78 ID:1Q3FtKvn
そもそもopenglのポーティングは何使ってんの?
274270:2014/01/04(土) 00:05:52.26 ID:ZD/ROmwt
>>272
JOGLです。
>>270でGLSLって書いてるのはJOGLって書こうと思って脳と指がずれてた。

ウェブ情報を参考にVAOを使ったサンプルコードを作ってみたんだけど、
最初の一回は正常に描画できて、2回目以降の描画ではプリミティブが描画されず、
背景色で塗りつぶされてしまう。
VAOを使わないでVBOで描画すると問題ない様子。
275名前は開発中のものです。:2014/01/04(土) 01:52:37.37 ID:4Kus4sgx
関係有るかわからないけどJOGLはバージョン変わるたびに激変してるからwebの情報は古いよ。
自分で変更点追うしかない。
276270:2014/01/04(土) 22:43:55.31 ID:ZD/ROmwt
原因が分かったので報告。
VAOを使って描画した後、
glBindVertexArray(0)
を呼んでバインドを外してなかった。

GPUによって、それでも動作する場合と動作がおかしくなってしまう場合があるみたい。
277名前は開発中のものです。:2014/01/05(日) 17:57:44.52 ID:Mpn6RVWq
オブジェクト化されたOpenGL APIの規格ができるとゲーム作りなんかは随分楽になりそうだが、
そういうのはもっと上位のフレームワークでやれってスタンスなんだろうな
278名前は開発中のものです。:2014/01/05(日) 18:15:21.07 ID:cB3+M9N2
インスタンスつくってメソッド呼んでーって感じにしたらってこと?
279名前は開発中のものです。:2014/01/05(日) 18:33:29.28 ID:Mpn6RVWq
>>278
そうそう、VAOとかVBOとかがオブジェクトになる感じ
280名前は開発中のものです。:2014/01/05(日) 18:45:24.60 ID:cB3+M9N2
>>279
確かに便利だけどそれやると言語によってはAPIにアクセスできなくなってしまうよ
281名前は開発中のものです。:2014/01/05(日) 19:01:50.30 ID:Mpn6RVWq
>>280
理想は、C言語(またはもっと低級な言語)を前提としたOpenGLと
JavaやC#やJavascripstを前提にしたOpenGL++の二本立てになるとありがたい
WindowsAPIとかもそんな感じになってなかったっけ?

とはいえ、Cからドライバにアクセスするための関数は容易に作れるけど、
オブジェクト指向言語のAPIとなるとそうはいかんからなあ…
282名前は開発中のものです。:2014/01/05(日) 19:12:09.46 ID:cB3+M9N2
>>281
WindowsAPIはよく知らないけど違う気がする
.Netのことかな?

独自に「オブジェクト化」を試みてるプロジェクトならいくつかあるみたいだよ
自分が知ってるのだとOGLplusとか
283名前は開発中のものです。:2014/01/05(日) 23:01:14.37 ID:xXQO5mvS
JavaFXでUSBゲームパッドの入力取りたくて、今JInputの>>267の方の海外版を
試してみてるんだけどやっぱ日本語情報ってないよね?
更新もかなり頻繁だし、フォーラムも賑わってるのに公式の
Getting Startedが2007年だからなんとも不安
284名前は開発中のものです。:2014/01/09(木) 02:04:38.73 ID:X+lgFy1k
>>283
キーボードやマウスはもっと前から安定しているだろうし、
DirectX(Input)は8で更新終了。XBOX(XInput)に対応しなければ
更新する必要もないんじゃない?
285名前は開発中のものです。:2014/01/11(土) 23:48:00.80 ID:xr3zgGUx
>>284
なるほど〜、サンクス


Slick使ってると、Ubuntuで実行したとき書き込み可能テクスチャいじってるとXlib関係のエラーが出て、
内容としては、Xシステムに複数のスレッドからアクセスすんな!みたいなのなんだけど、
mainだけのシングルスレッドで試しても起きるんだよね・・・。似たような経験した人いますか?

いろいろ試した感じだと、テクスチャの解放が終わらない内に次のテクスチャ生成すると起きるんだけど、
ライブラリ側でそういう風に出来てる以上、Sleep挟むくらいしか対処法ないのかな?
286名前は開発中のものです。:2014/01/12(日) 19:57:33.93 ID:XBDcFGBU
いってる意味分からん

Texture.release()を呼んでも直ちに開放されないってこと?
287名前は開発中のものです。:2014/01/17(金) 23:03:46.53 ID:Wfv0W6gk
>>286
意味というか自分も原因がよくわかってないですね・・・
普通に使っててエラーが出るといいますか、Windowsだとエラーにならないのですが
288名前は開発中のものです。:2014/01/21(火) 13:21:22.15 ID:HN69Ellt
前からちょくちょくlinuxでopenGLの挙動がおかしいとか書いてる人?
そんなことばかりしてたら何も作れず時間ばかり無駄にしてしまうぞ
289名前は開発中のものです。:2014/01/22(水) 02:34:00.21 ID:4/7cpvbC
それでなくても最近のOpenGLは難しいしな。
「久しぶりにゲームとか作りたいなあ。やっぱり漢ならエンジンから自作だぜ!」
と調子に乗ってたら、フォンシェーディングされた三角形をくるくる回すだけで2週間かかったぜ…

glBeginってなんだかんだで便利だったんだな
290名前は開発中のものです。:2014/01/22(水) 18:40:13.65 ID:wHmsrBK5
矢印キーの押下状態を使いたいのですが
キーが離されたときには必ず key released イベントが発行されると考えて大丈夫でしょうか?

例えば処理がビジーになってるときでも、イベントが取りこぼされたりスキップされたり
しないで、遅れてでも必ずイベントハンドラを呼んでもらえると保証しても大丈夫でしょうか?

キーを離しているのに押しっぱなしと認識されてしまうと困るので
お願いします
291名前は開発中のものです。:2014/01/22(水) 19:25:26.73 ID:Oq+LUbbM
処理がビジーなら何を使うにしてもイベントは取りこぼすだろ
そんなことより、そんなにkeyreleasedの取りこぼしが気になるなら「keydownが連続で2回発生したらどうするか」という考え方で対処したほうが無難
292名前は開発中のものです。:2014/01/23(木) 00:40:49.49 ID:zd7YqPgB
うう、そうか…キューにためておいてくれて必ずイベント発生してくれると期待していた

コードは
boolean up, down, left. right;

if( ↑キー押下 ) up = true;
if( ↑キー離す ) up = false;
なので、
key release を取りこぼした時点で失敗していて、
後から key down が2回発生したことを検出しても時すでに遅しなんです
293名前は開発中のものです。:2014/01/23(木) 00:53:30.22 ID:hfja1pt3
あれ、キューに溜まらないんだっけ?
特に意識してなかったけどなんか不安になったからウインドウのフォーカス判定見直しておこう
294名前は開発中のものです。:2014/01/23(木) 01:01:38.27 ID:y0vYWKn+
なんの話だろう?swingからdirect inputしかわからんが、
全てのキーの状態を毎フレーム取得して、前回と今回のデータから
判断するのが基本だよ

swingのKeyListenerはそのへん致命的やな
295名前は開発中のものです。:2014/02/12(水) 01:02:51.34 ID:9PrO8hR2
Slick2D使ってちょっとしたゲーム作ってる
296名前は開発中のものです。:2014/02/14(金) 00:35:12.81 ID:RASlhvE9
Javaの場合、2DならSwing直叩きでもどうにかなるような気がするけど、Slickって効率よくなるのかな?
Swingでも、加算半透明がない以外は2Dゲームを作るのに必要な機能は一通り揃ってる気がする。
297名前は開発中のものです。:2014/02/14(金) 00:43:22.41 ID:mTpNkZDO
Slickは音声の再生とか当たり判定?の機能が結構あったから、そういう部分を最初から作らなくて済むという点ではいいんじゃないかと思う。
でも日本語表示が面倒なうえに遅い。
298名前は開発中のものです。:2014/02/15(土) 17:49:18.48 ID:XLIWRIqh
>>297
まず、ビルボードフォントのロードが遅いのはしかたないよ。
それはロード画面でも作るしかない。

ただし、UnicodeFontでaddGlyphAscii()で半角英数全部読み込み、
addGlyph(unicode_start, unicode_end()で日本語数千文字全部読み込みは
やめたほうが良い。ロード重くてVRAM消費大きいのは当然。
使う文字だけaddGlyph(String text)ならOK。
でもチャットとか使う文字コード不明だと一工夫必要だな。

ただslickのばあい、"あいうえお"なら、
"あ","い","う","え","お"でそれぞれ別のテクスチャとして
生成or描画してる感はある。

slickのコードを参考にオレオレライブラリつくるべく、
OpenGLを少し勉強中だぜ^^
299名前は開発中のものです。:2014/02/16(日) 14:14:02.89 ID:alwCO1iA
ゲーム作るときによく思うんだが、Javaは行列とかベクトルを標準ライブラリでサポートしてもいいんじゃないか?
自前で実装するとjavaコードでループ回して計算させることになるけど、
標準ライブラリに入っていれば、そこはベクトル化してSSEを使うとかの小細工が出来るだろうし。
300名前は開発中のものです。:2014/02/16(日) 16:34:35.48 ID:xrpwGl5O
>>299
完全に同意。
行列ライブラリは、自作しようにもJavaだとジェネリクスがただの型安全のための機能だから
C++みたいに使いやすくてカッコいいライブラリつくれないんだよね

拡張性と再利用性考慮してインターフェース駆使するとパフォーマンスゴミになるし、
かと言ってvecmathみたいに全部のプリミティブ型別で書いていくと面倒臭すぎる(double限定にしても良いかも知れないけど)
この部分の解決のためだけにScalaを使ってみようかなと思ってしまうほど


ただ、最近だとJVMが賢くなってプリミティブラッパ型で計算しまくっても
さほど遅くならないらしいね
301名前は開発中のものです。:2014/02/27(木) 00:55:40.21 ID:Z09ptZ8a
>>299
普通にあるんじゃね?
おれJavaでシステム構築ばっかりしてる会社で7年ぐらい働いてるけどいまだに標準の中にも新発見のライブラリがゴマンとあるから
302名前は開発中のものです。:2014/02/27(木) 23:04:33.97 ID:yUehUjJD
>>299-301

行列とかベクトルって,3Dの?
俺はJava3D使ってるけど,インストールする(してもらう)の多少面倒だから,
確かに標準にあって欲しいねぇ.
# 標準だとLine2DやPoint2Dがあるくらいだよなぁ.
# Vectorはこの場合は違うものだし.
303名前は開発中のものです。:2014/02/27(木) 23:10:39.87 ID:IrJ/L48F
>>302
Java3Dは俺も最初使ってみたけど、シーングラフを自由に変更したり
描画のタイミングを自由に決めたりしたかったんで、結局自前で実装することにした。
304名前は開発中のものです。:2014/02/28(金) 15:32:00.06 ID:0rEIeBjK
気になったんですが、
Javaでパソコンで動くスタンドアローンゲーム作るとしたら、
配布はjar形式でJVMにマウントしてもらうってことですか?
その場合、やはりプログラムコードの暗号化は諦めてるんでしょうか?
305名前は開発中のものです。:2014/02/28(金) 16:54:12.60 ID:piLveIui
埋め込まれたクラス名や関数名から
容易にリバースされてしまうのの対策としては
難読化ツールを使うかもしれないが

難読化したバイトコードから読み取れるほど
スキルのある人に対しては自分は対策は諦めるな
306名前は開発中のものです。:2014/02/28(金) 21:41:33.68 ID:0rEIeBjK
>>305
ありがとうございます
ProGuardですかね、調べておきます
307名前は開発中のものです。:2014/03/02(日) 16:49:33.89 ID:4Ufi5mJP
パッケージ名に使えるドメイン名を取得したいのですが何か方法はありますか?

Package BOF というのはあるんですが、もうサークル向け用に1つ取得してしまって
一人につき1つなので自分個人用のはもう取得できません

サーバ会社に申し込んでドメイン名を買うのもアリですが
毎年維持費がかかってしまうし、もし失効したときに
配布してしまったアプリをどうすればよいか分からないので困ります

できれば低コストでほぼ永続的にドメイン名を使わせてもらえる方法ないでしょうか?
308名前は開発中のものです。:2014/03/02(日) 17:32:49.38 ID:eSGAMgB8
>>307
サークル用と個人用は完全に関連性を匂わせたくないってことでしょうか?
匂わせてもいいならサークル用に取得したドメイン以下で自ら割り振れば良いと思いますが

しかし、あのサービスってサークル用と個人用を別々に登録するのってダメなんでしょうかね?
よほど悪意のある登録の仕方(複数組織を名乗って片っ端から登録しまくるなど)をしない限り
違反だと言われることはないんじゃないかなぁとか、甘いこと考えていたのですが・・・
309名前は開発中のものです。:2014/03/02(日) 20:17:31.47 ID:4Ufi5mJP
>>308

確かにゆるい感じしますね
自分はいちおう規約まもっとこうかなと思っただけです

家族はたぶんこれからもプログラミングと縁はなさそうなので
家族に頼んで取得してもらうって使わせてもらうことにしました
310名前は開発中のものです。:2014/03/03(月) 11:37:03.81 ID:0MFi7S0v
JavaFX 8 の3D機能が結構使いやすそうなんだけど、速度ってどんくらいなんだろうね?
アクションは無理でもそれ以外のゲームに耐えうるくらいならニワカ3Dな俺歓喜
311名前は開発中のものです。:2014/03/05(水) 13:10:43.11 ID:vvepHaRA
RPGのダンジョンとかいけるんじゃね
312名前は開発中のものです。:2014/03/09(日) 16:08:21.47 ID:UV7RBW8A
SwingのときはSwingUtilities#invokeLaterに自作のループマネージャを登録して
FPS管理してたんだけど、JavaFXで同じようなことをやりたい場合はSwingと同じように
Platform#runLaterにループマネージャを登録するやり方と、JavaFX特有のTimeLineで
16ミリ秒ごと処理を呼び出すようにするのとではどっちが良いんでしょうかね?
他にも、JavaFXには「Task」って考え方があるようですが、これはループには
あまり向いてなさそうですね(毎フレームnewするのも気が引ける)
313名前は開発中のものです。:2014/03/09(日) 16:39:31.94 ID:zp5zMRCB
SwingでSwing Timer使ってたけど自作のループマネージャってなんだろ
314名前は開発中のものです。:2014/03/09(日) 16:42:18.54 ID:zp5zMRCB
FX分からんけど、TimeLineはSwing Timerにあたるものだから
自分ならそちらでいく
315名前は開発中のものです。:2014/03/10(月) 14:54:03.30 ID:kt0u4e9M
libgdxってのがslick2dの後継らしい
316 忍法帖【Lv=9,xxxP】(1+0:5) :2014/04/20(日) 20:24:25.80 ID:XoaYESQg
Javaで3Dゲーム作ろうと思ってんだけど
どう思う?
317名前は開発中のものです。:2014/04/20(日) 23:54:09.45 ID:YswLFHGG
やればいいんじゃね?
JOGLかLWJGLになるんだろうけど、ゲームを作る環境としては特に悪いとは思わない。
318名前は開発中のものです。:2014/04/21(月) 02:08:32.49 ID:QMyWkepG
3Dのオブジェクトファイルとか読み込んで描画したり、物理演算に苦労するよ
物理演算等のライブラリは多数存在するけど、ドキュメントが英語だしイマイチ低機能、最低限の機能しかないからやめた方がいい
319名前は開発中のものです。:2014/04/27(日) 11:00:01.59 ID:w1gNzEbH
そもそも何故java.awt.ComponentにPaintListenerが無いんだぜ?
void paint(Graphics g)なりpaintComponent の中で自前の部品を使って描画する時に、
gに紐付いたComponentのサイズや他の情報にアクセスする時に、
結局部品のコンストラクタなりでComponentを渡してやる必要がでてくるだろ。
ListenerでPaintEventさえもらえればそんに手間も要らなくなるし、
gと部品が受け取ったComponentとの不一致の可能性もなくなる訳だし。

1.7では軽量・重量コンポーネントの混在も可能になったりしてるし、
gがComponentと紐付いていないパターン(ただのImageとか)でも判断できるように作れる筈なんだけどな。

JLayerだっけ?あんなの利用させられるくらいなら、この方が楽だろ。
320名前は開発中のものです。:2014/04/28(月) 01:11:27.19 ID:NW1ufA+w
もう少しまとめなさい
321名前は開発中のものです。:2014/04/28(月) 02:09:11.47 ID:EfnjKw0Y
paintイベントが発生したComponentを知る仕組みがイベントハンドルとして用意されてないから、
設計が素直にできないって話だよ。

swtにはあるし、他の有名なgui絡んだ言語じゃ当たり前にハンドルできるだろ。
何故ここを棄てたのか理解に苦しむ。

java.awt.ComponentでaddPaintListener()が出来て、普通にPaintEvent.getSource()できればスマートだろう。
ここを開放してないから、paintを弄り倒したいアプリだと、
paintのタイミングとは別の入り口でComponentを保持する必要が出てくる。
この制約のせいで、クラス設計がキモくなる。

それを無くす為に導入されたのがJLayerのつもりかもしれないが、余計にコードが汚くなるわ。
って話です。
322名前は開発中のものです。:2014/04/28(月) 17:41:47.77 ID:NW1ufA+w
アプリにもよるけど、俺はコンポーネントをシングルトンにしてる
もしくはシングルトンクラスに相互参照するようなコンポーネントを全部いれてる

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名前は開発中のものです。:2014/04/28(月) 19:41:32.23 ID:40qY12US
話の流れが良く判らんが、final付けとかないとダメだろ。参照を上書きされるぞ。

public "final" MyWindow window = new MyWindow();
324名前は開発中のものです。:2014/04/30(水) 10:24:37.40 ID:2hopiA0K
final忘れてた。でも一人でやってるなら体裁はどうでもいのだよ
セッター・ゲッターとかね

主題は相互参照。それで俺は例を出したのだけど
オブジェクトの初期化・コンストラクタで循環しないように気をつけてな
325名前は開発中のものです。:2014/05/01(木) 12:27:59.01 ID:OWwKad9r
たったこれだけの話なのに、>>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名前は開発中のものです。:2014/05/01(木) 14:07:36.24 ID:0k+QrX5J
>>325
たったそれだけの単純な例ならPaintListenerだっていらないだろw

JSplitPane, JTabPane, JScrollPaneとかで何層にも囲まれている場合、
上に挙げた様なやりかたでごり押しするのがやりやすいというのが俺の経験則
327名前は開発中のものです。:2014/05/01(木) 14:16:05.67 ID:0k+QrX5J
でも>>319の変な独り言ぶつぶつをよくみたら
そもそもComponent間の絡みという話ではないようだな
328名前は開発中のものです。:2014/05/01(木) 14:31:37.25 ID:OWwKad9r
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名前は開発中のものです。:2014/05/01(木) 14:51:19.89 ID:OWwKad9r
>>326
> JSplitPane, JTabPane, JScrollPaneとかで何層にも囲まれている場合、
> 上に挙げた様なやりかたでごり押しするのがやりやすいというのが俺の経験則

一つのゲーム画面の中で利用される様々なUIにSwingを利用してる人?
それともゲームのメイン画面を表示するframeとは別に、メッセージウィンドウを別のframeに表示するような内容のもの?

こっちはUI自前で描画するので何言ってるのか良く判らんわ。
330名前は開発中のものです。:2014/05/01(木) 15:39:15.05 ID:0k+QrX5J
質問者が何をしたいのかさっぱりわからん
paint(Graphics g)のオーバーライドをしたくないだけか?

じゃあPaintListenerに代替する委譲を組み込んだ
abstract class GameWindow extends Frame でもあらかじめ定義すれば
いいだけの話だろう。コンポーネントはひとつなんだろうし。

>UI自前で描画するので
OpenGLを使ってるわけでもなさそうだし
マップとかパラメータのエディタの話だと思った
OpenGL Canvasを囲ってるswing UIとかとの連携とか面倒なとこなんで
331名前は開発中のものです。:2014/05/01(木) 17:08:16.54 ID:OWwKad9r
ここは質問スレじゃねーよ。

> abstract class GameWindow extends Frame でもあらかじめ定義すれば
> いいだけの話だろう。コンポーネントはひとつなんだろうし。

たかがComponentのKey, Mouse, +αのイベントをトリガーとして、
そのComponentのGraphicsに対して描画するだけのプログラムなのに、
何で態々GameWindow なんて作らないといけないのか判らん。

public class App {

  public static void main(String[] args) {



}
332名前は開発中のものです。:2014/05/01(木) 17:10:21.32 ID:0k+QrX5J
もう好きにやったらいんじゃないの?
単なる好みの話のようだし
333名前は開発中のものです。:2014/05/01(木) 17:11:48.98 ID:OWwKad9r
ミスった。

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名前は開発中のものです。:2014/05/01(木) 17:19:50.13 ID:0k+QrX5J
タイマーで0.1秒毎に更新とかしないのね
335名前は開発中のものです。:2014/05/01(木) 17:22:44.30 ID:OWwKad9r
だから、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名前は開発中のものです。:2014/05/01(木) 17:24:12.49 ID:OWwKad9r
つまり、>>333の実装方法でも別にアニメーションするゲームでも問題なく実装できる。
337名前は開発中のものです。:2014/05/11(日) 13:41:58.58 ID:lnDi3sKB
SwingとかJavaFXでジョイスティック取りたい時ってどうしてる?
338名前は開発中のものです。:2014/05/11(日) 17:47:45.49 ID:ahXPYICD
みんなJavaでゲーム作ってどこで、どんな形で配布しての?
339名前は開発中のものです。:2014/05/11(日) 19:28:23.99 ID:04XDoyiH
>>336
俺ならまず要件を見直す。
どうしても棄てられないのなら対応osや言語選定を見直す。

LWJGLなんかが対応してるとは言われてるが、実際の所は最新版落として試して見ないのと判らんすぎる。
それから将来的な対応状況も未知数。素敵なライブラリだとは思うけどね。

MinecraftってLWJGL使ってる癖にアプリ側でその辺対応してないような気がするのだが、
やはり棄てた方が無難って事なんじゃないのかな。

俺なら勿論サクッ棄てる。
実際fpsとかのPCゲーなんてマウスとキーボードで十分ですし。

一応、このスレを「ジョイスティック」で検索すると、幾らか鮮度の高そうな情報が出てくるよ。

>>338
executable jarでいいんでね。
windowsに限りexeに変換して配布してる人いるね。

俺は面倒だからjarで済む要件に何が何でも留める。
結局さ、人気の出るゲームってのは、プレイヤー側が能動的に問題解決に動くから、
アプリ側がそこまで親切にする必要なんて無いと思うけどね。

Minecraftだってjoytokey経由でジョイパッド使ったりとかしてるじゃん。
とりあえず最低限の入力に対応だけして、ゲーム内容に特化するのが吉だよ。
ゲームのコアさえ生きてれば、UI周り、描画周りを別のモノに置き換えて、バージョン2とか言っちゃってもいいんだしさ。
340名前は開発中のものです。:2014/05/11(日) 19:33:11.25 ID:04XDoyiH
>>337の間違いだった。

W3Cがゲームコントローラ対応の為の標準仕様を作り出してるから、
5年・10年後には状況が変わってるかもしれんけど。
341名前は開発中のものです。:2014/05/12(月) 19:19:28.08 ID:E7gtXzq3
>>340
サンクスー
レトロゲー作りたいからゲームコントローラでやりたいんだよな
まぁ個人制作ゲームってことで、手を出してくるのもゲーマーだろうし
Joytoykeyくらい普通に使ってくれるか
342名前は開発中のものです。:2014/05/12(月) 20:07:41.64 ID:Vjyw6Vu1
jinput使えばいいよ
343名前は開発中のものです。:2014/05/12(月) 22:25:47.35 ID:E7gtXzq3
>>342
Ubuntuだとroot権限無いせいかわからないけど入力取得できなかったんだよなぁ
あと、ちょい低級すぎるのと、自分でGUIスレッドと連動させるとなると
ウインドウに対してのフォーカス有無とか考慮するのが大変な気がした
同人ゲーのバギーなネタの1つだよね、フォーカス無しで暴れるの
344名前は開発中のものです。:2014/09/09(火) 14:43:51.41 ID:3oFzTnHF
JavaFX使ってる人いない?
POJOでモデル作ろうとか考えずにモデルごとJavaFXの上で作った方がいいよね
345名前は開発中のものです。:2014/10/05(日) 16:53:18.23 ID:URSELbpt
IDかっこいい記念カキコ

UR SEL あなたのセル

だって
346名前は開発中のものです。:2014/10/05(日) 16:56:18.39 ID:5jShr1Of
住都公団の売物件がどうした?
347名前は開発中のものです。:2014/11/16(日) 13:17:23.48 ID:X9qJh2ZF
Javaの生産性はゲーム制作にも有用そうだと思っていたが、結局Javaによるゲーム開発はブレイクしないままだったな
ネイティブで性能を引き出すならそれぞれのプラットフォームに特化してC系でゴリゴリ最適化すればいいし、
マルチプラットフォームならそれこそwebベースになっちゃってるし
348名前は開発中のものです。:2014/11/21(金) 18:48:41.65 ID:/Uy/obEw
javaでゲーム作ろうと思ってようやく一通り動くようなものができた。
といってもクリックで指定した座標に向かってキャラが歩き、接触した物体に自動的に攻撃して破壊するだけのものだが。

さて、これをオンラインにしてマルチプレイに対応しようとしたが、全く実現できずに3ヶ月。
javaは通信周りは強いと聞いていたし、楽に実装できるかと思っていたが、基本中の基本部分が全然動かない。

・非同期通信を実現しなくてはならないが、サンプルを見ながらjava.nioパッケのセレクタ、selectNowを使っているのに数回ループ後に何故かブロックされる。
・マルチキャストをしなくてはならないが、SeverSocketChannelから取得したSocketChannelをリストに保持してクライアント送信時にループで送信しているが、受信しない。
・ゲームではUDP通信が基本らしいが、画像やDBデータ、インスタンス、文字列ですら正常に送受信できない。
・TCPでも試したが、通信処理のスレッドループでよく判らなくなってきて、どこにメインループの処理を書いたらいいのかわからない。

段々めちゃくちゃになってきたので、非同期通信、マルチキャスト、インスタンスの送受信なんかをカバーしたフレームワークがないか、
どうせならマルチプレイオンライン対応のフレームワークがないかと探しているが見つからず。

何か情報をください。できればオープンソースで日本語の情報があるものを
349名前は開発中のものです。:2014/11/21(金) 19:11:03.25 ID:P6gRt5G9
言ってる事が横文字だらけでちんぷんかんぷんです
もう少しわかりやすく記述してください
350名前は開発中のものです。:2014/11/21(金) 22:02:34.38 ID:/Uy/obEw
失礼しました。

要するに通信周りで苦労しているのですが、一向に実装できないので、通信周りをカバーしたフレームワークがないか情報があれば教えて欲しいということです。
351名前は開発中のものです。:2014/11/21(金) 22:58:54.97 ID:wDfQVO6/
一気に飛躍しすぎ
まずはチャットを作ってみては?

FWについては知らん
少なくとも有名なものは無い
352名前は開発中のものです。:2014/11/22(土) 00:18:10.87 ID:1kMHRznH
いくつかのサンプルを参考にチャットは作成しましたが、TCP通信のストリームを用いての文字列データだけのやり取りに留まっています。
画像を含めたインスタンスをサーバクライアント間でやり取りをしようとObjectOutput(input)Streamを利用するとブロッキングが発生してしまい、
別スレッドで起動する必要が出てくる上、今のところ画像データのやり取りはできていません。
UDP通信の送受信も試しましたが、今度は文字列データすらやり取りができなくなりました。
ノンブロッキング方式となるjava.nioパッケージもいくつかサンプルに沿って作ってみましたが、こちらもうまく行くのは文字列データのみで、
インスタンスの送受信はできていない上、何回か繰り返し処理をしているうちに何故かブロッキングが発生しないはずのメソッドでブロッキングされます。

使い方がよくないのは分かるのですがコードも煩雑になり手に負えなくなってきたので、通信周りの処理はオンラインゲームでは極当たり前のものだし、
フレームワークで存在しているかもしれないと思い探したものの見つからず、何か情報がないかと質問した次第です。

少なくとも有名どころにはないというのは大変残念。
Webアプリケーションのフレームワークならいくつもあるのに、通信あたりのとりわけマルチキャストに対応している物となると情報がない。
353名前は開発中のものです。:2014/11/22(土) 05:43:04.14 ID:YsbIPryz
自分も同じような段階なので非常に興味があります
僕の場合は通信にはプロトコルを定めて4バイト以下でやり取りしているので、オブジェクトの送受信は今ちょっと調べただけですが……

ハッキリとは分かりませんが、ObjectOutputStream自体がブロッキングするioなんじゃないでしょうか?

調べてみたところ以下の実装が綺麗な気がします
http://stackoverflow.com/questions/5862971/java-readobject-with-nio
ByteArrayOutputStreamでラップしてデータの長さを調べて、さらにByteBufferでラップして先頭に長さを埋め込んでおきます

受け取る側ではまず先頭の長さ情報(4バイト)を読み込みます
続いて長さ分確保したbufferに本体を読み込み、あとは逆順にObjectInputStreamに落とし込みます

僕も簡単なフレームワークがあったらなあとも思いますが、お互い頑張りましょう
354名前は開発中のものです。:2014/11/22(土) 13:31:16.69 ID:fUGuXT+m
通信用スレッド作ってブロッキングでやれば簡単だと思うよ
ノンブロッキング化なんて後からやればいいじゃない
355名前は開発中のものです。:2014/11/22(土) 16:49:26.43 ID:GtITkLZ+
TCPではなくUDPで通信するのは俺もわからんし興味はある

データを受け取った側が一々受け取り成功したことを発信側に返信していたら
遅いTCPと実質同じになってしまうとか、注意点ふぁありそうな気がするけど
この辺は言語問わず情報がなさすぎて困る
356名前は開発中のものです。:2014/11/22(土) 23:47:22.91 ID:fUGuXT+m
UDPの主な問題点は、パケットの到着が保証されない(途中で消えることがある)、順序が保証されない(前後が入れ替わることがある)の2点
どうにかこれに対処しないといけないが、だからといってこれを完全に保証するのなら、素直にTCPを使った方がいいわけで、
UDPを使うなら、パケットが消えたり入れ替わったりすることを前提に、最初からそれを受け入れる方針で設計しないと意味が薄い
一部重要な情報だけ到着確認や再送信など手厚い保証を作り込むという選択肢もあるが、TCPと併用し情報の重要度によって送信し分けるという選択肢もある

俺が作ったときは、通常はTCPを使い、性能的な懸念のある一部の情報だけUDPで送るようにした
念のため、UDPがちゃんと届くか送信テストを行い(返事はTCPで貰う)、だめだったときは全部TCPで動くようにした
特定のメッセージをUDPで送るかTCPで送るかはbooleanの引数1個で簡単に変更できた
357名前は開発中のものです。:2014/11/23(日) 00:38:44.67 ID:UddT0/lz
>>353
 提示されたソースを参照しながら色々と試しております。
 とりあえずシンプルチャットの文字列のマルチキャストはできましたが、インスタンスのやり取りはまだうまく行っていません。

 ObjectOutputStreamについては仰るとおり、ブロッキングが発生するストリームです。
 ブロッキングを回避するためにマルチスレッドにして、受信したメッセージとインスタンスをプールして一元的に処理しようとして・・・
などとやっているうちにデッドロックが発生して頭を抱えておりました。

 Webアプリケーションフレームワークでもそうであるように、通信部分はほぼ共通の処理だろうし、
C/S型MOGの実装とて大きな違いがあるとは思えないのですが、ないものですかね・・・

 一応、Jogreとか言うゲームエンジンがC/S型を想定したものらしいのですが、使い方がまるで判らず
オープンソースだからせめてどこか参考にできないかと見てみましたが私の頭では理解できませんでした。

>>354
 ゲームの根幹となるシステムはサーバ側で実装しようと考えており、その際にクライアントの通信待ちでブロックされてしまうと処理が進まなくなってしまうので、初めからノンブロッキングで行くつもりです。
 前述の通りマルチスレッド化の段階でうまく行かなくなってしまいました。

>>355
 通信方式には特にこだわっているわけではないのですが、今後内輪で一人複数キャラ起動で20〜100程の同時接続を想定しており、
そうなると今後はUDPでないとまずいのかな、などと漠然と考えておりますが、実装が楽なはずのTCPですら躓いている状態です。
358名前は開発中のものです。:2014/11/23(日) 02:19:06.05 ID:Y/h3FQGO
ブロッキングの場合は通信相手1人ごとに受信用スレッド1個と送信用スレッド1個を作って、それに通信処理を全部まかせるのがいい
相手側に何があってもブロックするのはそこだけで済む
何か送信したいときは、その相手用の送信キューに情報を詰め込んで、送信スレッドに送信してもらう
受信の方はそのまま受信スレッド上で処理してもいいが、スレッド間の同期が心配なら、受信した情報をメインスレッドの処理キューに積んでメインスレッドに処理してもらってもいい
もちろん各キュー自身は同期しなければならないが、LinkedBlockingQueueでも使っとけば心配なかろう
欠点は通信相手が増えすぎるとスレッドが増えすぎることだが、まぁ100くらいは大丈夫じゃない?

ノンブロッキングの場合は一箇所で全ソケットの送受信の面倒を見ることになる
基本的には Selector#select を回し続け、個々のソケットがそれぞれ受信可能になっていれば受信し送信可能になっていれば送信するわけだが、
受信したいときに受信したい量が受信できるとは限らないし、送信したいときに送信したい量が送信できるとも限らないので、
ブロックさせずに1スレッドですべてを回すためには送受信共にバッファ管理が必要になる
相手に何か送信したいときは、その相手用の送信バッファにデータを詰め込んでselectのループに戻り、
ソケットが送信可能な状態になったときに送信できる量ずつ送信する(そしてまたselectのループに戻る)
受信の方も、必要な量のデータが受信バッファに溜まるまでselectのループを回しておき、
じゅうぶん溜まったら受信バッファから必要量のデータを取り出して処理する感じ?
通信相手が増えてもスレッド数を抑えられるのが利点だが、実装は面倒い
359名前は開発中のものです。:2014/11/23(日) 08:51:36.48 ID:2oDwsjHs
Java信者がまだ生き残っていて嬉しい
360348:2014/11/24(月) 01:33:12.16 ID:sj/Z1D1w
今日一日がんばってはみたがやはり実装できず。
シンプルチャットは動いたものの、画像を含めたバイナリデータのやり取りはできておらず、
何故か353で提示していただいたコード部分でOutOfMemoryErrorが発生する始末。
使わなくなった瞬間に明示的にnullを入れてみたりはしたものの、全く解決せずで、
相変わらず手に負えない感じがあります。

今度はブロッキングのマルチスレッドを試してみようとは思いますが、以前この方法を取った際、
キューの中に受け取ったメッセージを格納しておき、メインスレッドで順番に処理する、
というようなコードを書いてみたところ、キューへのアクセスで何故かデッドロックが発生して
動作しなくなってしまったこともあり、うまく行くようにできるか心配です。
また、なんだか最終的に数千人規模の運営にも耐えられるようなもの(MMOみたいなものか)
みたいな要望(若干語弊がありますが)もあり、スレッドの数とか心配ですが。
361名前は開発中のものです。:2014/11/24(月) 12:33:21.54 ID:qbg8eFAd
どうしても上手くいかないならソース晒せば添削しよう
そのときはzipにまとめて適当なところにupしてくれ
362348:2014/11/24(月) 23:57:10.52 ID:sj/Z1D1w
ブロッキングのマルチスレッドを試していた所、
今度はループ上で2度目のObjectInputStraemのreadObjectメソッドで
StreamCorruptedException: invalid type code: ACが発生し、
シンプルチャットすら動作しなくなりました。

ObjectIOストリームを使うこと自体が間違いなのかもしれませんが、
今後サーバ側のDBに保存してある画像ファイル等をクライアント側に送信して表示することを考えると、
他にどうすべきかが判りませんが。

一応ソースを挙げてみました。
http://fileup.jp/up/4753.zip.htm
363名前は開発中のものです。:2014/11/25(火) 01:54:43.35 ID:5bX3A50t
 
お世話になります。
私、責任者の加茂と申します。以後、宜しくお願い致します。
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
に入居の引きこもりニートから長期にわたる執拗な嫌がらせを受けています。
この入居者かその家族、親類などについてご存知の方はお知らせ下さい。
[email protected]
364名前は開発中のものです。:2014/11/25(火) 03:27:39.50 ID:elCn5ht8
マルチスレッドにだけは手を出すな、というのが定説だよ

なぜならタイミングによって、
デッドロックになったりならなかったりして、
バグが再現できず、まともにテストができない

結局、バグが出ても、気のせいにしてリリースするので、
本番でバグが出て、どうにもならない

マルチスレッドはスレッド間で、リソースを共有するから、
共有リソースを使うすべての関数で、排他処理が必要

それでも資源A→B、B→Aの順で、
ロックするスレッドがあると、デッドロックが生じるため、
資源をロックする順番にも、矛盾があってはならない
365名前は開発中のものです。:2014/11/25(火) 08:05:46.97 ID:6uceNdu9
コンカレント・パッケージを使ったら?
366名前は開発中のものです。:2014/11/25(火) 08:11:55.29 ID:mNAq4UK+
ソース見た。
エラーの原因は、サーバ側では送信のたびにObjectOutputStreamを作り直してるのに、クライアント側では同じObjectInputStreamを使い続けていることだ。
作り直すなら両方とも作り直す(この場合resetは要らない)、使い続けるなら両方とも使い続ける。混ぜてはいけない。

あと、現時点では大丈夫かもしれないが、潜在的な問題がある。
受信がブロックするのは当然なので別スレッドにするのは自然だけど、実は送信もブロックするから別スレッドにした方がいいんだ。
TCPには一定サイズのバッファがあって、相手側が読み出してくれなければ、バッファが一杯になった時点でそれ以上書き込めなくなり、ブロックする。
相手側が読み出してるつもりでも、例えば何かネットワークのトラブルでデータが届かなくなれば、同じようになる。
サーバ側で synchronized (this.recvMessageQueue) { } の中で sendClients 呼んでその中で writeObject してるけど、こういうロックを握ったままブロックする可能性があるのは非常によくない。
受信キューを握ったままブロックすると受信スレッドがみんな動けなくなるし、そうなるといずれクライアントの送信側もバッファが一杯になってみんな止まってしまう。

あとは、 clientSocketList が複数のスレッドから読み書きされてるから synchronized するべき。
いちいち synchronized するのが面倒なら元からスレッドセーフな CopyOnWriteArrayList を使うという手もある。
キューも LinkedBlockingQueue とか使えば synchronized する必要なくなる。 まぁこのへんはどっちでもいいけど。

ObjectIOストリームは、性能面では劣るけど、開発は楽だから、使いたければそれでいいんじゃない。
他の方法といっても、ファイルと一緒で、フォーマットを決めて読み書きするだけだよ。
いわゆるType-Length-Value的なやり方が普通だと思うけど、例えば文字列化して行単位で送るとか、XML形式で送るという方法もなくはない。
こういうのは性能やらメンテナンス性やら開発速度やらのトレードオフだから、好みの方法を使えばいいと思うよ。
367348:2014/11/26(水) 18:49:10.33 ID:yQ5yK0Ih
>>366
 添削ありがとうございます。とりあえず基本的な通信周りは動くようになりました。

 エラーの原因は結局の所Streamの基本的な利用方法を理解していなかったことであり大変お恥ずかしい限りです。

 受信以外に送信もスレッド化しなくてはならないとなると、1クライアント接続毎に2スレッド起動することになるのですね。
 100の接続があれば200、1000の接続があれば2000も起動するということで、今後仕様に耐えられるか心配ではあります。
 364の方が仰るようなバグの内包は自分はやらかしそうなので。

 こういったミスがなくなるよう、通信周りで信頼性の高い実装済みのフレームワークを利用したいと切に願います。

 ともあれ、ようやく動くようになりました。ありがとうございました。
368名前は開発中のものです。:2014/11/26(水) 20:44:59.58 ID:EUSw3GAJ
心配なら簡単なテストプログラムを作って実際に高い負荷をかけてみるのもひとつの方法
大量のソケットを作って自分のサーバに接続しまくるとか
何か簡単なメッセージでもやり取りすればより実際の状況に近い
もう1台PCを用意してネットワーク越しに実験できればもっと良い

仮にフレームワークがあったとしても十中八九マルチスレッドだろうからその種の心配は無くならないんじゃないかな
このマルチコア時代に1コアしか活用できないとか汎用のフレームワークとしてはありえないだろう
何かプログラマの負担を多少なりとも軽くする仕組みはあるかもしれんけどね
369名前は開発中のものです。:2014/11/29(土) 01:20:26.07 ID:X/DpHkls
教えてJava仙人!
370名前は開発中のものです。:2014/11/29(土) 22:21:48.97 ID:tbWotyUc
こちらで聞いて良いものかどうか判りませんが、一応Javaも絡んでいるので質問。

プレイヤーキャラクターが装備を変えた時、見た目も変わる2Dの作品を作っています。
パーツごとに見た目が変わるため、頭部、胴体、下半身、右手、左手等に
パーツを分け、それぞれでアニメーションのスプライトを製作しています。

しかし、全体像が判らないとパーツの動きがわかりにくくて製作が大変面倒な上、
PGに起した時に正面を向いている場合には髪→顔の順に表示するが、
後ろを向いた場合には顔→髪のように順番を変えて表示をする必要があり、
全体像になったときにパーツの表示位置も調整しなければならず、
難しくはないが大変手間がかかって製作が難航しています。

複数のパーツの画像を組み合わせて全体像およびアニメーションを表示しつつ画像編集ができ、
且つ保存時にアニメーションのソースコード(位置情報や表示順序・java、できればLibGDXフレームワーク準拠の)
に自動的に起すようなツールは何かないでしょうか。

Unityに似たようなツール?があるようですが、言語がJavaではないので手を出していません。
Googleでも「画像編集 パーツ アニメーション 組み合わせ」などで探していますが、
望むような情報が得られていません。
371名前は開発中のものです。:2014/11/29(土) 22:32:26.42 ID:bnooxQNY
一人称視点にしてプレイヤーキャラを表示しない
372名前は開発中のものです。:2014/11/30(日) 21:40:35.22 ID:nwszzSQi
キャラクタークラスで制御すれば済むはなしじゃないの?
ツール、それもソース生成ツールなんて大げさなもの必要ないでしょ
373名前は開発中のものです。:2014/11/30(日) 21:43:40.21 ID:n78F4afF
髪でサンドイッチして、片方透明にするだけだわな
374370:2014/12/01(月) 16:06:44.26 ID:m/6pnraT
>>371
2Dの作品ですし、他キャラクターも同様にパーツの組み合わせで表示しているので、
全く解決になっていません。

>>372 373
前の書き込みどおり、難しくはないのですが手間がかかりすぎるので、
作業を楽にするためにツールを所望しています。
375名前は開発中のものです。:2014/12/01(月) 16:25:25.12 ID:osWTP4D1
ツールをツクールべし
376名前は開発中のものです。:2014/12/02(火) 03:00:01.68 ID:cSamQ6Ju
画像素材を規格化してピクセル単位の調整不要にするのが普通だと思う
377名前は開発中のものです。:2014/12/22(月) 20:19:34.55 ID:CZQUzeXC
ゲームは一応動いてはいるのですが、
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名前は開発中のものです。:2014/12/23(火) 00:24:18.43 ID:hTBgtj1H
gsm.draw(g2d); の前に
System.out.println("gsm=" + gsm);
って入れて本当にインスタンス化されてるか見てみるべき
379名前は開発中のものです。:2014/12/23(火) 17:37:34.54 ID:5kqJ3HYv
改行多すぎとエラーが出てしまった。
>>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名前は開発中のものです。:2014/12/23(火) 17:39:08.59 ID:5kqJ3HYv
連投すいません。続きです。


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名前は開発中のものです。:2014/12/24(水) 04:22:27.25 ID:ZOZo6NXr
おそらくそのコードでは、intiが必ずpaintComponentより先に実行されるという保証がないだろう
保証がなければ、どちらが先に実行されても (paintComponentがinitより先に実行されても) いいように書かねばならないのが当然
382名前は開発中のものです。:2014/12/25(木) 01:55:41.41 ID:CDRHNiiy
ありがとうございます。
addNotify()の中身をMainPanelのコンストラクタに放り込んだらエラーが出なくなった。

ところで皆さんはゲームのキー処理の問題で、
ゲームメッセージや選択肢なのでず〜っとキーを長押ししていても「一回しか押してない」というのはどういう風にしてます?
383名前は開発中のものです。:2014/12/25(木) 10:44:35.48 ID:Af82Po9s
swingだとどうすべきか難しいところだな
DirectInputだと毎フレームすべてのキーの状態を取得しちゃうのが一般的だけど
384名前は開発中のものです。:2014/12/25(木) 19:34:18.02 ID:CDRHNiiy
中々サンプルコードみたいなのが見つからない。日本語と英語両方検索したけど。

while(true){....}
public void keyPressed(KeyEvent e) {...}
public void keyReleased(KeyEvent e) {...}
な構造にしているから
ずっとあるキーを押していたらkeyPressed()での処理が行われるし。その関数の中でwhileを使ったら永久ループなりそうだし。

推理ゲームのサンプル探したほうがいいですかね?
385名前は開発中のものです。:2014/12/26(金) 03:39:10.02 ID:lHrPo1LI
1↓ 2↓ 3↓ 4↓ 5↑

もし2↓を取ったら、これに対応するのは5↑だから、
3,4は無視しないといけないのでは?
386名前は開発中のものです。:2014/12/27(土) 05:02:14.11 ID:ypf29vev
普通に入力関係をラッピングすればいい話じゃ…?
//フィールド
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名前は開発中のものです。:2014/12/27(土) 09:25:11.81 ID:vPGjZ0DT
>>385, 386
なるほど。
ちょっとそれ試してみます。
今ソースはこんな感じでしています。http://pastebin.com/u/TortoiseshellCat
388名前は開発中のものです。:2014/12/27(土) 14:06:38.18 ID:ypf29vev
>>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名前は開発中のものです。:2014/12/27(土) 21:04:54.34 ID:vPGjZ0DT
>>388
ありがとうございます。
そのコードだったら確かにず〜っとキー押していても大丈夫みたいですね。
ケド、思ったんじゃけど、多くのゲームにあるように
たとえばセレクトボタンを一回押したらアイテム欄が表示されて、その間ずっとボタンを押してなくてもいいような感じのをがんばろうとしているのですが。

387でそれっぽく動いているのすが、アイテムの売り買いや色々な機能を追加しようとしたらスバゲッティーは確実なので。
390名前は開発中のものです。:2014/12/28(日) 07:16:21.15 ID:AKjP+Lg6
そういうのは普通setVisible()とかsetActive()とかいうメソッドで
パネルの表示/非表示を切り替えればOK
391名前は開発中のものです。:2014/12/29(月) 17:45:26.91 ID:k/14dtiW
いつかきっと、SOAだとかクラウドだとか実現する方式は何にせよ、無料でサーバが持てて個人でネトゲ、ちょっとがんばればMMORPGみたいなのが簡単に作れる時代が来ると、自分は思っている。
今でも個人で作っている人は居るが、技術的にも金銭的のも負担が大きい。これがもっと楽になる時代がきっと来る。

そんな時、マルチプラットホーム、オープンソースで無料、完全なオブジェクト指向で学習も比較的容易、例外処理でエラーも比較的追いやすい、速度も大分改善しているJavaは、今後のスタンダードになるに違いないと思っている。

これで後はゲームエンジンやゲーム用統合開発環境等ののキラーソフトがあれば、もっと盛り上がると思うんだが。
Android系では色々あるようだが今一これというものがない。(日本語情報が少ないというのもあるが)
392名前は開発中のものです。:2014/12/30(火) 11:42:24.92 ID:/nzVCgt/
iPhoneがダメな時点でマルチプラットフォーム()なんだよなぁ
393名前は開発中のものです。:2014/12/30(火) 22:41:52.73 ID:qq+vzibr
>>390
なるほど。Listの中にメッセージダイアログボックスを格納して管理をしているのですが
キーとの関連で表示、非表示をするのが大変だ。
394名前は開発中のものです。:2014/12/30(火) 23:47:34.77 ID:e1Qg6kJJ
アプレットをスタンドアローンでうごかしたいんだけど
アプレットをswingのパネルにhsったりできるの?
395名前は開発中のものです。:2014/12/30(火) 23:48:24.13 ID:e1Qg6kJJ
×hsったり
○貼ったり
396名前は開発中のものです。:2014/12/31(水) 01:58:36.30 ID:6bY7ACR2
appletviewerっていうコマンドがある
397名前は開発中のものです。:2014/12/31(水) 18:34:59.42 ID:VBAHoYqR
人に渡すとき
APPLET viwerなるもので動かせますか
398名前は開発中のものです。:2014/12/31(水) 19:05:26.17 ID:6bY7ACR2
JREを同梱して渡せば無問題であろう
JREは(一定の条件下で)再配布が認められている
399名前は開発中のものです。:2014/12/31(水) 19:07:03.24 ID:6bY7ACR2
あ、ごめん
JREにappletviewer入ってなかったかも
だめだわ
400名前は開発中のものです。:2014/12/31(水) 20:31:57.02 ID:VBAHoYqR
ありがとう

swingパネルにアプレット貼れたら
実行ファイルにできそうだけどねえ
401名前は開発中のものです。:2015/01/01(木) 03:29:50.87 ID:x71JTDJa
ゲームのメインループだけど
PCのモニタ環境によってリフレッシュレートが60ヘルツとか50ヘルツの
場合があるけど60FPSで画面書き換えると50ヘルツ設定時にカクつくし
60と50FPSに切り替え可能にした場合はそれぞれ1秒辺りのゲーム速度が
変わってしまうし(フレーム毎に1ドットスクロールとか)。その辺は皆どうしてるんだろ?
単純な2Dゲーム作りたいだけなんだけど。
402名前は開発中のものです。:2015/01/01(木) 03:35:19.22 ID:uaHkAOC+
deltaTime
403名前は開発中のものです。:2015/01/03(土) 23:03:13.93 ID:RYcLH3w9
Java過疎ってんなぁ

ところでJRE8で日本語入力ができないんだが
今はJRE7をメインで使ってる
404名前は開発中のものです。:2015/01/06(火) 04:39:59.03 ID:PnAg4DMI
960×544の解像度でBufferdImageで前回の背景表示内容をキャプチャし、
ずらして画像表示して擬似スクロールしてスクロールした分だけ新規描画というのを
60FPSでやってみたけどCore i3でCPU40%消費。ちょっと食いすぎじゃん?
スクロールはブロック単位で再描画した方が良いのかねー。
405名前は開発中のものです。:2015/01/13(火) 17:49:27.95 ID:Cut3q1mT
自分もスクロールやろうとしたことあったけど厳しかった
Win7 発売され始め時期のかたおちPCだけど。

>>404 と同じぐらいの画面サイズで
BufferedImage だと 30 fps でもかなりカクカクな感じで
OpenGL使っても 60 fps だとたまにカクッとなった。

組み方が悪いのか、スペックが足りないのか、
ビデオメモリに入りきらないのか、ガベコレか、Javaの限界か、
Cとかでハードウェアに密着して書けば早くなるのか、
ようわからんかった
406名前は開発中のものです。:2015/01/13(火) 22:55:52.16 ID:IQ52oWIM
>>405
たぶんそれはモニタのリフレッシュレートが描画と合ってないからだわ。
少なくともセレロン程度でも60FPS程度ではカクカクなんてしない、CPUは食うけど。
407名前は開発中のものです。:2015/02/09(月) 00:06:19.88 ID:R2EuJPGg
質問させて下さい
どこかで、JavaのGUIがAWT/SwingからJavaFXへ移行するとの記事を読みました
これからゲーム作る場合、SwingではなくJavaFXを勉強すべきですか?

よろしくお願いいたします
408名前は開発中のものです。:2015/02/14(土) 03:23:03.34 ID:2h9+EhUj
あんまり詳しくないけど、2Dのゲームを作る分にはSwingでも十分だし、いろいろな解説サイトや本もだいたいSwingだからJavaFXをわざわざ勉強する必要はないんじゃないかと
409名前は開発中のものです。:2015/02/15(日) 12:01:07.84 ID:3+LUOTIJ
>>408
レスありがとうございます
確かに、ネットで勉強していると、ほとんどSwingなんですよね
ただ、これからJavaが本当にGUIをJavaFXに絞る場合、そちらに切り替えたほうがいいのかと心配しています
JavaFXに対するOracleの本気度を知りたいですね
410名前は開発中のものです。:2015/02/16(月) 00:35:23.69 ID:IObbTgF7
GUIが変更されても大丈夫な設計にしてSwingで作ればいいじゃない
411名前は開発中のものです。:2015/02/17(火) 01:02:02.75 ID:chIOmG3A
>>410
そのレスで、もう一個質問したいことを思い出しました
私はシミュレーションやRPGが作りたいです
色々と、windowを作る必要があると思うのですが、ゲームの場合、それらは自作すべきですか?

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

仮に、自前で絵として表示する場合、SwingでもJavaFXでもあんまり変わらない気になりました
412名前は開発中のものです。:2015/02/17(火) 03:25:28.71 ID:6qHepVXs
自作というか、継承してカスタマイズするパターンが一番多いよ
JPanelを継承してCommandPanelとか、そういう感じ。
ボタンとかも押した時のイベント処理とか画像の変化とか備わってるものをベースにするのが現実的。
413名前は開発中のものです。:2015/02/17(火) 10:37:33.20 ID:gXwJ1qVD
guiを自前で実装しようとするとフォーカス制御という面倒事が待ってるからswingなりfxなり使った方が手堅いよ。
414191:2015/02/22(日) 11:24:59.12 ID:x5Svrr+/
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名前は開発中のものです。:2015/02/22(日) 12:11:59.61 ID:9tzD8toT
先ず、更新と描画は別。
416名前は開発中のものです。:2015/02/23(月) 10:06:47.59 ID:Lz998WDk
表示される範囲座標一つ一つ、どのエリアのどこの座標になるか見ればいいんじゃないの。
417名前は開発中のものです。:2015/02/23(月) 12:44:13.38 ID:0EQ3KecF
複数の座標系は変換して使うもの。
グローバル座標、タイル座標(=グローバル座標の場合あり)、エリア座標は相互変換できないとおかしい。
そしてそれら座標系が描画時にウインドウのクライアント座標に変換できないといけない。

この辺が整理できていないからやり方が判らないんだよ。
418名前は開発中のものです。:2015/02/24(火) 00:16:43.29 ID:zq7H1j8+
>>415 ~ 417
変換系の整理ですか...
int indexTPX等で表示画面の左上座標を算出して後は表示画面の幅や高さでそれぞれの座標計算は出来るのですが。
/** private Area[][] map
* [1][2][3]
* [4][5][6] 5 -> はじまりの町
* [7][8][9]
*/
1,2,4,5の中心付近にいて4つのエリアを描画するとき、
どうやって各エリア情報を取得して使用するかが確かに整理できない気がします。
419名前は開発中のものです。:2015/02/24(火) 00:53:43.94 ID:hT1osW/a
>>418
4つの中心付近とか関係ないだろ…?
今プレイヤーは何番のマップにいるのか。
そのマップはどれだけオフセットしてるのか。
チップのサイズ、マップのサイズはいくらか。
420名前は開発中のものです。:2015/02/24(火) 04:46:34.32 ID:FyTelkQO
>>418
エクセルでも方眼紙でも何でもいいから、簡単に入子の箱書いてみれば理解しやすいんじゃない。
421名前は開発中のものです。:2015/02/24(火) 23:23:20.49 ID:zq7H1j8+
>>419~420
一つの大きなマップはいくつのも小さなエリアの集合体で構成されているので,
その小さなエリアの幅が決まっています。
よって描画画面がそのエリア幅を超えたら、そのエリアに接している別のエリアも映し始めなければならないので。
後、今プレイヤーが何番のマップにいるのかはわかる様にしています。

ちょっと説明が出来ないのでソース上げてもいいですか?
422名前は開発中のものです。:2015/02/25(水) 00:02:04.33 ID:wwS95ney
仕組みは理解できてると思うよ。

表示範囲が1エリアの範囲を超えるでもなければ、プールしておくべきは最大4エリア
その4エリアから表示範囲分を表示すれば良いだけ。
423名前は開発中のものです。:2015/02/25(水) 00:41:58.65 ID:sF3guJ4N
エリア座標(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名前は開発中のものです。:2015/02/25(水) 01:19:14.73 ID:Opsz/SjB
>>422~423

なるほどなるほど。グローバル座標などで処理する等で問題は解決しそうです。
ちょっと道が見えてき始めたのでがんばってみます。
ありがとうございます。
425>>199:2015/02/25(水) 17:58:43.51 ID:Jzpyh/K8
2年経っても同じことやっててワロタ

4エリアだと計算が難しいから、エリアを少し小さくして
主人公の周り全方向8エリアを処理するようにすれば?
426名前は開発中のものです。:2015/02/25(水) 23:36:51.01 ID:wwS95ney
全体マップをエリア単位で分けた座標をブロック座標とした場合、
現在位置の要素を調べるのには、全体マップでの現在位置を1エリアの大きさで割って、商が全体マップ中のエリアのブロック座標、余りがエリア内の要素座標。
これは現在位置の足元の要素を調べる考え方だけど、右隣の要素を調べたいなら右隣を現在位置座標とした同じ計算をしてみればいいだけ。
プレイヤー周囲3x3の要素を調べたいのなら、計9回分基準となる座標を入れ替えて同じ事をすればいい。
427名前は開発中のものです。:2015/02/26(木) 02:32:54.21 ID:BXfNXTEu
巨大マップを作るのにしても迷路状のMAPなら、迷路生成の為のツール作って大枠を作成、その上で細部を手直しするとか、
2Dのフィールドマップならマップタイル1つを1色の色に見立ててペイントで大雑把に描いて、その後に通常のマップタイルを組み合わせた表示で細部を手直しするとか。
3Dのフィールドマップなら上記のやり方に組み合わせて、等高線地図的なもので凸凹のMAPを生成し、細部を手直しようにするとか。

巨大な皿に一つ一つ米粒並べるよりも、米をぶちまけて均等にならした方が早い。
グローバル座標からブロック座標、エリア内座標を生成するのも、それと似たような考え方。
428名前は開発中のものです。:2015/02/27(金) 13:30:27.20 ID:RNDSqU89
ふお===
何かスパゲッティー通りこしてペペロンチーノになってきた。
ちょっと今思ったのですが、もう一つグローバル変数だけのマップをつくればいいかな。
小さいエリア集合のマップを最初から一つの大きなマップ(グローバル座標もち)にすればいいんじゃね?
そうすればエリアから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名前は開発中のものです。:2015/02/27(金) 16:35:54.45 ID:KBJyPpkG
グローバルマップのサイズはGX256xGY256。
エリアマップのサイズはAX32xAY32。
すると、グローバルマップは、BX4xBY4のブロックマップとなります。

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

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

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

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

演算子は理解できてるよね?
430名前は開発中のものです。:2015/02/27(金) 16:39:11.64 ID:KBJyPpkG
エリアマップの集合体がグローバルマップなわけで、その集合体を管理するのがブロックマップでありブロック座標。
エリアマップの集合体を管理する座標体系が、まるっきりすっぽ抜けてんだよ。
431>>199:2015/02/27(金) 17:28:35.90 ID:H3arKG/F
チップ単位 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名前は開発中のものです。:2015/02/27(金) 19:15:31.20 ID:RNDSqU89
>>429
はい。 % は余りで、/は除です。
>>430~431
こんなに助けて貰っていてまだ出来ない自分が情けなく思います。まじで。
ちょっと今までの過程を上げて見ます。
ttp://fileup.jp/up/6184.zip.html
433>>199:2015/02/28(土) 01:23:44.46 ID:P1K9vzQz
2DのアクションRPGとかその辺かねぇ
ttp://gesei.sub.jp/kami/src/up0358.zip
434名前は開発中のものです。:2015/02/28(土) 11:34:50.48 ID:oenNrJIA
>>433
おおおおお。すごい。
完璧に出来ている。
今コードを読んでいて関心させられるばかりです。
もう少し完全把握に時間がかかるので出来次第また書きます。
本当にありがとうございます。これでまたちょっとがんばれるかな。
435名前は開発中のものです。:2015/03/03(火) 01:03:54.17 ID:g0dj32rR
漸く432で上げたコードに組み込むことが出来たました。
一つ質問があります。

例えば敵がある一定のエリアにいてArea.update()で更新するのがいいのか。
若しくは、Areaクラスの集合管理をしているMapに敵(自己のエリア番号保有)を格納しているのがいいのか。
クラスダイアグラム考えているんですけど、普通は前者ですかね?
436名前は開発中のものです。:2015/03/03(火) 03:03:27.31 ID:5dXFwol9
1.ゲーム仕様的に敵が少なければ敵全員forループで回す
実装が簡単、どこかに敵全員入ったList<Enemy>があれば良い

2.全エリア合計で10万とか敵がいる場合、巨大なforループ自体を回したくない
その場合はAreaクラスにList<Enemy>をもたせておき、Area.update()する
こちらの場合、敵が動いてエリアを跨いだ時に移動前と移動後のエリアに変更を通知する
437名前は開発中のものです。:2015/03/03(火) 03:10:16.30 ID:5dXFwol9
>>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名前は開発中のものです。:2015/03/03(火) 19:20:02.12 ID:g0dj32rR
なるほど。わかりました。次は当たり判定を実装してみます。


後、皆さんゲーム作るときって何か雛形や構造など参照にしてるものってあります?
自分はテンプレにある-> 大量のソースコードを公開して下さっている国内サイト
ttp://aidiary.hatenablog.com/entry/20040918/1251373370
を使っていますが。
439名前は開発中のものです。:2015/03/03(火) 21:08:17.36 ID:zJ99hZfx
さすがにちょっとenemysは頂けないわ
440名前は開発中のものです。:2015/03/03(火) 21:59:26.85 ID:5dXFwol9
がびーん
441名前は開発中のものです。:2015/03/03(火) 23:22:11.93 ID:Ww58oNEN
>>439
enemies?
442名前は開発中のものです。:2015/03/06(金) 19:06:03.53 ID:qOuLf7E5
一つのエリア内での壁の当たり判定は出来ましたが、またエリア境界を跨ぐ所で詰まった。
>>426みたいにするのを考えていますが中々うまくいかない。
いっそのこと>>428の方法を取ったほうが周りのエリアのことを考えなくて住むので計算は楽になるかな?
443名前は開発中のものです。:2015/03/06(金) 21:12:18.88 ID:cuamb/V2
いや、何でやねんww
同じ座標変換で、進行方向のオブジェクト調べりゃええだけやがなw
444名前は開発中のものです。:2015/03/06(金) 22:03:19.10 ID:YhHE8cN4
これは流石に草
445名前は開発中のものです。
まるで成長していない