ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

オープンアプリコミュのちょいクラス

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コメント(8)

ネタが無いので、ゲーム等で使った弾のクラス等...。
(Java歴5ヶ月なので細かい所は許してください&指摘下さい)

import javax.microedition.lcdui.*;

/* ============================================================================

============================================================================ */
// 必要な数値
// applet.SCREEN_DX/DY 画面のサイズ
// applet.MAGNIFI 画面の解像度


class BaseObj {
// CLDCはACOS/ASINが無いから必要

static final int DGREE_RESOLUSION = 5; // 5度単位

static final int[] SIN = {
0, -9,-17,-26,-34,-42,-50,-57,-64,-71,-77,-82,-87,-91,-94,-97,-98,-100,
-100,-100,-98,-97,-94,-91,-87,-82,-77,-71,-64,-57,-50,-42,-34,-26,-17, -9,
0, 9, 17, 26, 34, 42, 50, 57, 64, 71, 77, 82, 87, 91, 94, 97, 98,100,
100,100, 98, 97, 94, 91, 87, 82, 77, 71, 64, 57, 50, 42, 34, 26, 17, 9,
0
};


static final int[] COS = {
100,100, 98, 97, 94, 91, 87, 82, 77, 71, 64, 57, 50, 42, 34, 26, 17, 9,
0, -9,-17,-26,-34,-42,-50,-57,-64,-71,-77,-82,-87,-91,-94,-97,-98,-100,
-100,-100,-98,-97,-94,-91,-87,-82,-77,-71,-64,-57,-50,-42,-34,-26,-17, -9,
0, 9, 17, 26, 34, 42, 50, 57, 64, 71, 77, 82, 87, 91, 94, 97, 98,100,
100
};


static final int STATE_NON_ACTIVE = 0;
static final int STATE_ACTIVE = 1;

long x, y; // 位置(×100)
int dir; // 角度0〜360度
int speed; // 速度
int state; // 状態
int size; // 大きさ(ヒットテストに利用)

//* -------------------------------------------------------- */
public BaseObj() {
x = 0;
y = 0;
dir = 0; // degree 0->360
speed = 0;
state = STATE_NON_ACTIVE;
}

//* -------------------------------------------------------- */
public void init( int ix, int iy, int idir, int ispeed, int isize ) {
state = STATE_ACTIVE;

// 登場位置の確認
if( ix < 0 || ix > applet.SCREEN_DX ) x = 0; else x = ix * applet.MAGNIFI;
if( iy < 0 || iy > applet.SCREEN_DY ) y = 0; else y = iy * applet.MAGNIFI;

dir = (idir % 360);
if( dir < 0 ) {
dir = 360 + dir;
}

speed = ispeed;
size = isize;
}

//* -------------------------------------------------------- */
public int rotate( int degree ) {
dir += degree;
dir %= 360;
dir -= (dir % DGREE_RESOLUSION); // 分解能で割る

if( dir < 0 ) {
dir = 360 + dir;
}

return dir;
}

//* -------------------------------------------------------- */
public void setxy( int xx, int yy ) {
x = xx * applet.MAGNIFI;
y = yy * applet.MAGNIFI;
}

//* -------------------------------------------------------- */
public boolean hittest( BaseObj dst ) {

long dx = (x / applet.MAGNIFI) - (dst.x / applet.MAGNIFI);
long dy = (y / applet.MAGNIFI) - (dst.y / applet.MAGNIFI);
long dist = size + dst.size;

if( dx*dx + dy*dy < dist*dist )
return true;
else
return false;
}

//* -------------------------------------------------------- */
public int getx() { return (int)(x / applet.MAGNIFI); }
public int gety() { return (int)(y / applet.MAGNIFI); }
public int getspeed() { return speed; }
public int getdir() { return dir; }

//* -------------------------------------------------------- */
public int distanceto( int dstx, int dsty ) {
int srcx = (int)( x / applet.MAGNIFI );
int srcy = (int)( y / applet.MAGNIFI );
int dx = Math.abs( dstx - srcx );
int dy = Math.abs( dsty - srcy );
return (int)Math.sqrt( dx*dx + dy*dy );
}

//* -------------------------------------------------------- */
public int dirto( int dstx, int dsty ) {
int distance = distanceto( dstx, dsty );
int srcx = (int)(x / applet.MAGNIFI);
int srcy = (int)(y / applet.MAGNIFI);
int dx = dstx - srcx;
int cos;
int ii;

if( 0 == distance )
return 0;

cos = dx * 100 / distance;

if( distance <= dx ) { // cos0/180 exception
if( dx > 0 )
return 0;
else
return 180;
}

if( srcy > dsty ) {
for( ii = 0; ii < (180/DGREE_RESOLUSION); ii++ ) {
if( COS[ii] <= cos ) {
break;
}
}
} else {
for( ii = (360/DGREE_RESOLUSION)-1; ii >= (180/DGREE_RESOLUSION); ii-- ) {
if( COS[ii] <= cos ) {
break;
}
}
}

return ii * DGREE_RESOLUSION;

}

//* -------------------------------------------------------- */
public void proceed(long elapsed) {
// elapsed 経過時間

if( STATE_NON_ACTIVE == state ) {
return;
}

x += ( (COS[dir/DGREE_RESOLUSION] * speed * elapsed) / 1000 );
y += ( (SIN[dir/DGREE_RESOLUSION] * speed * elapsed) / 1000 );

if( x < 0 ) {
x = 0;
rotate( 180 - (dir * 2) );
} else if( applet.SCREEN_DX * applet.MAGNIFI < x ) {
x = applet.SCREEN_DX * applet.MAGNIFI;
rotate( 180 - (dir * 2) );
}

if( y < 0 ) {
y = 0;
rotate( dir * -2 );
} else if( ( applet.SCREEN_DY ) * applet.MAGNIFI < y ) {
y = ( applet.SCREEN_DY ) * applet.MAGNIFI;
rotate( dir * -2 );
}
}
}
OAPはKDDIのBREWのキーイベント構造に縛られます。
一番困るのが、キーイベントの間隔です。
1回目のキーイベントから2回目のキーイベントが始まるまでの時間と2回目からそれ以降のキーイベントの入力タイミングが違ってきます。(いわゆる長押し状態の時は間隔が短い)

