2019年9月29日日曜日

2度目のランクイン

…こんな事やってるから甲から丙に落とす羽目になるんだぞ…
さておき、Getしたアイテムは97夜攻とこちらの主砲。

97夜攻は97艦攻から2段階上の装備ですので、ネジが節約できて感謝。
で、こちらの主砲はアメリカ巡洋艦主砲だそうですが、3号砲とどっこいくらいかな?
ソバカス三つ編み妖精さんが居るので、この子が次のイベントで来る巡洋艦なんでしょうね。

…となると難しいのが97夜攻の扱い。
現在私が所持している夜攻は半年かかってクエストを解いた報酬のTBM―3Dのみです。
ならば97夜攻を改修するかと言うと、MAXまで鍛えてもTBM―3D以下という本装備。それでもなければ夜に出撃できる空母が減ってしまうのですが…
アメリカ巡洋艦主砲が着たという事は、次のイベントは対アメリカ戦モチーフがほぼ決まっています。となると、アメリカ製夜攻を獲得できる可能性が出てきます。
11月後半と思われる秋イベントで手に入るなら今から改修は微妙と見るべきか、夜の空母が主力になると信じて改修するべきか…うーん。

2019年9月26日木曜日

久々に見ましたわ

9/23の時点で甲でラスボスの耐久をラスダンまで減らしたんですけどね…
無理ゲーすぎる。
というわけで 9/24 に丙まで落としたのですが、ラスボスの耐久1/3からのスタート。
その後、友軍、道中航空隊のみの省エネ編成で2回出撃してあっさりクリア。
…やばい、6日は頑張ればよかったか?とはいえ万単位の資材課金をすればクリアはできたでしょうけど、それはなんか違う気がするのですよね。
とれたレア艦は新規2隻、リットリオ2隻、峯雲、海防4隻。他にも夕雲型が多数居ましたが、ジョンストン(電探)とU511(魚雷)以外はそれほど良いアイテムを持ってきませんし、イタリアの長距離砲も相当数持っているのでコレにてお開きかなと。
EO は 4-5 は解くにしても、5-5 6-5 は今月おやすみ。来月はサンマ漁ですしね。

今イベントの感想としては、もろもろ調整は頑張っていたと思います。
難易度も中間発表時点で甲突破が最多というのも解ります。ただし、第三海域の3段ギミック、てめーはダメだ。
難易度を落とした際にどれくらい進行度がロールバックされるのかアナウンスして欲しいですね。自分みたいに早まる人間が出そうなので。

さておき、難度で言えば命中率の低いダイソンや(多分)回避が低い潜水幼女等、「対策すればなんとかなる」感を出してきている印象でした。資材がある上で、海外艦の練度と対地兵器、そして基地航空隊の対潜兵器が十分揃っていれば甲でも攻略できたかと思います。
ドロップも、前回のような渋い設定では無かった為、確定新規艦を差し置いてドロップ艦のグレカーレが話題になっていたりしました。
このゲームはガチャでキャラを引く訳でもなければ、ガチャがメインコンテンツな訳でもありません。キャラを配った後の関連商品やコラボが収入源かと思います(ゲーム内課金販売も今でも全体のトップ10には入っていると思いますが)。欲しい人にキャラを配らないと商売が広がりません。
又、難易度が低い為かレアアイテムを持参する艦がほぼドロップしない、全海域に渡ってまるゆがドロップしないという近年では珍しい展開となりました。

もちろん、今後さんま、秋、冬と連続して続く展開に対して、トップバッターは緩く…という配慮もあったかと思いますが、全体を総括するなら「最後のギミック地獄を除けば、調整がうまく行ったイベント」かと思いました。

2019年9月23日月曜日

Python+Kivy 備忘録 ディレクトリ検索編

