とある文系SEの開発日記

とある文系SEの開発日記

文系学部から某SIerに就職が決まったぺーぺーエンジニアのブログ

Amebaでブログを始めよう!
AndEngineを使っててAPKに変換しようとすると



Conversion to Dalvik format failed with error 1」これがガンガン出てくる!うざいほどに!


多分原因はAndEngineのプロジェクトをライブラリの参照に追加してるからだと思われる



そこで色々ぐぐってみると何とか解決できた


やり方は

1、まずライブラリの「AndEngine」を削除する。

2、「AndEngine」の"libs"の中身を、自分のプロジェクトの"libs"にコピー

3、「AndEngine」の"bin > andengine.jar"を、自分のプロジェクトの"libs"にコピー

4、自分のプロジェクトの"プロパティ>ビルドパス>Jarの追加"でさっきの"andengine.jar"を追加

5、"プロパティ>ビルドパス>順序およびエクスポート"でandengine.jar"にチェック


これで解決した


なんか色々AndEngineはめんどくさいことが多い…
脳トレしながらLvが上がるRPGを作りたい!と思いゲーム開発を始めました。



以前作ったゲーム(ただのもぐらたたき)はCanvasにSurfaceViewやらを駆使して無理矢理形にしたゲームだったので、今回はゲームエンジン(フレームワーク)を使おうと思いました。


今回はAndEngineを使いました


AndEngineはプログラミング歴3か月で「AndEngineでつくる2Dゲーム」という本を買って挑戦したのですが、訳が分からなくて挫折しました


ですがあれから半年経って読み返してみると…


わかる!!わかるぞ!!


本に書いてあることが分かる!半年で結構成長したようです


そして完成したアプリがこれです↓

⇒脳トレクエスト

とある文系SEの技術記録 とある文系SEの技術記録


AndEngineは効果音再生したりとか画像表示させたりとかがいちいちめんどくさいです。


メリットはSceneを使って画面を変えれるという点と、「AndEngineでつくる…」に載ってあるサンプルを見れば大体のことは解決できるという点です。


AndEingine使うなら絶対この本は買った方がと思います


AndEngineは使い始めこそ苦戦しますが、一回完成させると次から簡単にアプリが作れそうです


今度は話題のUnityで作ってみようかな
ゲームなどでよく使う当たり判定


やり方としてはキャラクターの領域を調べて、重なりがあれば当たり判定という感じ

とある文系SEの技術記録


四角形の当たり判定のアルゴリズムを調べてたら出てきたのがこれ



//重なりがあればtrueを返す
boolean isDuplicate() {
Rect r1 = new Rect(x1, y1, w1, h1);
  Rect r2 = new Rect(x2, y2, w2, h2);

  boolean checkX = false;
  boolean checkY = false;
  
  if((x1 >= x2) && ((x2+w2) >= x1))
  checkX = true;
else if((x2 >= x1) && ((x1+w1) >= x2))
checkX = true;
if((y1 >= y2) && ((y2+h2) >= y1))
checkY = true;
else if((y2 >= y1) && ((y1+h1) >= y2))
checkY = true;

return (checkX && checkY)
  
}




これで当たりを判定ができた。


でもこれでやるとx,y,1,2とか大量に書くので超見にくい。



そこで、Rect.intersects()という便利なメソッドを使えばもっと簡単にできた


これを使うと



boolean isDuplicate() {
  Rect r1 = new Rect(x1, y1, w1, h1);
  Rect r2 = new Rect(x2, y2, w2, h2);

  return Rect.intersects(r1, r2);
}



これだけで済む


intersects(Rect rect1, Rect rect2)はrect1とrect2に重なりがあればtrueを返すという構造


超便利です



シューティングゲームの当たり判定とかで重宝します



例えば


class Charactor {
private int x,y,w,h;

Charactor(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}

public Rect getRect(){
return new Rect(x,y,w,h);
}
}

