忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/23 23:06 】 |
gradleの書き方メモ
jarファイルはこの位置に書く



dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.google.android.gms:play-services:7.5.0'
}



PR
【2015/12/11 22:17 】 | Android | 有り難いご意見(0)
swapBuffers エラーが出るときは
動画広告を表示して戻ってきたときなど、
画面が更新されなくなる時がある
描画以外の処理はちゃんと実行されているので、音は鳴るし、操作もできる(ただし画面は動かない)

そんな時は、以下の処理を行う

動画広告を表示する前

#import "cocos2d.h"
#import "SimpleAudioEngine.h"

CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
CocosDenshion::SimpleAudioEngine::getInstance()->pauseAllEffects();
cocos2d::Director::getInstance()->stopAnimation();



動画広告が終わり、戻ってくる時

#import "cocos2d.h"
#import "SimpleAudioEngine.h"

cocos2d::Director::getInstance()->startAnimation();
CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
CocosDenshion::SimpleAudioEngine::getInstance()->resumeAllEffects();



これにて解決。
【2015/12/08 13:19 】 | cocos2d-x | 有り難いご意見(0)
ObjCのカテゴリとクラス拡張
本当に今更なのだがまとめ。

参考

◯カテゴリ(category)
カテゴリは元々クラスを分割して書くことが出来るようにするため考えられた言語機能
インスタンス変数を追加できない
「分割実装」

実行時に解決される
だから、インスタンス変数を追加できない
ソースコードが存在しない、ライブラリのクラスを扱うことができる


「実装を」分ける。
macの公式実装とか見ると、カテゴリ複数は「AppController.h」に書いてあって
実装側だけ複数の.mファイルに分かれていたりする。

既存のライブラリの拡張も可能(「拡張」と言っているがカテゴリー)

1クラスに1つしか書けない@implementationを、複数に分けるためにカテゴリーを作っている、とも言える


カッコの中にカテゴリ名を書く。

@interface Document(Ex)



実装側にインスタンス変数の宣言はできない。以下はエラーになる

@implementation Document(Ex){
//こういうことはできない。カテゴリでない大元の実装ファイルに書く
}




◯クラス拡張(extension)
privateな変数、メソッドの宣言に使う
インスタンス変数を宣言できる
宣言したメソッドはクラス本体の(=カテゴリ無しの)@implementationで実装
公式で「無名カテゴリ」ともいうらしい

コンパイル時に解決される
だからインスタンス変数を追加できる


記述は、カッコのカッコの中は空

@interface Document()



元の宣言(.hの@interface)とは別に、.mファイルの方に書くのが普通。

実装側でインスタンス変数の宣言も可能

@implementation{
//変数宣言
//@propertyは不可
}




【2015/11/17 12:38 】 | iPhone | 有り難いご意見(0)
GameCenterの実装
参考
【2015/10/17 16:15 】 | iPhone | 有り難いご意見(0)
シミュレータ向けビルド時にエラー
古いcocos2dで(3.3以前くらい)ビルドしたとき、以下のようなエラーが出るときがある。



つまり、
fputs$UNIX2003()
という関数がない、というのだ。($以降も含めて関数名。そんな付け方できたのか)

探してみると、自分で定義を追加すればいいというブログがある。
参考

使っているのは、CCImage.hらしい。
(このあたり、実装した人が勝手気ままにいろいろ外部関数を使っている感じがするのがcocos2dらしい)


で、当のCCImage.hファイルを探してみる。

cocos/platform/CCImage.h
cocos/platform/CCImage.cpp

にある。
でも見てみると、cppのほうにすでにそれっぽい実装がしてある(cocos2d バージョン3.2)