ネットで漁ったソースをくっつけ合わせて動けばOKという、ダメPGそのもののコーディングをしているのですが、KVファイルを介在させない FileChooser のコードすら日本語のページでは検索できなかったのですよ。いわんやディレクトリのみ検索をや、という状況になりまして。またもや休日が吹っ飛んだ結果がこちらになります。
コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

from os.path import join, isdir

#from kivy.uix.filechooser import FileChooserListView
from kivy.uix.filechooser import FileChooserIconView

#class DirectoryChooser(FileChooserListView):
class DirectoryChooser(FileChooserIconView):
  def is_dir(self,directory,filename):
    return isdir(join(directory,filename))

class MyWidget(BoxLayout):
  orientation='vertical'
  def __init__(self,**kwargs):
    super(MyWidget,self).__init__(**kwargs)
    self.dc =DirectoryChooser(size_hint_y=1)
    self.dc.filters=[self.dc.is_dir]
    self.add_widget(self.dc)

class MyApp(App):
  def build(self):
    layout = MyWidget()
    return layout

if __name__ == '__main__':
  MyApp().run()

※追記 ubuntu20.04 上の python3 + python3-kivy にて動作を確認しました
※追記 Android + Kivy Launcher 上ですと4.4~6までしか動作しないようです
尚、コメントアウトしている FileChooserListView の行と FileChooserIconView を入れ替えるとリストビュー型になります。

うーん。やっぱりKVファイル挟まない方が書きやすいと思う私は旧人類なんでしょうかねえ?

2019年9月19日木曜日

Python+Kivy 備忘録 画面遷移編

はい、Tips書くほど賢く無い、PG辞めて10年以上(現役期間より辞めた後の時間の方が長くなってしまいました)の人間が何を書いているんだって話ですけど、
歳なんで物忘れが激しいのですよ。
で、今回作った物はこんな感じ。
boxlayout 継承クラスの Display クラスの中に、boxlayout 継承クラスの SubDisplay クラスを作りまして、SubDisplay クラスの中にあるボタンを押すことで、SubDisplay クラスの再描画をやらせましょうというサンプルです。

change ボタンを押すと以上の二つの画面が交互に切り替わります。

コード

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label

class BtnChangeYoko(Button):
  def on_press(self):
    self.parent.parent.lMode.text='Yoko'
    self.parent.DrawYoko()

class BtnChangeTate(Button):
  def on_press(self):
    self.parent.parent.lMode.text='Tate'
    self.parent.DrawTate()
class SubDisplay(BoxLayout):
  def DrawTate(self):
    self.clear_widgets()
    self.orientation='vertical'
    b1 =BtnChangeYoko(text='change',size_hint_y=1)
    b2 =Button(text='dummy',size_hint_y=2)
    self.add_widget(b1)
    self.add_widget(b2)
  def DrawYoko(self):
    self.clear_widgets()
    self.orientation='horizontal'
    b1 =BtnChangeTate(text='change',size_hint_x=1)
    b2 =Button(text='dummy',size_hint_x=2)
    self.add_widget(b1)
    self.add_widget(b2)
class Display(BoxLayout):
  orientation='vertical'
  def __init__(self,**kwargs):
    super(Display,self).__init__(**kwargs)
    self.lMode = Label(text='Mode',size_hint_y=1)
    self.boxSub = SubDisplay(size_hint_y=9)
    self.add_widget(self.lMode)
    self.add_widget(self.boxSub)
    self.boxSub.DrawYoko()

class TestApp(App):
  def build(self):
    layout = Display()
    return layout

if __name__=='__main__':
  TestApp().run()

※追記 ubuntu20.04 上の python3 + python3-kivy にて動作を確認しました
※追記 Android 4.4/5/6/8 上の Kivy Launcher にて動作を確認しました 
ミソは button 継承クラスの BtnChange~ クラスのコールバック関数 on_press の中身。
各ボタンは SubDisplay クラスの子になるのですが、親の親である Display クラスの子の label (lMode)を書き換えて、親クラス SubDisplay の再描画関数 Draw~ を呼んでいます。

  • なんでこんなコードを書いたの?
