今回はダチョウのモモ肉を使用しました。
ほぼ赤身の部位で、脂肪が少なく、ほぼタンパク質です。
ミネラルが豊富で、カルニチン、クレアチンは脂肪燃焼を助けてくれるので、ダイエットに適しています。
鶏肉を食べているという感覚とは違いますね。
とても美味しかったです。
![全般ランキング](https://i0.wp.com/taki-lab.site/bocci/wp-content/uploads/2019/12/ff0b9aef338ee31b78785f9b41e1f365.png?w=474)
今回は画像を使ってみます。
画像はスプライトと呼ばれる単位で扱われます。
例えば、ただ画面に画像を表示する場合は、
bool SampleScene::init()
{
//////////////////////////////
// 1. super init first
if ( !Scene::init() )
{
return false;
}
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// add "HelloWorld" splash screen"
auto sprite = Sprite::create("pipo-charachip001b.png");
if (sprite == nullptr)
{
problemLoading("'pipo-charachip001b.png'");
}
else
{
// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite, 0);
}
return true;
}
画像をResources/res配下に設置し、
Sprite::create(“[画像ファイル名]”)スプライトの作成。
setPosition()で表示位置を決めてaddChild()でスプライトを設置すれば表示されます。
でも大抵は一枚の絵の中にいくつものパーツがまとめられているのが普通です。
なので、画像をクリッピングして、一部だけを表示させます。
// add "HelloWorld" splash screen"
auto sprite = Sprite::create("pipo-charachip001b.png", Rect(0,0,32,32));
if (sprite == nullptr)
{
problemLoading("'pipo-charachip001b.png'");
}
else
{
// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite, 0);
}
auto sprite2 = Sprite::create("pipo-charachip001b.png", Rect(0,32,32,32));
if (sprite2 == nullptr)
{
problemLoading("'pipo-charachip001b.png'");
}
else
{
// position the sprite on the center of the screen
sprite2->setPosition(Vec2(visibleSize.width/2 + origin.x + sprite->getContentSize().width, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite2, 0);
}
return true;
じゃあ、これを使って、アニメーションさせます。
auto sprite = Sprite::create("pipo-charachip001b.png");
if (sprite == nullptr)
{
problemLoading("'pipo-charachip001b.png'");
}
else
{
// position the sprite on the center of the screen
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
// add the sprite as a child to this layer
this->addChild(sprite, 0);
}
Vector<SpriteFrame*> animFrames;
animFrames.reserve(12);
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,0,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,0,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,0,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,32,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,32,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,32,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,64,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,64,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,64,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,96,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,96,32,32)));
animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,96,32,32)));
Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.1f);
Animate* animate = Animate::create(animation);
sprite->runAction(RepeatForever::create(animate));
auto moveBy = MoveBy::create(2, Vec2(50, 0));
sprite->runAction(moveBy);
return true;
SpriteFrameを組み合わせてAnimationを作成し、それからAnimateを作成します。
これからアクションを作成して、実行させます。
なかなか良い感じじゃないですか?
Pixel3からPixel4aに乗り換えたのですが、
非常に快適に動作しております。
Pixel3で動いていたアプリはほとんど動きますし、
最近始めた、戦国RENKAも問題無く動いております。
こういった3Dゲームでも問題ありません。
Pixel3のプロセッサーはSnapdragon 845であるのに対して、
Pixel4aのプロセッサーはSnapdragon 730Gです。
8XX番代はハイエンドプロセッサーにつけられる番号で、
7XX番代はミドルレンジプロセッサーにつけられる番号です。
この下には6XX番代もあり、これは低価格帯のスマホで使用されているプロセッサーです。
845と730Gは730Gの方が一世代新しいのですが、ハイエンドの845よりも快適に動いているように感じます。
おそらく、これはメモリ容量の差だと思うんですが、
それを考えると、いままではハイエンドの性能を生かし切れていなかったような気がしています。
やっぱり一般人にはハイスペックなんて必要なかった。
性能を生かし切れていない高い端末を買うよりも、安価でそこそこ動く端末の方がお買い得だと思いませんかね?
そう考えると、Pixel4aのコスパは最強で、低価格スマホで失敗するよりは、多少お金を積んでもPixel4aを勧めます。
ほんと、欠点は防水じゃ無いぐらいしか見つからない。
こちらのサイトに無限繁殖機構が紹介されていました。
https://wikiwiki.jp/craftopia/
リンク先は絵になってわかりづらいと思いますが、
要は、このように配置するみたいです。
矢印はコンベアーの動く向きです。
こうすることで牛が繁殖機に集まることになり、
自ら繁殖機の上に乗ってくれます。
上に積み重なっていくのは何でだろうねぇ?
もうちょっと細工すれば溢れた動物を処理できるかも。
前回までの状況はこちら。
はい、大幅に書き換えました。
詳細はgitHubのソースを見て欲しいのですが、
https://github.com/takishita2nd/HokkaidoWar
まず、メインシーンで使用していたデータは全てGameDataクラスに移動しました。
class GameData
{
public enum GameStatus
{
None,
SelectCity,
ActionEnemy,
ActionPlayer,
ShowResult,
GameEnd,
GameOver
}
public GameStatus gameStatus = GameStatus.None;
public List<City> Cities = null;
public List<City> AliveCities = null;
public Battle Battle = null;
public Player Player = null;
このクラスはシングルトンで管理します。
class Singleton
{
private static GameData _gameData = null;
public static GameData GetGameData()
{
if (_gameData == null)
{
_gameData = new GameData();
}
return _gameData;
}
このシングルトンクラス、ゲッターのでいいんじゃないかと思い始めた。
やっていることは同じですが。
メソッドでやるか、プロパティでやるかの違いです。
気が向いたら直します。
シーン遷移は全てシーンクラスのインスタンスを作り直します。
if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
{
var scene = new MainScene();
asd.Engine.ChangeScene(scene);
}
そのときに、ゲームデータを元に画面を作り直す、という感じです。
これで、バトルシーンからメインシーンに切り替わっても、ゲームが止まることは無くなりました。
これでやっと次に進める・・・。
繁殖機という設備がクラフトできたので、使ってみました。
繁殖機の上に赤い部分が二つあるので、ここに動物を運ぶと、繁殖機が動物を産みだしてくれます。
とは言っても無限ではないので、繁殖元の動物が死ぬと、繁殖機の動きが止まります。
あと、動物を運ぶのには、モンスタープリズムというアイテムが必要です。
はい、あのポケモンのあの丸いボールのような物です。
ある程度ダメージを与えて、このボールをぶつけると動物を捕まえることができ、好きなところに出現させることができます。
とりあえず、逃げないように囲って、繁殖場を作ってみたのですが、
勝手に動物が繁殖機に乗ってくれるような仕組みって無いんですかね?
あと、繁殖させた動物を処理する仕組みも考えてみたのですが、
コンベアーが燃えてしまいました。
壁も木材使うと燃えるので、これもダメですね。
コンベアーで上に運んで焚き火の上に落下させる方法が良いのかもしれない(確か、まだ作れない)
そろそろ次の文明に発展させるか・・・
前回作ったバトルシーンを、既存の状態遷移に組み込んでみました。
変更前はこんな感じでした。
結構複雑になってきましたね。
でも修正はそんなに難しくない・・・と思いきや。
どうやらシーンは切り替えるごとに作り直さなくちゃいけないらしくて
バトルシーンからメインシーンに切り替わるときに、OnUpdated()処理が走らないという。
おそらくシーンのプロパティにIsAliveというのがあって、
これはReadOnlyのプロパティなので、やっぱりシーンを作り直さなくちゃいけないんだろうなぁ、と思います。
ということは、ゲームデータはシーンとは別に保持しなくちゃいけなくて、
大幅に設計変更が発生しそう、
と分かった時に心が折れました。
まぁ、完成はさせたいので、時間があるときに修正しておきます。
というか、メリットしかない。
と言うのも、自分が過去にやらかしているから。
自分が東京で仕事していた頃、
東京都内は家賃が高いから、家賃の安い千葉県松戸市に住んでいました。
当時、通勤時間2時間かかってました。
朝定時に出社するために朝5時に起床し、終電まで仕事して家に着く頃には午前1時、という生活を当たり前のように送っていました。
当然、こんな職場にも問題はありましたが、
とにかく睡眠時間が取れないのがきつかった。
直近の職場、札幌では朝8時過ぎて家を出ても出社時間の9時には十分間に合っていたので、前者に比べれば歴然の差。
むしろ加齢で早く目が覚めてしまう方がきつかった。
とにかく、睡眠時間を確保するためにも、多少高くても狭くても職場に近い所に住むべき。
ということを学びました。
もう一つ。
東京って、満員電車がきつかった。
出社するだけで疲れてる。
長時間の満員電車で体力消耗するくらいなら、短い方が遙かに良い。
なんなら、電車使わなくても通勤できる方がいい。
東京でコロナの感染経路不明の感染者って、たぶん、電車の中で感染していると思います。
コロナ対策の面でも、通勤時間は減らすべき。
電車内で本読んだり勉強する時間が無い?
勉強は家でやれば良いだろう。
家を出る時間が遅くなる分勉強する時間は確保できているハズだ。
なんなら早く家を出て、おしゃれな喫茶店で朝活するのもいいだろう。電車の中で勉強するより遙かに快適だ。
とにかく、通勤で体を壊すという事態にはならないでもらいたい。
前回はコマンドでカメラを操作しましたが、
今回はプログラムからカメラを使用します。
やり方は2種類あるみたいで、
python-picameraを使用する方法と、
openCVを使用する方法です。
今回はopenCVを使用してみます。
なぜなら、openCVは画像解析なんかもできるので、今後も応用が利くかも、と思いましたので。
$ sudo apt-get install python3-opencv
pip3を使用するインストール方法もネットにありましたが、
こちらはインストールの過程でビルド処理がありますので、
実行すると、一日コースです。
apt-getを使用したほうが短時間で完了します。
(それでも数分かかります。)
from datetime import datetime
import cv2, os
def main():
cam = cv2.VideoCapture(0)
if cam == None:
return False
while True:
# カメラから映像を読み込む
_, img = cam.read()
cv2.imshow("preview", img)
# キーを入力した際に撮影を終了する
if cv2.waitKey(1) < 255: break
# 事後処理
cam.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
cam.read()を実行すると、処理結果と、frameデータが取得できます。
ここでは処理結果は使用しないので、_ と書いています。
imshow()を実行するとframeのデータを画面に表示されます。
それをwhileループしているので、プレビューのように映像が表示されます。
※ラズパイの画面をVNCのリモートデスクトップで表示させています。
最終的には、このframeデータをリモートに飛ばして表示させたい。
openCVは調べてみると、いろいろな事ができるみたいなので、もうちょっと調べてみます。