class Bullet extends Charactor{

public Bullet(int x, int y, int w, int h){
super(x,y,w,h);
}
}

class Enemy extends Charactor{

public Enemy(int x, int y, int w, int h){
super(x,y,w,h);
}
}




こんな感じでキャラクター全般、弾、敵クラスを作って




Bullet bullet = new Bullet(20,20,20,20);
Enemy enemy = new Enemy(50,50,50,50);


//当たり判定
public boolean isDuplicate(Rect r1,Rect r2) {
  return Rect.intersects(r1, r2);
}





//bulletとenemyの当たり判定を調べる

isDuplicate(bullet.getRect(), enemy.getRect());





こんな感じで使えたりします

すごく基本的なことかもしれないがArrayListのデータのindexについて誤解があったのでメモっておく





ArrayList array = new ArrayList();

array.add("A");
array.add("B");
array.add("C");
array.add("D");



例えばこんな感じでデータを格納したとする。

index0 ← A
index1 ← B
index2 ← C
index3 ← D


このとき、

array.remove(1);

index1の要素"B"を取り除くとどうなるか


index1 ← ?


結果的には

index1 ← C

となる。


この辺を少し誤解していました。


index1が変数みたいに、nullになってしまうんじゃないかという勘違い


要素が前に詰められるんですね。


詰められるという表現も微妙な所ですが、とりあえずそういう覚え方でいこうと思います



public class ArrayListTest {

public static void main(String[] args) {

ArrayList<String> array = new ArrayList<String>();

array.add("A");
array.add("B");
array.add("C");
array.add("D");

array.remove(1);

System.out.println(array.get(0));
System.out.println(array.get(1));
System.out.println(array.get(2));

}
}




【実行結果】


A
C
D

アメリカのスマホのダウンロードランキングを見てたら懐中電灯アプリが結構上位だったのでちょっと作ってみようと思いました



作ってみると超簡単で20分ぐらいでできました



これで他のアプリと差をつけようと思ったらデザインで差をつけるしかなさそうです…



一応コードも載せておきます






import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;

import com.flashlight.R;

/**
* メインアクティビティ
* @author shingo
*
*/
public class FlashLightActivity extends Activity {

    //カメラオブジェクト
private Camera camera;

//カメラのモード
private String cameraMode;
    
    //電源ボタン
private Button switchBtn;

//スイッチフラグ
//1なら点灯、-1なら消灯
int switchFlag;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

switchBtn = (Button)findViewById(R.id.switch_btn);

camera = Camera.open();

//カメラの初期設定(点灯)
cameraMode = Camera.Parameters.FLASH_MODE_TORCH;
switchFlag = 1;

setCameraParameters();
}

//カメラのon、offスイッチ
public void onSwitch(View view) {
switchFlag *= -1;
if(switchFlag > 0) {
cameraMode = Camera.Parameters.FLASH_MODE_TORCH;
switchBtn.setBackgroundResource(R.drawable.btn_on);
}else{
cameraMode = Camera.Parameters.FLASH_MODE_OFF;
switchBtn.setBackgroundResource(R.drawable.btn_off);
}

setCameraParameters();
}

//カメラの呼び出し、設定を行う
public void setCameraParameters() {
Camera.Parameters params= camera.getParameters();
  params.setFlashMode(cameraMode);
   camera.setParameters(params);
   camera.startPreview();
}

@Override
  public void onStop(){
     super.onStop();
    camera.release();
  }
 
   @Override
  public void onPause(){
    super.onPause();
    finish();
  }

}




●Manifest.xmlに追加したコード


<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus"/>





こんな感じです。。。


カメラを呼び出しているので結構電池消費するのかな??

その辺はわからない…


switchFlagに-1を掛けてオン、オフの制御を行う当たりが独学でプログラム覚えた人のコードって感じがします


糞みたいコードですいません


もっと勉強します