確かにKV言語を使うと綺麗な配置のGUIが作れるんですけどね、ちょっと変わった動きや、画面の再描画処理を書き始めると…

「悪い、やっぱ辛えわ」

となりまして、なんというか kv と python の二つの仕様を跨いだ書き方を調べながら書くのが面倒というか、昔 MFC 継承クラスを作っていたので「何を作ったら良いかは解るけど、どう書いたら良いか判らない」事が頻発しまして、

「俺、コード直書きの事、好きだわ」

になってしまったのですよ。
実は作っているアプリでディレクトリ名を取得する処理を書いていて、FileChooser を調べたりしていたのですが、どうにも煩雑な処理になってきまして。シングルタップでディレクトリ名取得、ダブルタップで下階層へ移動するようにコールバックを改造するにはどうするんだ?となった折、流石に kv を交えているのは厳しいと。

そんな訳で、慣れるか壁にぶち当たるまでは kv 無しの kivy 道を走る事になりそうです。

2019年9月13日金曜日

夏休みの宿題2

E2沼ったんですけど、鋼材が4桁?になってるんですけどっ!
ネジを使う余裕もねェ
イベントの出し惜しみあるあるですが、今回はE1が独仏、E2が伊+アークロイヤル、E3が米英を全力で出してOKらしいですね。
E2甲で、量産型ビスマルク3(Lv80)を2隻投入したりしていましたが、ラスダンまでは余裕で突破できたもののその後ドはまり、イタリア戦艦を投入した挙句、援軍投入でクリアしました。
今回は組み分けが簡単なので、割となんとかなりそうですが、ラストはお約束のギミック地獄だとか。残りの資材を考えると、甲でクリアできるかは微妙ですが、掘りが終っているので挑戦せざるを得ません。

異常に暑い9月も急速に秋になるようで、我が家の温度計がこんな事になっているのですが…
1日で74%→47%
コレが不快指数だったか湿度だったかは忘れましたが、これだけ下がったせいか、起きた時にウィルス性の腹痛が…。
この時期怖いですねえ。

さて、前回(9/8)の宿題その1のスクリプトはその後全乗せ版の開発がとん挫したのですが、もう一つの宿題のお話。
お前の夏休みいつまであるんだよって時期ですが…

宿題その2アンドロイド+ Python で開発をするお話
…と、題していながら実は今回開発まで入れていません。

  • あらまし
とある事情で安く量産できる道具を作る必要がありまして、当時は中国産 Windows タブレットに Linux を載せて Pyton+Tkinter で開発していました。
…が、ここのページでしょっちゅう書いてある通り、安い 32Bit タブレットは Linux からも見放されつつあります。
更に、中華ウィンドウズタブレットは「8インチ以下のタブレットにタダで Windows (Bing)を載せる」という MS 社の施策や、Intel の Atom に乗っかった製品です。
ところが現在 MS社はタダで Windows を撒いていませんし(20年1月の Win7 終了後に Win10 が伸び悩んだ場合再開するかもしれませんが…)、Atom も Intel が開発を終了したため16年頃まであんなに乱造された中華ウィンドウズタブレットは今や絶滅危惧種になりつつあります。

となるとタブレットのスタンダード、 Android で開発をするしかないという方向になった訳です。(流石に、モバイル Windows や Linux は復活しないだろうし、Kirin OS が天下を取る未来もなさそうですし)

ただ、Python はともかく、GUI 操作系のライブラリが無いと難航しそうなの自明でした。とは言え、Android 上で動く Tkinter というのが見つけられなかった為、一歩下がって Python+Kivy に挑戦することに。これを実現できる開発環境が QPython という事まで判っていざ開発となったのですが…

  • 私にとっての QPython