extern "C"
{
// To resolve link error when building 32bits with Xcode 6.
// More information please refer to the discussion in https://github.com/cocos2d/cocos2d-x/pull/6986
#if defined(__APPLE__) || defined(__unix)
#ifndef __ENABLE_COMPATIBILITY_WITH_UNIX_2003__
#define __ENABLE_COMPATIBILITY_WITH_UNIX_2003__
#include
FILE *fopen$UNIX2003( const char *filename, const char *mode )
{
return fopen(filename, mode);
}
size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
{
return fwrite(a, b, c, d);
}
char *strerror$UNIX2003( int errnum )
{
return strerror(errnum);
}

#endif
#endif



なので、この後ろにfputsを追加


int fputs$UNIX2003(const char *res1, FILE *res2)
{
return fputs(res1,res2);
}




これで動いた。


【2015/10/05 17:36 】 | cocos2d-x | 有り難いご意見(0)
QuadCommandでエラーのとき
cocos2d-xで、こんなエラーがでるときがある。



QuadCommand::init() 関数で、
glProgramState が null になっている。


これは、Spriteの初回draw()で発生する。

原因でよくあるのは、Sprite::init() が呼び出されていないとき。


Spriteクラスを継承して独自クラスにしたとき、
init()の中で

Sprite::init();


を忘れていないかチェック!

【2015/10/02 13:11 】 | cocos2d-x | 有り難いご意見(0)
画面のサイズ
Screen.width
Screen.height
は、端末のサイズに依存する。
また、Unity上実行では、Gameビューのサイズに応じて変わる。

マウス位置を取得したいときは、
Input.mousePosition()
で取得できるが、これはScreenのサイズ。つまり端末やGameビューサイズによって変わる。

そこで、想定ゲーム画面サイズに変換するには


const float SCREEN_WIDTH = 640;
const float SCREEN_HEIGHT = 1136;
Vector3 getTouchPositionInScreen() {
Vector3 touchPos = Input.mousePosition;
float x = touchPos.x / Screen.width * SCREEN_WIDTH;
float y = touchPos.y / Screen.height * SCREEN_HEIGHT;
return new Vector3 (x, y);
}




呼び出し側は、
タッチから取得する場合(スマホ実機用。Unity上では反応しない)

for (int i = 0; i < Input.touchCount; ++i) {
Touch touch = Input.GetTouch(i);
if (touch.phase == TouchPhase.Moved) {
Vector3 touchPos = getTouchPositionInScreen();
print(touchPos);
}
}




マウスで取得する場合(Unity上でも実機上でも動く)

if (Input.GetMouseButton(0)) {
Vector3 touchPos = getTouchPositionInScreen();
print(touchPos);
}





のような感じになる。

このとき、シーン内のカメラやテクスチャ等全てのオブジェクトが左下を(0,0)基準で置いてあること。
Unity空間の原点が、カメラ(つまりスクリーン)の中心の場合は、上の関数で言うと、画面半分だけ戻り値のVectorの値を足す(右上に移動する)ことが必要。
【2015/09/26 13:04 】 | UNITY | 有り難いご意見(0)
2Dの表示
2D設定でプロジェクトを作成。

テクスチャは、画像ファイルをそのままアセットに入れて、シーンに配置してやればよい。
Transitionのx,y,zは全部0にしておけば、中心に配置される。
このとき、
Pixels per Unit
の項目が、デフォルトで「100」になっている。

つまり、テクスチャの100pixelがUnity上で1メートルになるサイズで配置されている訳だ。




ということは、640x1136の画像なら
6.4m x 11.36m の大きさでUnity空間に置いてあることになる。


ここで、カメラ(もちろん平行投影=Orthographicになっている。2D設定でプロジェクトを作っていれば。)の設定も行う。
カメラが映す範囲は、
Orthographicの下の Size で指定する。(スクリプト上では、orthographicSize というプロパティ)
これは、カメラが映す範囲の高さの半分の値。
なので、1136pxlの場合、568になる。

ただし、これはメートルであることに注意。
さっき、Pixels per Unitが100だったので、
実際に指定する値は
「5.68」
になる。




Pixels per Unitを1にして、dots by dotにしたほうが便利なのでは?

→全体がでかくなり過ぎ(640m x 1.136km)て、あたり判定とか演算が面倒?

とりあえず同じことだと思うので、このままでいいんじゃない?
【2015/09/26 12:38 】 | UNITY | 有り難いご意見(0)
AndroidStudio
Android Studioを導入。
ずっとEclipse+ADTでやってきたが、これを機にやっとこさAndroidStudioに入る。
こういうきっかけがないとなかなか始めない(今まで作ってきたゲームの改良続きだと、環境を変えないでも十分すぐに作れてしまうし)

というわけでまずはダウンロード

パッケージが展開されるところまでは問題ないだろう。

Android Studioを起動するとWelcome画面になる。

今回は、gradleを使用したサンプルプロジェクトが用意されていたので、
以下のように、gradleプロジェクトをインポートする。



選択するディレクトリはココ。
appやgradleディレクトリ、settings.gradleの1つ上。


すると、こんな感じでプロジェクトが開く。
ちなみに赤丸囲みのところ、初めは「Android」になっているが、
「Project」に変えておくと、実際のディレクトリ構造と同じように表示される。慣れるまではこちらのほうがよさそうだ。ディレクトリ追加などもここからできるようになる。



さて、さっそくビルドしようとすると(というかバックグラウンドで勝手にビルドしてる)
いくつかエラーが発生。



うむ。SDKのandroid-22がないと。
リンクを踏むと、勝手にインストールし始める。



簡単だ!
Eclipseのときとは大違い。


再度ビルドするが、またエラー。


なるほど。ツールのほうもないと。
ではリンクを踏みましょう。



で完了。
うう〜ん、べんり!

こんな感じで、エラーを解決させていけば、ビルドできた。


ちなみに、ビルド設定などは build.gradle に書く。
依存関係など。


見て分かるように、SDKバージョンもbuild.gradleに書くようになっている。
AndroidManifest.xml には書かない!

とりあえず、いろいろ分かりやすくなっているぞ!


【2015/08/25 11:28 】 | Android | 有り難いご意見(0)
収益自動集計スクリプト
毎日いろんな広告の情報を取ってくるのが面倒くさい。
というわけで自動化した。

まず、wgetとかで情報を取得するところからやろうとした。
が、当然認証とかしないと取って来れない。ちょいと面倒くさい。
APIとして用意されてる訳でもない。
htmlを解析する…というのはありえないとして。
csvを取ってくるのが常套だろう。

が、そこはめんどいので、とりあえずcsvをダウンロードするのは手動でいったん妥協。


Rubyスクリプトで、csvを解析して必要な情報だけを取り出す部分を作成する。

RubyにはCSVクラスがあり、若干の癖はあるものの、CSVの読み込み、書き込み、アクセスなどいろいろ便利にやってくれる。
参考

CSVファイルの中身を一気に全部読み込むには

table = CSV.table(filename)


とする。tableはCSV::Tableクラスのインスタンスになり、超便利にデータにアクセスできる。
ただし日本語が取り込めないので、日本人としては使いどころは限定される。


CSVファイルの中身を一行ずつ読み込むには

CSV.foreach(filename) do |row|
:
:
end



を使う。rowは配列になる。


エンコードを指定することもできる。
第2に引数に指定。

CSV.foreach(filename, encoding: 'Shift_JIS:UTF-8') do |row|


とすると、Shift_JISのCSVファイルを読み込み、UTF-8に変換して扱うことができる。便利。


ファイル自体の文字コードをUTF-8に変換する場合は

$ nkf -w --overwrite filename


とする。(-w がUTF-8に変換するオプション。 -s だとShift_JIS、-e だとEUC-JPになる)


出力は

CSV.open(filename, "wb") do |csv|
csv << row1_data
csv << row2_data
:
:
end


となる。

◯コツ
入力ファイル名はスクリプトの第1引数で指定
出力はファイル名指定でもいいが、そのまま標準出力させたほうが扱いやすいともいえる。
ただ、2重配列をそのまま
p data
という感じで出力してもcsvファイル形式にはならないので、おとなしく引数で指定しよう
([["2015/07/01", "1000"], ["2015/07/02", "2000"], ... のように、角カッコやダブルクォートがついてしまう)


◯ディレクトリ
広告ごとに各ディレクトリを作成。
中に、同名のスクリプトを置いておく。


top
+-- nend
+-- parse.rb
+-- imobile
+-- parse.rb
+-- admob
+-- parse.rb



各ディレクトリに入って、各社管理画面からダウンロードしてきたcsvを使えば、1社ずつデータを抽出できる。


◯全部まとめて

さて、全社まとめて処理したい。
先ほど作った各社のparse.rbを呼び出す、統括スクリプトとでも呼ぶべきスクリプトを作る。

スクリプトファイル名は同じにしてあるので、topディレクトリで

#{ad}/parse.rb
を実行すればいい。

ダウンロードしてきたcsvファイルの指定だが、
各社思い思いの名前になっている。
(nendだと、nend_m_20150801_20150804.csv 、imobileだと 日別レポート_20150801-20150804.csv、 admobだとadmob-report.csv など)
ダウンロードして、毎回毎回ファイル名を変更するのはごめんだ。
このファイル名のまま実行できるようにしたい。
特定のディレクトリにそのファイル1つだけを入れる、とかすれば

`ls path/to/dir`.chomp


とかでできるが、毎回全csvファイルを別ディレクトリに保存するのもめんどい。
dataディレクトリは1つで、ファイル名を検索するのがよい。
というわけで、

`ls -1r path/to/dir nend_m_*.csv`.gsub(/\n.*/, "")


というふうにした。
ls -1 オプションは、ファイルを1行ずつ表示。
ls -r オプションは、ファイル名を降順に表示。最新の日付の入ったファイル名から取得するイメージ。(YYYYMMDDじゃなかったらダメになるものもあるきがするが)
gsubは、2行目以降を削除している。


結果出力は
#{ad}/output.csv
のようにやはり名前を統一しておく。


csvに全部まとめた最終出力を行い、
Numbersで自動で開く。

`open -a Numbers #{outfilename}`




で、ダブルクリックで実行できるようにするため、
シェルスクリプトからこのRubyスクリプトを呼び出す。

#! /bin/sh
cd `dirname $0`
ruby correct.rb



このシェルスクリプトを右クリックし、「このアプリケーションで開く」 で「ターミナル」を指定
これで、Finderでダブルクリックで実行できるようになった。

キモは
cd `dirname $0`
で、カレントをファイルの場所に移動させたい。
これが必要なので、Rubyスクリプトをダブルクリック実行させてもうまくいかないのだ。


【2015/08/05 18:09 】 | 開発一般 | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>