rel@zx勉強雑記。
AndroidやゲームAIなどの覚書など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
さて、引き続き実装編行きます。
今回はどちらかと言うと覚書を…。
今回はどちらかと言うと覚書を…。
※本記事の記述や概念は間違っている可能性があります
アプリケーション共通仕様について
各アプリに必ず一つのエントリーポイントが必須。
記述は "public static void Main(string[] args)" のようにする。
Mainの部分は任意の関数名でも可能。
Main関数の中のwhileで更新と描画を書く。
アプリの終了処理は存在しない?
明示的なテクスチャー解放処理などは存在。
アプリケーション上には下地となるシーンがあり、
そこにパーツとしてNodeクラスを継承したオブジェクトを配置するイメージ。
・タッチ操作
タッチ操作は2通りの方法が存在。。
ケース1 : マルチタッチ、詳細なタッチを取りたい場合
while(true) {
SystemEvents.CheckEvents();
Update();
Draw();
}
のように書きます。
Updateの中身は以下の様な感じ。
Update() {
touchData.Statusでタッチイベントを取ることが出来ます。
ここで、注意点として、touchの座標は以下のようにy座標が反転した状態となっています。
(残念な画像ですみません…||orz)
座標範囲は -0.5~0.5の値しか取らないため、スクリーン座標に変換するため、0.5を加算し、
スクリーンの縦幅をかけています。
これを実際のキャラクターの移動などに反映させれば完了です。
ケース2:とりあえず一点タッチを取りたい場合
上記のような複雑な処理を1行で済ませる方法があります。
if (Input2.Touch00.Down) のように書くと、タッチ中の処理を簡単に
書くことが出来ます。
座標を取る場合は、
Director.Instance.CurrentScene.Camera.GetTouchPos();
などをPositionに代入するだけでOKです。
注意点は、先程とは座標系が異なっており、
画面左下原点を取る、X方向右向き、Y方向上向きの座標を取ることです。
数学などで用いられるグラフの座標系を思い浮かべると良いと思います。
・2Dスプライト表示
続いてスプライト表示です。
スプライト表示を行う前の準備段階として、ソリューションウインドウ内の参照を右クリックし、
参照アセンブリの編集を選択します。
Packagesタブを開き、"Sce.PSS.HighLevel.GameEngine2D"にチェックをつけます。
あとはソースコードの先頭に以下の2行を追記します。
メインループに入る前のスプライトを以下のように定義します。
Math.Lerpの3番目の引数でどのくらいの速度で目標地点にたどり着くかを設定しています。 最後に現在、出来てる所を晒したいと思います。
アプリケーション共通仕様について
各アプリに必ず一つのエントリーポイントが必須。
記述は "public static void Main(string[] args)" のようにする。
Mainの部分は任意の関数名でも可能。
Main関数の中のwhileで更新と描画を書く。
アプリの終了処理は存在しない?
明示的なテクスチャー解放処理などは存在。
アプリケーション上には下地となるシーンがあり、
そこにパーツとしてNodeクラスを継承したオブジェクトを配置するイメージ。
・タッチ操作
タッチ操作は2通りの方法が存在。。
ケース1 : マルチタッチ、詳細なタッチを取りたい場合
while(true) {
SystemEvents.CheckEvents();
Update();
Draw();
}
のように書きます。
Updateの中身は以下の様な感じ。
Update() {
List<TouchData> touchList = Touch.GetData(0);
Input2.Touch.SetData( 0, touchList );
foreach(var touchData in Touch.GetData(0)) {
if (touchData.Status == TouchStatus.Down ||
}foreach(var touchData in Touch.GetData(0)) {
if (touchData.Status == TouchStatus.Down ||
touchData.Status == TouchStatus.Move ) {
// 座標取得
int pointX = (int)((touchData.X + 0.5f) * rectScreen.Width);
// 座標取得
int pointX = (int)((touchData.X + 0.5f) * rectScreen.Width);
int pointY = (int)((touchData.Y + 0.5f) * rectScreen.Height);
}touchData.Statusでタッチイベントを取ることが出来ます。
ここで、注意点として、touchの座標は以下のようにy座標が反転した状態となっています。
(残念な画像ですみません…||orz)
座標範囲は -0.5~0.5の値しか取らないため、スクリーン座標に変換するため、0.5を加算し、
スクリーンの縦幅をかけています。
これを実際のキャラクターの移動などに反映させれば完了です。
ケース2:とりあえず一点タッチを取りたい場合
上記のような複雑な処理を1行で済ませる方法があります。
if (Input2.Touch00.Down) のように書くと、タッチ中の処理を簡単に
書くことが出来ます。
座標を取る場合は、
Director.Instance.CurrentScene.Camera.GetTouchPos();
などをPositionに代入するだけでOKです。
注意点は、先程とは座標系が異なっており、
画面左下原点を取る、X方向右向き、Y方向上向きの座標を取ることです。
数学などで用いられるグラフの座標系を思い浮かべると良いと思います。
・2Dスプライト表示
続いてスプライト表示です。
スプライト表示を行う前の準備段階として、ソリューションウインドウ内の参照を右クリックし、
参照アセンブリの編集を選択します。
Packagesタブを開き、"Sce.PSS.HighLevel.GameEngine2D"にチェックをつけます。
あとはソースコードの先頭に以下の2行を追記します。
using Sce.Pss.HighLevel.GameEngine2D;
using Sce.Pss.HighLevel.GameEngine2D.Base;
メインループに入る前のスプライトを以下のように定義します。
var texture_info = new TextureInfo( new Texture2D("/Application/resources/player.png", false) ); var sprite = new SpriteUV { TextureInfo = texture_info }; sprite.Quad.S = texture_info.TextureSizef; sprite.CenterSprite(); sprite.Position = scene.Camera.CalcBounds().Center; // スプライトにスケジュールの追加 sprite.Schedule ( (s) => { if (Input2.Touch00.Down) { Vector2 touchPos = Director.Instance.CurrentScene.Camera.GetTouchPos(); System.Console.WriteLine( "point:(" + Director.Instance.CurrentScene.Camera.GetTouchPos().X + ", " + Director.Instance.CurrentScene.Camera.GetTouchPos().Y + ")"); sprite.Position = Math.Lerp( sprite.Position, touchPos, 0.1f); } } ); // シーンにスプライトを追加 scene.AddChild( sprite );これにより、タッチした箇所にキャラクターがついてくる挙動が実現できます。
Math.Lerpの3番目の引数でどのくらいの速度で目標地点にたどり着くかを設定しています。 最後に現在、出来てる所を晒したいと思います。
using System.Collections; using System.Collections.Generic; using Sce.Pss.Core; using Sce.Pss.Core.Graphics; using Sce.Pss.Core.Imaging; using Sce.Pss.Core.Environment; using Sce.Pss.Core.Input; using Sce.Pss.HighLevel.GameEngine2D; using Sce.Pss.HighLevel.GameEngine2D.Base; namespace relbox { public class BubbleShooting { static void Main(string[] args) { Log.SetToConsole(); Sce.Pss.Core.Graphics.GraphicsContext context = new Sce.Pss.Core.Graphics.GraphicsContext(); ImageRect rectScreen = context.Screen.Rectangle; uint sprites_capacity = 500; uint draw_helpers_capacity = 400; Director.Initialize( sprites_capacity, draw_helpers_capacity, context); Director.Instance.GL.Context.SetClearColor( Colors.Grey20 ); Director.Instance.DebugFlags |= DebugFlags.Navigate; var scene = new Scene(); scene.Camera.SetViewFromViewport(); var texture_info = new TextureInfo( new Texture2D("/Application/resources/player.png", false) ); var sprite = new SpriteUV { TextureInfo = texture_info }; sprite.Quad.S = texture_info.TextureSizef; sprite.CenterSprite(); sprite.Position = scene.Camera.CalcBounds().Center; sprite.Schedule ( (s) => { if (Input2.Touch00.Down) { Vector2 touchPos = Director.Instance.CurrentScene.Camera.GetTouchPos(); System.Console.WriteLine( "point:(" + Director.Instance.CurrentScene.Camera.GetTouchPos().X + ", " + Director.Instance.CurrentScene.Camera.GetTouchPos().Y + ")"); sprite.Position = Math.Lerp( sprite.Position, touchPos, 0.1f); } } ); scene.AddChild( sprite ); Director.Instance.RunWithScene(scene, true); while(!Input2.GamePad0.Cross.Press) { Sce.Pss.Core.Environment.SystemEvents.CheckEvents(); context.SetClearColor(255.0f, 255.0f, 255.0f, 255.0f); context.Clear(); Director.Instance.Update(); Director.Instance.Render(); //System.Console.WriteLine( "Call Render."); Director.Instance.GL.Context.SwapBuffers(); // SwapBufferの後に必ず呼ばなければならない. Director.Instance.PostSwap(); } Director.Terminate(); System.Console.WriteLine( "Terminated."); } } }色々間違ってる部分がありそうなので、気付き次第直していく予定です。
PR
COMMENT FORM
COMMENT