はい、 QPython とは何か?はググれば判ります。いろんな事情から否定的な書き方をする方は少ないと思いますが…
私が触った感覚から書くと「オラついた残念な天才が作った開発環境」です。
スマホ単体で開発ができるコンパクトな環境、Kivy が利用可能など、コンセプトは良かったのですが…
バージョン毎に互換性が無い。
なにが酷いって上位互換すら無い。QPython は QPYPI という項目のサブ項目 LIBRARIES からサブのライブラリを取得する事になっていて、Kivy もココから落としてくるのですが…。
バージョンによって落とせるライブラリがマチマチ。
いろんなサイトや教書では QPython で Kivy を使う場合は Ver 2.0.6 を推奨していますが、9月現在動作せず、私の環境では 2.0.10 でないと動作しませんでした。
インストールは Playストアを通さず qpython.com から直接行うのですが、インストールしたらすぐに Playストアで自動アップデートを無効にしないと「勝手に開発環境がバージョンアップして動作しなくなる」という恐ろしい状況に直面します。

体験したというよりは まったく理解を 超えていたのだが……

「おれは QPyton をインストールしてテストコードの実行を確認したと思ったら
いつのまにかバージョンアップして動作不能になっていた」

おれも 何をされたのか わからなかった…(3日程ハマる)

…夏の休日が…
で、Ver2.0.10 で開発を始めたわけですよ。QPython の Editer は初めて開くとファイル名が Untitle となり、セーブ時にフォルダを選びます。
が、再度 Editer を起動すると最後に開いたソースコードを開きます。
ちなみに、 Editer の右上の「+」ボタンを押すと「セーブ先フォルダを指定した」新規作成ができます。

…インストール後初回以外フォルダーを指定してソースをセーブする事ができない?
正直、流石にこんな低レベルな仕様バグはありえないだろうと思っていろいろ操作方法を探しました。
Kivy を使ったアプリは通常 Python のコードを書く main.py があり、 GUI の設定関係を書き込む .kv ファイルを同フォルダに書く必要があります。
流石に .kv ファイルのセーブ方法が無いなんて…
ココで1週間ほどハマりました。夏休みに開発する予定だったのに予定が全て吹っ飛びました。

ちなみに、この問題は裏技的に解決できます。

1.Editer 上の「+」ボタンを押して File でソースを作成してセーブ。

2.Explorer を開いて scripts フォルダを開く。


3.先ほどセーブしたファイルがあるハズなので長押し。


4.右側に3個の項目ボタンが出るので、×を選択して削除。

5.再度 Editer を起動させると最後にセーブしたソースが無いので、フォルダ選択可能な新規ソース作成ができます。

…開発環境のデバッグが必要なんて、ポルナレフが過労死しそうです。
結局こんなしょうもない環境を使うわけにはいかず、Linux 上の Geany で極力ライブラリを使わずに アプリ開発を行い、 Android 上の動作確認をする時のみ QPython を使用する事になりました。

…デバッグもできない連中に開発環境を作らせないで欲しいものです

2019年9月8日日曜日

続・夏休みの宿題1

3日にはE2のラスダンに入ったのにまだ突破できまてません。
というか、空襲銀タコがバグっていたとか、「空襲力弱くしてました」…詫び空襲再びですか。

せっかくいい感じでリギングが終ってきているので流れを止めたくなかったのですが、
Blender のスクリプト作成…案外簡単に終わりました。

最も難しかった所は、 Python の文字列配列の扱いが判らなかった所…オイオイ。
相変わらず if ネストの深い残念なコードです。
以下コード

# pair vertexgroup maker

import bpy

if bpy.context.mode == 'OBJECT':
    # print all selected objects
    for obj in bpy.context.selected_objects:
        print(obj.name)
       
        if obj.type == 'MESH':
            list_add = []
            for vg in obj.vertex_groups:
                pair_name = ''
                length = len(vg.name)
                if vg.name[length-2:] == '.L':
                    pair_name = vg.name[:length-1]+'R'
                if vg.name[length-2:] == '.R':
                    pair_name = vg.name[:length-1]+'L'
                if pair_name != '':
                    if not obj.vertex_groups.get(pair_name):
                        list_add.append(pair_name)
           
            for name in list_add:
                print(name)
                obj.vertex_groups.new(name)

