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

■ このスレッドは過去ログ倉庫に格納されています
1名前は開発中のものです。
垢版 |
2012/12/27(木) 16:04:18.62ID:rl+qGRHn
スレタイはアプレットとの対比的な意味と考えてください。
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
2013/01/01(火) 21:33:36.72ID:qZjxFetx
javaのmidi関係は割と素敵だけどそっから何か作りたいとは思わんな
それならsteinbergからSDK落としてきて素直にVST開発するのがいいが、これまた同志がいない
ファミコンゲームしか作る気ないし音はNSF一択
2013/01/01(火) 22:05:29.06ID:bDDsDYAo
switch文はJDK1.7から文字列分岐ができるようになった。

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

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

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

swingで974FPSも出てるぞ。

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

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

こんなレベルで一個一個質問してたらゲームは遠いぞw
2013/01/03(木) 21:17:38.19ID:VLgNVUQ7
肝心のゲームよりゲームエンジン作るのが楽しい
スプライトシートに特化したソフトが仮完成した
マップエディタを改良していきたい
エディタ側からイベント追加、フリーハンドでの当たり判定生成ができるよう改良する予定
2013/01/03(木) 21:28:04.63ID: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"

ぐぐたけどわからんちん
2013/01/03(木) 22:10:32.44ID: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

やっぱコメントアウトしてる部分で初期化処理してるのかなあ
2013/01/03(木) 23:17:38.07ID:iQ8H96lh
う〜ん、出来たような

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

グラジエントが縞模様っぽいのは仕様か…?
2013/01/03(木) 23:40:29.62ID: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とかって感じ??
あと何かお勧めのライブラリとかある?
2013/01/03(木) 23:41:04.36ID:iQ8H96lh
でも垂直同期に合わせられないから旨くないかなあ

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

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

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

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

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

http://uploda.cc/img/img50e9176927843.png
2013/01/06(日) 17:12:28.42ID:fwb+peuo
AWTとSwing混ぜる必要ある?

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

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

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

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

謎杉。何がしたいの?

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

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

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

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

■□ ■
のようになって、ここで右側にいけない(右の壁まで数ピクセル進めない)のって気持ち悪いと思うのです
こういう時だけ場合分けするにしても煩雑になってきますし、そもそもの当たり判定の方法がよくないのかなと思いまして質問しました。
2013/01/18(金) 00:06:12.20ID:cE8dsg28
>>82
仕様に合わせた最適な判定は知らんが(仕様が分からないし)
普通は中心じゃなく四隅を判定する
右移動中なら右上、右下だけとかの省略はできるが
で、四隅をプレイヤーサイズじゃなく判定サイズにする

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

■ ■ ■

■ ■ ■

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

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

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

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

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

あと、

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

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

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

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

1から10まで書かないとわからないようだな。
2013/01/19(土) 02:20:19.61ID:yYWDydAV
A⊂Bの意味で言ってるのね。
ならなおさらBのRect使えよと言いたいが、設計の段階の話なら
>より原始的な方法(int x,y,w,h)でも好きにすればいい話。
で納得。
2013/01/19(土) 12:23:53.82ID: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--;
    }
  }
}
2013/01/19(土) 15:59:40.56ID:fS2RAsj1
ブロックの大きさも一律固定だろうしな。
単純なアプリなら単純に作ったほうが工数が少なくて楽。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ニューススポーツなんでも実況