テトリスなんかだとこれでも良いかもしれませんが、自動車レースのゲーム等を作っていて、かつ、スレッドループが一定間隔ではないときに問題があります。

そこで一定間隔のキー入力がほしいとき、メインのCanvasからThreadを作って一定間隔のキー入力を実現します。


class KeyInput implements Runnable {

static final int INTERVAL = 100;
static MyCanv canv;
public KeyInput(MyCanv c) {
canv = c;
}

public void run() {
// applet.bThreadLoop がfalseでスレッド終了
while(applet.bThreadLoop) {
int keyState = canv.getKeyStates();
canv.keyInput( keyState );
try {
Thread.sleep(INTERVAL);
} catch( Exception e ) {}
}
}
}
大変参考になります

ありがとうございます!

java5ヶ月とは思えません!

携帯から見てますのでまたPCからみれた際に再コメントしますね
ちょっとmixiでソースを記載する事に限界を感じましたので、これらのものはウェブへ引っ越す事にしました。
引越ししました。
http://urana.info/mobile/midp/index.html
はじめまして^^
私はキー処理を毎フレームやってます(><
このやり方だと間隔を気にせず出来るかな、、と思ってるのですが、
私もjava経験が一ヶ月くらいですので
もしも勘違いでしたらすみません(^^;


void run()
{

int keyBef; // 過去のキー入力
int key; // キー入力


// メインループ
while(true)
{ 

keyBef = key;
key = getKeyState();

// 押した瞬間
  if( (((key^keyBef)&key) & GameCanvas.KEY_FIRE_PRESSED) != 0 )
{
// 押した瞬間の処理、又は押した瞬間を表すフラグを立てるなど
}
// 押し続けている間
else if( ((key&keyBef) & GameCanvas.KEY_FIRE_PRESSED) != 0 )
{
// 押し続けている間の処理、又は押し続けている間を表すフラグを立てるなど
}
  // 離した瞬間
else if( (((key^keyBef)&keyBef) & GameCanvas.KEY_FIRE_PRESSED) != 0 )
{
// 離した瞬間の処理、又は離した瞬間を表すフラグを立てるなど
}

}

}
という感じのをスレッドのメインループの最初に入れています。
このやり方だと、毎フレームキー操作処理を行うので間隔を気にすることはないでしょうか、多分。。。

でもキー入力のメソッドがあるわけですし、邪道なやり方ですよね(^^;
邪道とは思いませんが、パフォーマンスがもったいないのでkeyPressedやkeyReleasedを使った方が良いような気もします。結局VMが保持しているフラグ自体(BREW側の)EVT_KEYを元にしているはずですから。
keyPressed() {flag = true};
keyReleased() {flag = flase};
while{
if( flag ) {キーが押され続けている処理;}
}

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

オープンアプリ 更新情報

オープンアプリのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。