…多分9/2に書いた全工程を自動化する『全部入り』も結構簡単に作れるような気がします。
そこまでできたらリギング再開で体幹の作成に入りますかねえ。
尚、既にボーンを左右対称にした際にボーンの角度制限がうまく行かない(というかベタコピーされてしまう)
事が判明しています。コレに関しては Blender の問題なのでなんとも。Blender 2.8 だと直っていたりするんでしょうかね?

2019年9月2日月曜日

夏休みの宿題1

イベントE2の2ゲージ目攻略中。なんか前回と打って変わって低難度の短期決戦の予感。
御蔵もGetできましたし、コマンダンテの2隻目も来ました、どうなってるんだ今回。

さて、おまえの休日宿題ばっかりだなってお話です。

宿題その1 Blender

半身状態で人体の生成をしている訳ですが、流石に夏の間に半身で編集する部分(四肢)は終わらせようと思っていた訳です。
で、こちら。

ラジオ体操みたいな動きしていますが、肩回りです。

流石に多少の破綻は出ましたが、許容範囲なのかなあという所。
最初は三角筋がジンバルを起こしたりしていましたが、多少は改善しています(直し切れていませんが)。

背面からがこんな感じ。

筋肉の描写が美しくないというか、所謂「キレて」ないのですが、主張の激しい肩甲骨の動きは気に入っています。

で、パッと見両面化しているように見えますが、オブジェクトのモディファイアに「ミラー」を追加しただけです。


ウェイト付片面モデルの両面化
そろそろ体幹を作るにあたり、両面化しようとしまして、
まあ、いろいろ資料本読んだりネットで調べたりしたんですがねえ…
基本方針としては、人体である以上左右対称なので(正確には左右が完全対称な人間はほぼ居ませんが)、仕上げ以外は常に半身で編集しようと思っています。
このため、両面化の作業は極力自動化、簡略化したかったのですが…
一手致命的な部分が出てしまいまして…
(以降はVer2.79のお話になります)


  • 0.作業前のモデル

名称やウェイトの状態はこんな感じ


  • 1.左右の命名

左側のボーンの語尾に「.L」右側に「.R」と変名してくれる処理。
アーマチュアを編集モードで選択(特定ボーンのみ選択したい等の事情がなければ「Aキー」で全選択)

3Dビュー上にマウスカーソルを置いて「Wキー」でスペシャルメニューを開く
「オートネーム左右」を選択
これでボーン名称の語尾に左右が付き、対応する頂点グループ名も変名される。


  • 2.左右対称ボーンを作る

上記と同様にスペシャルメニューを開いて「対称化」を選択

尚、中心軸上のボーンも同時に選択してもボーンは増えない模様。
このため、雑に「Aキー」でボーンを全選択してもよさげ。


  • 3.対称となる頂点グループを作る

例では「~.L 」の頂点グループが出来たので、対称となる「~.R 」を作る
オブジェクトを選択し、頂点グループメニューから、
右側の「+」ボタンを押して頂点グループを追加。
追加時のデフォルトネーム「Group」を適宜左右対称の頂点グループ名に変名


  • 4.オブジェクトの左右対称化

オブジェクトを選択し、モディファイア(レンチマーク)→追加→ミラー
「ミラー」モディファイアの適用ボタンを押す
以上の方法で片側のみモデルの両側化はできるのですが…

3の工程が手作業!
…頂点グループの数が一桁ならやれなくも無いデスが、
私のモデルは既に200本近いウェイトに影響のあるボーンが存在しています。
…コレ、自動化するスクリプトを組まないと体幹周りのリギングに入れないのではないでしょうか…
17年以来2年ぶりのスクリプト… Python とは言え内容をすっかり忘れているのですが…