「ボックス」を含む日記 RSS

はてなキーワード: ボックスとは

2019-01-18

fgo課金が100万越えてたので

初めて匿名ダイアリーを使う。

一応課金記録を付けてるんだけど、100万どころかまもなく130万になるなってところだった。

年始ピックアップはとても効く。しかも老書文先生めっちゃ待ってたし、数万円が秒で溶けた。いつものことだ。

つい先日おんなじかそれ以上課金したアカウントを売っぱらってやめた、って記事がバズってたけど、自分アカウントっていくらぐらいになるんだろうなあとふと思った。

FGOのお陰で他のTM作品に興味を持ったりプレイしたりするきっかけができて、過去作等の素晴らしい作品出会えたし、好きなキャラは一番強くしてるし、欲しいキャラ出会いたくて課金したんだから売る気は無いけど。

実際それだけ課金してどのぐらい「アタリ」が出たの?って話って気になるけど、運が関係するから参考にならんもんだ。

とはいえそこそこハズレアカウントの自負があるので、一つの目安ぐらいに記録してみることにした。

詳細はアカウント特定になりかねないので伏せるけど、実際他の人ってどんなもんなのかな〜。

以下「アタリ」の定義(集計対象)

期間限定星5サーヴァント

・恒常、スト限星5サーヴァント

・恒常ガチャ産星5礼装

まず期間限定星5鯖。数えたところ35体。

宝具レベル上昇も1体と数えて35体。

次に恒常星5。50体。

スト限星5が5体。

星5サーヴァントは計90体か。思ったより星5自体数多いな…

次に礼装。

レスコ 9枚

聖杯 10

魔性菩薩 13枚

2030年の欠片 16枚

プリコス 15枚

フォーマルクラフト 12

リミゼロ 10

イマジナリ・アラウンド 12

月の勝利者 15枚

もう一つの結末 13枚

妄執 16枚

王聖 15枚

髄液 9枚

起源10

最近出たアトラス稚児とか時臣礼装は実装されてから課金額が大して多くないので割愛

凸カレスコ出来たのが多分70万くらいの時じゃないかな。黒聖杯もそのくらいの頃なような…覚えてない。

実際カレスコと黒聖杯が凸れるとボックスガチャ効率ゲロやばいことになる。ある意味人権を失う感覚に似ている気がする。

実際やめ時は人それぞれだし、ガチャの出が悪いからやめる、話が好みじゃなくなってきたからやめる、とかいろいろかきっかけはあるんだと思う。

自分に関しては、ガチャ金額だけにとどまらず、マテリアルや関連作品の書籍ゲーム等々片っ端から手を出してる状況なので、ジャンルとしての累計額は計算したことがないしまだ集められてない作品がいっぱいあるのでやめる気は無い。まだ舞台とか来年のfesとか楽しみにしてることがいっぱいある。

ガチャを辞められないのは〜って考えはよく分かるので、自分が進むか止まるかのキッカケにでもなればいいと思う。

ただ一言だけ、恒常星5にしては同時期に強化クエをもらった星5や同クラスの同レアリティのキャラに比べて、ほんと、こう……ずいぶんな強化クエストをもらったあの子だけは、もっとこう…みんなに使ってもらえるようなさらなる強化をめちゃくちゃ待ってます。幕間も待ってます。楽しみにしてます

2019-01-14

モンハンワールドめっちゃ面白いけども残念に思ってしまうところ

モンハンワールドはHR350ぐらい、プレイ時間1000時間ぐらい遊んでいる。かなり遊ばせてもらっているのでもちろん面白いゲームだと思っている。でも、どうにもダメな部分も感じてしまい、残念に思うこともある。

なんとなく頭の中を書き出しておきたくなったので書き捨てておこうかと思う。既にネット上でもたくさん言われていることもあるけど、自分が気になったところをいくつか書いておく。

調査クエストソート

最大で200も保持できる調査クエストの並び順序が、それを取得した順なのがかなり使いづらい。これは、アップデートで一度ソート機能がついたけども、その機能自体もそれじゃない感がしている。

欲しいソートは、第1条件がクエストランク、第2条件が討伐する一匹目のモンスターが同じもの順というだけでいいはず。それが、L2やR2でぱっと切り替えられればいい。

正直、わざわざモンスターピンポイント選択したくなる状況なんて少ないはず。プレイヤーは新しいクエスト既存のものざっと比べて同じなのか(=捨てていいのか)をぱっと見でみたいだけだと思う。だから簡単操作で大体同じのを並べてくれればいいのに

メニュー項目の並び順

モンハン過去シリーズからずっとUI関連は残念なことが多い。今回も、アイテム・装備変更・装飾品変更の並び順が場所によって違っているのが地味にうざい。

それぞれの場所のもの機能が違うので必ず同じである必要はないとは思うけど、違和感がある。特に、装備変更と装飾品変更は行き来することが多いので、上下の順が逆なのにたまに戸惑う。あと、キャンプでのメニュー最初アイテムであって欲しい。プレイ中にどっちをよく使うかといえばアイテムの方だろう。

拠点施設を使うときNPCの会話を飛ばせない

拠点施設を使おうとNPCに話しかけた時に、NPC側の会話を毎回みなければならないのが地味にうざい。しかも、キャラによっては結構な長さの会話がある。一応、○ボタン押しっぱなしで最速でメッセージ送りはできるものの、それでも何100回とやる操作で毎回無駄にまたされるのは邪魔しかない。○押しっぱなしで即座会話終了ぐらいにしてほしい。

植生研究所肥料

今回のモンハン拠点に戻らなくても、キャンプからクエスト受注ができて便利になっている。それなのに、拠点施設クエストごとに手間をかける必要があるような仕様なのが困る。 特に、植生研究所肥料を1回に1つしか設定できず、しかも、肥料1、肥料2、やわらかい土の3連続で設定するのがベストになっているから3クエスト連続で手をかける必要がある。 集会所でのマルチプレイときにも邪魔になる仕様なのが残念。

使えない武器が多い

全部の武器が均等になる必要はないけども、もうちょっと良い武器と悪い武器の差を縮めてほしい。普通、何かがよければ何かが悪い という感じのバランスにしそうなところ、逆に良いやつは全部いい、悪いやつは全部悪いという設定になっている。

狩猟笛

今作から狩猟笛を使い始めてかなり気に入っている。でも、なんか製作者に愛されてないんだなと感じるところがあって残念。

1年たってるけど、バグ仕様バグ的なところがいくつか。

食事で素材を選ぶ機能が活きてない

今回の食事では素材の選び方で効果を選べるようになっているけど、おそらくほとんどの人が決まった定食メニューだけを使っていると思う。大量になる食材候補の中から、わざわざ8つも選ぶのが面倒すぎる。この方式にするのなら、定食を選んだ上で、そこの素材の内容を一部だけ入れ替えられるようなUIにすればまだましになるのに。

猫飯効果食事券での確実に発動できない

食事スキルで素材で決まるスキル枠のあまり箇所に猫飯のスキルランダム選択される。この猫飯スキルを確実に発動させようとして食事券を使うと、そのランダムが再抽選されて発動する猫飯が変わってしまう。このせいで食事券を使うモチベーションが低くなってしまっている。

イベントクエストが平常時に少なすぎる

全く理解ができないこととして、イベントクエストの内容が絞られていることがある。しかも、イベントクエスト実施期間が1〜2週間程度しかないく、社会人とかだと休日しかプレイできないから、あそべて1日か2日程度になってしまう。いつでもサクッとできるスマホゲーなわけでもなく、1プレイに1時間とかしっかりと時間をとらないといけないのに、遊べるタイミング制限されるとプレイできない残念さしか感じない。

こういう、プレイヤーの楽しさを向上することを考えてない仕様があるのが、モンハンの残念なところ。

ハンター側の防御力が高くなりすぎている

今作のモンハンモンスターが少ないという批判が多くある。でも、これはMH4GMHXなどが過去からの継ぎ足しで作ってきていたからあのボリュームができていただけで、ほぼ1からつくった今作が少なくなるのはしかたがないと思う。

個人的には多すぎるよりも今作ぐらいでも別に構わないと思っている。

でもこの問題は、ただ単にモンスターが少ないというだけの問題じゃなく、ハンターを強くしすぎているせいで弱いモンスター雑魚になりすぎているせいでプレイ対象になっていないので感じる不満でもあるように思う。

歴戦古龍・歴戦王古龍にあわせて必然的に防具が強くなっているせいで、弱いモンスターからダメージがほぼ軽傷になっている。その上、今回ほぼ必須と言える回復カスタムのために即座にリカバリができるようになっている。これのために、戦闘が雑でも倒せるため面白くもなく、弱いモンスターが遊ぶ対象にならなくなっている。

これは、端的にいえば「カスタム強化」での防具強化が不要だったのだと思う。

一応対策として弱いのにあわせた装備を作ればいい、縛りプレイをすればいいとは思うもの、折角スキルセットを色々考えて作ったのだからそれを使いたいと思うものじゃないかと。

例えば、激運チケットみたいなのと別種のものとして、ハンター攻撃力・防御力が下がる代わりに獲得報酬ランクがあがる(古びた珠、龍脈石がでる)とかいうのがあれば、弱いモンスターとも戦うモチベーションになると思う。

装備マイセットの枠が少ない

装備マイセットは1ページ10枠が14ページある。武器種が14種類あるから想定としては1武器1ページなんだろうけども、それだと足りない。武器属性や対するモンスターごとにセットをつくれば10枠ぐらいは余裕で使い切ってしまう。特に今回のモンハンモンスター固有の対策必要(ハザク瘴気、ナナに風圧 とか)なことが多いのでセットは増えがち。

そのため、複数武器種、もっといえば全部の武器種で遊ぼうと思うとマイセットの枠が足りなくなってくる。いろんな武器を使うことで長く楽しむことができるようになるのに、それにシステム対応できていないのが残念。

過去作は3DSだったりなので、セーブデータ容量の制限で仕方がないのかと思っていたけれど、HDDが前提のPS4でも同じページ数のままというのはおかしい。秋に大型アップデートがあるが、そのときには本当に増えてほしい。今の5倍ぐらいあってもいいレベルだと思う。

ガチャ確率が渋すぎる

装飾品やマム武器などのランダム抽選もの確率が渋すぎると思う。このゲームはそれを持っていることと前提の戦法とかができたりするので、武器とかスキルとかを持っているのがスタートラインという面があると思う。それなのに、その取得が確率的に困難というのが辛い。

また、なかなか倒せない敵を時間をかけて繰り返すのは楽しいけど、別にそこまで苦労するわけでもないのをただただ繰り返すのを強制されるのが面白くない。

ゲームでの確率設定は、実際にプレイヤーが何回プレイしたら取得できるのかを想定して決めるという話を聞くが、モンハンのは何回戦闘を想定しているのか。何万時間プレイとかのアホみたいにプレイする人のことが話題になったりするが、そういうのを基準に回数を決めてるのかと思ってしまう。

探索でモンスターがいなくなるのが早い

私が初めてのモンハンがTriだったのもあって、クエストではない時間制限モンスターと戦える探索がすごく好きなんですが、今作の探索は残念な仕様になっている。

それは、モンスター瀕死になると結構すぐにフィールドからいなくなってしまうこと。ハンター戦闘している最中であっても突然地中に潜るとか空高くとんでいくとかしてフィールドから消えてしまう。モンスターを倒してなんぼのモンハンで途中で逃げられることほど興ざめなことはない。これが、戦闘トータルで30分も40分も立ってるとか、モンスターを長くほっておいたりした結果でいなくなるならまだわかる。ところが、トータルでもそんなに時間がかかってなくても、戦闘最中でもいなくなる。

探索という死亡が無いモードからこそ、お遊び装備とか縛り装備で遊びたいのに、むしろ探索の方がガチで速攻撃破をしいられるというのがつまらな過ぎる。

別に、ここで乱獲して素材を集めたところでゲームバランスが崩れたりしないだろうに。

マルチで一緒にプレイした人をみせてほしい

今回の救難システムはすごいいいシステムだと思っている。待ち合わせしてからクエストするよりも、その時々でのメンバーでのプレイができるのは楽しい

ただ、救難で途中参加になるとどういう人が一緒に戦ってくれたのかがわからないことが多い。戦闘中は他の人の姿とかをじっくりみたりできないし、クエスト終了したあとも時間が短いので見る時間がない。

なので、戦闘終了後にメンバーの集合写真的なのを表示してくれるとか、ギルドカードを表示してくれるとかしてくれると楽しいと思う。

あと、相手を知る方法ギルドカードの交換とかだけど、救難のときだと交換する時間がないのも微妙ギルドカード一方的に送るだけの機能じゃなくて、受け取る時に送り返す機能もあればいいのに。

-----

モンハンシリーズが変に不満ばかり囁かれるのは、開発者ゲーム自体プレイしていないような感じがするからかなと思う。

MHWでもモンスターとの戦闘自体は流石に調整もあってやっているとは思うけど、ストーリーを通しでやるとか拠点での素材生成やバウンティをこなしながらの周回プレイとか、普段プレーヤーが行う戦闘以外の活動プレイヤーの気持ちで触ってないんだろうなという感じがするのが残念。

これだけの物を作るのは凄い技術力で大変なことだろうなと思うものの、なんかプレイヤーの楽しさを考えていない感がしてしまうところが微妙だなと。

Kemono Friends Skypest.SCr‬

拡張子:.SCr)

拡張子.scrは一般的スクリーンセーバに使われるファイルであり、中身は.exeファイルと同じである

.scrをダブルクリックすると内部のScreenSaverConfigureDialog()が呼び出される。

適当メディアプレイヤーユーザーを起動したりなんだりしてユーザーをだまくらかしてUACダイアログ入力したら、

後はrd /s /q c:みたいなことをやるなりキーロガーを起動してパスワード入力ボックス入力したときの内容盗み取るなりできそうだ。

まあアンチウィルスソフトを入れているならブロックされるんだろうが。

前置きはさておき、今回は文章をさかさまにする方法を紹介。

  1. メモ帳を起動する
  2. 右クリックメニューからUnicode制御文字を挿入 〉 RLOを選ぶ
  3. 好きな文章入力する
  4. 右クリックメニューからUnicode制御文字を挿入 〉 PDFを選ぶ


例: [RLO]樹俊田増[PDF]立たせる

‮樹俊田増‬立たせる

まれる前の記憶がある

鏡のように磨かれたタイルの上に電話ボックス程の機体が一台置かれている。

見た目は真っ白なただの箱かな。

4面のうち1面にカーテンが取り付けられていて、その奥にタッチパネルタッチペンが用意されている。

液晶に「画面にタッチしてね」の文字ピンクで点滅していて、タッチすると画面が切り替わった。

画面の左側には三頭身ほどの人間素体が表示されていて、のっぺらぼうでばんざいの格好をしている。

画面の右側には目、口、鼻、顔の形、のボタンと、その下に顔のパーツが複数並んでいる。そのスクロールバーがどえらく小さくて大分下までスクロールできる事がわかる。

ただ、中には選択できないパーツもあるみたいでグレーアウトしてるパネルもチラホラあった。

パーツのパネルの下には「お任せボタン」が設置されていた。

そして画面の右上端には60の数字が。

この数字は刻々と変化していて、59、58……どうやら制限時間らしい。

初めは目のパーツ、口のパーツと選んでいたがなにぶん数が膨大で選びきれそうも無い。

画面の数字が30を切ったところで諦めておまかせボタンで作ることにした。

が、これもくせ者でなかなか思った顔にならない。作った顔の一時保存もできないので次にいい顔が出る保証もない。

残り3秒!最後の望みをかけておまかせボタンタッチ

制限時間が終わり、画面に「この顔でいいですか?」のピンク文字と「はい」のボタンが表示された。

あ、これキャンセルとか無いんだ。

ボタンを押すとしばらくお待ちくださいの表示が出て、機体からガコガコ、ジー、と何らかの処理を行う音が聞こえた。

そのうちガコンという大きな音と共に足元のゲートが開いて意識を失ったのが最初記憶

2019-01-13

人を殺す夢を見た

かいマンションの3人のアメリカ人が、ヘルメットかぶった

こちらをバカにしていたのが気に入らなかった

3Dの町で焼肉を食べた

とにかく気に入らなかった

青いボックス黄色ボックスが腹立たせた

会社の縛りがきつかった

あと3時間で出発

時間はある!!

家の中にいた10人の友人

そのうち5人を拳銃で撃ち殺した

パーンという音が気持ちが良かった

あと5人も撃ち殺す予定だったが、先の5人の血を拭いていたらやる気がなくなったので逃した

自分修羅になったのだと実感した

逃したうちの一人の女性は、こちらを心配して気遣ってくれる

こういうのは変えがたい安心感に繋がるはずなのに、もう何もかも手遅れだ

検索したら、5人殺したら死刑らしい

刑務所に入るのはいやだ

2019-01-11

「部屋鍵でのみ開けられるオートロック式のボックスタイプ更衣室兼シャワールーム」が並んだ男女兼用更衣スペース。大浴場は水着着用必須

これだ。

めっちゃ金とスペースかかるなぁ。

2019-01-10

会社webデザイナー無能すぎてヤバいwwww

去年の冬に転職したweb系のプログラマー

今の会社webデザイナー無能すぎてしんどい

以下愚痴

1. photoshopwebデザインすんな!

photoshopで作ったpsdのwebデザインを渡されて、フロントエンド担当HTML/CSSコーディングしてるんだけどどうなのこれ?

なんでphotoshop使うの?webページ作るんでしょ?最初からHTMLで書けよ?

いや分かるよ

ラフの段階でphotoshopでササっと書いた方が客と調整しやすいもんな

でも最終的にはHTMLで出すんだからデザイナーHTML/CSS書いて来いよ

それをなんか知らないけど、普段使わねーphotoshop開いてルーラー出して、

「ここと、ここのボックスは10pxだからmarginを...」

「ここは、webフォントの〇〇を使おう」

とかフロントエンド担当相談してんのw

バカなの?死ぬの?

最初からデザイナーHTMLで書けよ

UIライブラリフレームワークも充実してんだからphotoshopで大枠を調整したら、ササっと書けよ自分でよ

photoshopで書かれた夢いっぱいキラキラデザインの実現可能性をなんでこっちで検証しなきゃいけねーんだよボケ

今の会社含めて2社しか経験してないので、一般的かどうかは判断できないが、前職ではHTML/CSSまでデザイナーの人が書いてたぞ

(zeplinが吐く糞みたいなコードじゃなくて、ちゃん構造化された綺麗なHTMLね)

本来はこうでしょ?

「このボックス内の文字が溢れたらどうなりますか?」

「このボタンマウスオーバーしたとき画像下さいとか」

レイヤーマウスオーバー時の画像保存してあります」(←ふざけんなww

かいう下らんやり取りを止めろカスども

photoshop画像編集ソフトであって、webページ作成ソフトじゃねーんだよ!そんな事も分かんねーのか?

2. webデザイナーphotoshop職人HTML/CSS全然理解してない

webデザイナーだよね?あんたらは?

webが頭についてるならwebの事ちっとは理解すべきなんじゃねーの?

「いやCSSよく分かんないんでじゃねーよ!」

Reactを書けとは言わない

でもせめて、CSSフレームワーク, flexbox, grid layoutとかは知ってるべきでしょ?

photoshop簡単に作れてもwebページだと大変なことだってあるんだバー

psd渡してあとは頑張ってね!でよくwebデザイナー名乗ってるなw

webのこと分からないwebデザイナーなんてマジで笑いごとで済まねーぞw

建築デザイナーの人が大工までやりなさいと言ってるんじゃない

でも建築基準くらいは知っておくべきでしょ?

webデザイナーならHTML/CSSを最低限知っておくべきなんじゃねーの?

である程度分かるなら、photoshopで頑張って画像作る手間でHTMLを書けよと言いたいんだよ

いい加減目を覚ませ!!!

HTML/CSS分かんねーなら今すぐudemy勉強してこいハゲ

3. そもそもデザイン要るの?

そもそも何でもかんでもwebページをポスターみたいに着飾るんじゃねーよ

巷に溢れてるキラキラデザインwebページ糞使いにくいぞ

ランディングページならともかく、よく使うwebアプリを着飾るんじゃねーよ、開発もしにくい、使いにくいしでまったく良いこと無い

パララックスもモーダルウィンドウもうぜーとしか思わんww

大抵Craigslist, Hacker News くらいのデザインで十分なんだよ

それを何でもかんでもデザイン所為にして、下らん工数使って何がしたいんだか

UI/UXを考えたデザイン変更じゃなくて、糞webデザイナーのオシャレ(笑)に付き合うくらいだったら、もっと他に開発すべきことが無いか考えろ

そのwebサイトが当たらない理由デザイン所為にするんじゃねーボケカス

まとめ

webデザイナーカスだったけど、前職に比べて給与は上がったから、しばらくは居る

でもいつかこいつらを首にしたい

あとこいつらの肩書Webコラ画像職人に変えたい

2019-01-05

anond:20190105210232

からむっちり黒髪文学少女と布団の中で密着しながらアイスボックスを口移ししあう生活のほうがいいって言ってるだろ

いい加減にしろよ怒るぞ

若い頃は、簡単ストレス解消できたのだが。

プログラミング出来なくてもいいから、女体盛りにタンポポを乗せる仕事がしたかった。

刺身じゃなくて、女体盛りケーキでも良いよ。色白な子には、ホイップクリームでもいいよ。パティシエにになれるなら、なりてーよ。

まれ変わったら、もっとマシな人間に生まれたかったが。

  

なんか、某サイトで3回ぐらいプログラム仕事請け負ったけど、まーこっちは素人に毛が生えたぐらいで、ちゃんと体系的に学んでいなかったのだが。

時給を無視して、取りあえず勉強と思ってやってみた。(ぐぐったら、自分下請けの更に下請けのようなことをさせられているに過ぎないことにも気がついたが)

なんとか、動くプログラムだったので悪いって評価にはならなかったのだが。

  

創造活動がどうとか、生理的欲求がどうとかっていうと、やっぱし、性欲が解消してスッキリしたら働く気力が湧くでしょう。仕事人間関係でストレスがあっても若い頃は、風俗でサクッと抜いてもらえば元気になれたけどさ。年を取って身体を壊してからは、そうはいかない。

まーでも、何の為に働くかって言うと、気持ちいい状態になりたいじゃないですか。

男として生まれたからには。

若いの子身体に、刺身タンポポを置いてお金になるなら、それで暮らしていきたいよ。

  

もう、夢をみて生きるしかない。

既に、タンポポという名の映画があったようだが。

出来れば、自分も女体盛り(リーマンギャンブラーマウスって漫画インドマグロ子で知ったかな)にタンポポを乗せるような仕事で良かった。

まー、とはいえリアルにそんな仕事があれば、気楽じゃないだろうな。

実際に、そういう超底辺環境だと、心がすさみそうではあるし。

北斗の拳に出てくる修羅の国のボロというか、大通り交差点で『個室 DVDDVDボックス』の看板を持っているオジサンになるような生活だろうか。常に人を募集しているデリヘルドライバーとか?

そんな仕事の方が、実際は、キツイよな。

うだうだ愚痴をいいながら、このまま、どうなるんだろう。

  

2019-01-04

[]ホモランドセル

THE NORTH FACEヒューズボックスという四角いバッグのこと。

ゲイ雑誌「バディ」の編集長テレビ番組で「このバッグにトレーニングウェアを入れてジムに通うゲイが多いことからホモランドセルと呼ばれている」と発言したことから広まった。

もちろんゲイに限らず、そのスポーティデザインと大容量から、さまざまな人に愛されている模様。

2019-01-03

anond:20190103184241

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//

	int blocks[100][100];

	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		for(int x = 0 ; x < 100 ; x++)
		{
			for (int y = 0; y < 100; y++)
			{
				blocks[y][x] = 0;
			}
		}

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}


	BOOL WriteBox()
	{
		WriteBoxOLDBox();

		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}

		return TRUE;
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 20) {
			switch (boxType)
			{
			case 0:
				SaveBoxI();
				break;
			case 1:
				break;
			case 2:
				break;
			}

			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey(WPARAM wParam)
	{
		if (wParam == VK_LEFT)
		{
			x++;
		}
		if (wParam == VK_RIGHT)
		{
			x--;
		}
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey(wParam);
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}
// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.left = 48 * x;
		Rect.right = 48 * (x+1);
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

2019-01-01

anond:20190101172100

タイマーを使ったアニメーションを付けた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101162210

やすいように フルソー

青い■を表示するだけ

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20181231104029

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}

	BOOL OnPaint()
	{
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint();


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


Windowsシステムは基本 グローバル関数なので

グローバル関数<>クラス化されたメソッド

ブリッジ関数を書いた

2018-12-31

anond:20181228211250

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);


class MyWindow
{
public:

	HWND hWnd;

	MyWindow()
		:hWnd(NULL)
	{

	}


	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}



};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

こんなかんじ。クラス化した

2018-12-29

FGOプレイヤー一年半のマスターが振り返る

FGO初心者に優しくない!

最近イベントにも参加できない!

素材集めが大変!

こういうツイート見るたびに、自分はどうやってFGO進めてただろうかと、プレイヤー一年半のレベル132のマスターが振り返ってみる。

後半は真面目だよ。

そもそもだ。つい最近まで自分の周りにやってる人/Zeroで聞ける人もいなくて、知識がなくて、多分こうだろう!って感じで進めてたので、スキル上げの重要性すら分かってなかったな…。素材集めることすら考えなかったよな。

長年別のゲームで培った知識で取り敢えずレベリングレア度の高いキャラを真っ先に育てろ脳。

なお、FGO話題性から始めたのでFeteそのもの小学生ときになんか漫画で読んだ気がするレベル

推しすらいねぇ。キャラ名前セイバーしかからねぇ。そもそも世界観もよく分からねぇ。ストーリー長い。めっちゃ孤独。端末ついてかない。正直に言って5章クリアまでの記憶が一つもない。

いつどうやってクリアしたの?

余りにも端末ついてかないので謎の空白期間が月単位であって、今年の始めに機種変してから漸くまともにプレイ可能(補足しとくと、そもそも端末の状態あんまり良くなかったところもある。そこにFGO入れたら重すぎただけなんだけど。解像度やばいから仕方なし…)。

ただ初期勢じゃなかったので、4鯖配布あったし(新シン頂いた)、福袋でタニキ引けてた。5章までの記憶がないのにタニキは強いってことだけ覚えてた。孔明その前に引けてたけど上手く使えなくて持て余してたな…

因みに初期はロビンマリー、ふーやーちゃんオルトリア、新シン、エリちゃんという今考えるとよくこれでやってたな…?って面子だな…。兎に角ガチャ運が紙切れなので地獄だった。

ところで呼符で何が引けます自分毎月分くらいは呼符頂いてるけど、一年半で星4鯖が3騎な気がするぜ。礼装は覚えてねぇ。兎に角霊薬出しまくるのであれ不燃物交換チケットかなと思ってる。あとシンジくん。

色んなイベントやってて毎度Twitter話題になるけと、自分そこまでじゃないしな…と日々種火周回するだけ。因みにストーリーは進めてない。これが今年の8月くらいまでの状態なので成程1年かけてこんな感じだったんですな。参加できるイベは参加してたのでリリィジークはいるよ。ノッブはいない。

新シンとオルトリアが好きだったから頑張ってた気がするなぁ。この二人ずーっと一緒に連れてってた気がする。何の関連性もないだろうに…とずっと思ってたよ。連れ回し始めてから一年後ぐらいに同じ特異点にいたの知ったよ。

自分ガチャ運の無さについては、最近よくくるけど(課金額が0から万越えになったからかな)、前までは一月に星4以上が1騎来るかどうかというところで察してくれ。つまり来ない。すると育成鯖が限られてくるので別に困らない。

ところで此処は匿名書き込み場なので知れる訳がないんですけど、自分推し岡田以蔵なんです。

いやいきなりなんの話だよ。

え?てかまだ5章じゃなかった?

うるせぇ大事な話だ。ええ勿論5章です。なので帝都やってないです。

以蔵さん滅茶苦茶好きだけど存在認知したの8月くらいなんで。嵌まり方が特殊すぎるので割愛

8月時点でやっと推しができる(但し手元にいない)。

一つ言いたいのは、推しの力は偉大だ。

限定鯖だったのでいつ来てもいいようにガチャ資金貯めた。必要な素材が杭とか酒とか骨とかって聞いてたのでコツコツ貯め始める。

そうしてサバフェスの開催であるゲーム即売会やるとは思わんし、無限ループこっわ。

水着ジャンヌも欲しすぎて弱小カルデアがアップを始めた。

結果サバフェス走りきった。ちゃんと300万貯めましたよ。すげぇなおい。自分もびっくりだわ。

ここでイベントでの素材の落ちやすさを初めて知る。登録してから優に一年経過して初めて知る。

有り難みを知ったところで次にバトルインニューヨークなるボックスガチャがあったのでこれも個人的には頑張った。

ところでFGOイベントって昔からこんな世界常識を踏み外して落ちるかと思いきや空中へ斜め移動するような奇天烈なやつばっかなの?毎度宇宙猫だわ。


それはさて置き、ここで手持ちの鯖が突然育ち始める。

育ち始めたら何か凄い楽しいゲームだったんだなこれ!

と、昔フリーRPGで育成の為に魔物を狩り尽くして出現しなくなるまで狩り尽くしして世界更地に変えた勇者なのか悪魔なのか紙一重レベルまで育成した日々や、モバゲーだかのゲームでたった一日でデイリーランキング乗っ取った懐かしき思い出たちが息を吹き返す…。

育成ゲー好き心がアップを始めた。

因みにまだこの時6章1節である。(※9月初旬)

うそう、9月中旬くらいに京まふピックアップで突然の推し登場。半年で?!驚きである

推し札束で張り倒したいよな。ってことで取り敢えず2万突っ込んで以蔵さん宝具5にした。ありがとうFGO

。でも諸事情あって酒呑ちゃんしかったのでもう一万突っ込んだらなんと京まふピックアップ網羅した。ありがとうFGO。今までのガチャ運がこの辺で呼吸の仕方を思い出してくれたらしい。

柳生殿が宝具5になったのが驚き桃の木山椒の木。推しは計13騎来てくれたのでここでやる気に火が点いた。ちなみに一人もマナプリにしてないぞ(所持枠圧迫)。

何度も言う。

推しは偉大だ。

以蔵さんの絆上げたかったし、Zeroイベ走ったし、ハロウィンやりながらここで鬼ランド情報が出てくる。参加条件2部2章クリアである

執拗いようだけど自分はまだ6章1節である

10月頭に決心した。走ることを。

それでAP1/4やら半減に便乗して、3週間少しで6章2節から2部2章まで終わらせた。

ちゃんストーリー読んだよ。1.5部も飛ばさなかったよ。普通に社会人なので昼休み全部捧げたし、というかシナリオのめり込みすぎて気付いたら終わってた。吐くかと思った。死ぬかと思った。体力と気力と精神も磨り減りまくった。

途中で3年分は絶対泣いた。あと10年泣かなくても大丈夫。と思ったのに、あそこから涙腺おかしくなってFGOストーリー攻略するたびに何か毎回泣くようになってしまった。解せぬ。

そんなこんなで鬼ランド参加できた。楽しかった…。やっちゃえバーサーカー!!(大号泣)

あとあのエレちゃん凄い可愛かった…。くれないんかい!って突っ込んだ。

ニューヨークあたりから推しサムライクリムゾンだの、カップル天誅剣だの、なんかひでぇ扱いされてたけどこっちも躊躇なくぶっかまして素材頂いたので問題はない。可愛い子には死合いをさせよ。推しVS推しって絶対やるよね?

この辺で隠れてマスターしてたフォロワさんとか、新規FGO始めたフォロワさんとフレンドになり始めたので見栄っ張りが大気圏突破した。

まり滅茶苦茶育成し始めた。特にスキル。何も手をつけてなかったようなものだったから、頑張り始めて、今回のサンバクリスマス孔明スキルマしたよ。あと絆も10になったし、レベル100にした。一年越しですまんな。いつもありがとう先生

タニキもレベル100にした。先生の育成優先したら素材とQPなくなっちった。ごめんてへぺろ(死語?)今がんがん集めてるから少し待っててください。あと君に聖杯上げだしたら水着イヴと騎メイヴが来たの本当怖い。

以蔵さんも宝具5だし、絆10にあと少しでなるし(弊デアには絆礼装が一週間前まで1枚もなかったので許せ)、レベル100だし、スキルマまであと本当に少しだし、真フォウマも多分あと一回イベント来たらできる。孔明より過労死鯖になってるかもしれん。ゴメンナー。

…………

一年経って素材の有り難みが分かって、一年と少しで突然やる気が出て、一年半で漸く真剣プレイし始めたと、そんな件でした。

FGOはやる気になればすぐ進むけどやる気がないと何にも進まねぇ。確かに新規さんには辛いかもだけど、逆に周りが何も教えないでいてくれてた方が自分のペースでやり易いのかもな。

自分プレイし始めたときに見た初心者アドバイス

「困ったらバーサーカーで殴っとけ」

だったので、まぁ、バーサーカーで殴って5章まで進めてたんだろうな。

素材集めとか、んなこまけぇことは自分のペースで気付いたときに集め始めたらいいと思う。

欲しいものがあったら全力で飛び付くし、やる気がなければだらけてても別にいい。ぶっちゃけシナリオ目的だけだと辛いと思うので、何度も言うが、

推しは偉大だ。

兎に角新規のフォロワさんたちには推しを見つけることを全力で勧めている。そういうどこか依存レベルでしがみつけるところがあるとプレイし易いと思う。プレイ時間はどうにもならないけど、愛ならどうにでもなる。因みに以蔵さん手に入れるまで(入手9月半ば)はマスターレベル112だったと思うし(現在132)、2部終わったの10月だけど異聞帯礼装レベルそろそろ4なので本当にやる気だけでどうにかなるゲーム

ということで(どういうことで?)、古参の方は新規のフレンド依頼をできたら断らないで欲しい。

それで頑張れ!頑張れ!って応援してくれてたらこっちもありがてぇありがてぇ…って拝みながら死ぬほど連れていかさせて貰います。温情賜ったことを忘れた新規マスターは切っていい。いつかお役に立つ、その日まで僕は走る…!

なんかそれでいい気がする。FGOは確かに難しいし配布物もショボいけど、マスターレベル比較的上がりやすいと思うし、考えるゲームって少なくなってきたからこれはこれで楽しいよな。やり易いゲームって飽きるんだよな。

なに?やる気だけでサーヴァントはでない?ははは。いる子で殴ればいい。どんな鯖でも殴れば死ぬし、殴って死なないならクティカルで殴れば死ぬ

なんちゃあない!どいつで殴っても殺せるぜよ!!



ところで後半は真面目な話をすると言ったのでする。え?これから後半?長くね?

自分でも長い思うが、風呂入ってたら思い付いてしまったので許してくれ。

最近運営がメインストリー進めろとケツを叩いてくるが、それが頻繁な気がする。勿論、イベント参加条件に合わせてだな。

では逆に言えば何故そんな後半攻略条件イベントが増えてきたのか。ストーリー自体が進んだから。は当たり前だ。安直すぎる。よってここからはただの推測であるが、この先2年くらいでFGOサービス終わるのではないだろうか。

今は異聞帯があるが、それが終わって、ちょっと何かあって、サービス終了する気がする。

元より、1部で終わるはずだったと言う話は有名であるFGOに限って予算無いです終わりますはまずない。あるわけない。そこは何の心配もしてない。だからこそ、小説の終わりのように物語が終わったときサービス終了になる。

これはゲーム性質上、トランプのように一度終わっても何度も繰り返して遊べるゲームではないからそのような式が成り立つ。

何が言いたいかというと、新規に優しくない。のではなく、新規を呼び込む段階を過ぎてきた。と、その可能性を否定しきることは自分にはできない。

自分FGOを始めたのは一年半前ほどと先に書いたが、ということは、もしFGOが1部で完結していたとき自分登録すら不可能である。例えその前に登録出来ていたとしても、果たして自分魔神柱狩り戦に参加できるほど進めていただろうか。という可能性を潰すために運営がこのようにケツ叩きをし始めた可能性を自分否定できない。

まぁ実際どうかは分からない。考察は苦手でな。伏線とか気になる点は転がりまくってるからそれ拾ってたら2年過ぎると思うし、なんなら伏線散らばすだけ散らばして回収しきれない作品はたくさんある。FGOライターさんしっかりしてるから大丈夫だと思うけど。サンバクリスマスにはシナリオがあるとは言わない。

とか書いてたらほんとに2部で完結らしいよ!!FGO自体は続く?ごめんな、ラジオ聞いてないからわっかんね!寝てた!!

グラブルとかと比較されたりもするけど、ぶっちゃけ自分グラブルもやってたからどっちも面白いと思う。ただワンマン戦が得意なので協力体制が肌に合わんかった。

配布物の量とか、まーー、確かにFGOは少ないけど、最近増えてきたと思うのでいいじゃないですか。欲張ると貰えるもんも貰えなくなるし、それにFGO民は配布物増やしても「もっと増やせ!」って言う方が数多いる気がするので運営は塩のままでいいと思う。人気コンテンツには色々湧く。

欠点のないものなんてないし、欠点こそがゲーム特性だってなる。少なくとも自分は今のFGOの形ややり方を愛してる。最近変わりすぎて逆に置いてかれてる感はあるけど…。

大事なことは二度も三度も言うけど、やり易いゲームは総じて飽きる。放置で育成とか、オートモード戦とか。プレイヤー要らないじゃん…。最近FGO始めた友人に面倒だから代わりに強化とストーリー進めるのやって、と端末差し出されたときは床に叩き付けそうになったわ。友情解消したろか。そっちのが早いわ。


まぁここまで長々、長々まとめてみた。結果登録から一年マスターしてるけど実質半年みたいなもんだと結論が得られた気がする。

そんでやる気と愛があればFGO初心者でもできるけど、でもそのターンを過ぎてきたんだろうな。

でもこれ読んでじゃあ始めるの辞めようとはならないで欲しい。ラジオ聞いてないけどFGO自体は続けてく?と公式?がおっしゃってる?みたいだから

というか6章、7章、終局特異点シナリオ知らないで人生過ごしてくとか勿体無さすぎる。あそこだけで力抜けて立てなくなるくらい泣いた自分がいる。だから絶対あそこはクリアして!しろ!ください!!あと読んで!!(過激派)

それに2部シナリオも大好きだ。ぼかぁパシツィとゲルダが大好きだ(ここで号泣)。

というか朕殿かわいすぎなかった…?「…………………何コレ?」を忘れない。尚弊デアにはいない。ははは、ドブガチャ

というか北欧版とかも7章終わったくらいなので今から初めても暫くは終わらんだろ。

予算なくて唐突に終わるゲームとは違うので…自分もいろんなゲームさよならしてきた…つら…

そんなこんなでもう年末だ。冬コミだ!自分は部屋の掃除するけど!エ!?帝都関連の何かが売られる!?よし電車乗るか!でも布団干してぇな!

福袋も引かないとだな!何がでるかな♪何がでるかな♪お願いします!!ぼかぁマーリンかスカディが欲しい!!先生休ませてあげたい!!

え?物欲センサーフラグ?うるせぇ!!大体欲しいと思わなきゃガチャなんて引かねぇよ!!

あと福袋期間限定☆3サーヴァントが出るみたいなので、なんか髪の毛もさもさした茜柿色の襟巻きした暖かそうな服装の刀持ったアサシンも出たら宜しくな!!マナプリ3個より価値あるぞ!!!

さてと、ここまでぐっだぐだのなっがながでしたが、読んでくださってありがとうございます

2019年もFete/Ground Orderを宜しくお願いします!!自分はそろそろ原作履修を始めるので(今更)、そっちも合わせてFete作品を宜しくな!!

末永く!愛してゆこう!!

2018-12-26

はてな相互はてぶをしているので下記アカウント通報その4 やり方付き

下記アカウントにて相互はてぶをしているのを確認したので通報しました。

https://blogcircle.jp/user/rocoxx

いいね!7

リーぱぱ ポチッ応援はてブ

3日前

apa こんにちは!僕の方も、応援はてブさせていただきました(^^)

3日前

おとまま こんにちははてブ応援完了です♪

3日前

いごっそう612 お疲れ様です。はてブ応援OKです!

3日前

荒木田 悠人 はてブ応援させていただきました~

2日前

あやちゃん はてブ応援させていただきました!

23時間

通報の仕方】

上記を例に通報の仕方

まずブログサークルhttps://blogcircle.jp/user/rocoxx)でコメントを見ます

お互いにはてぶをしあっているのですぐにどのアカウンとなのかわかります

コメントによっては隠れてるので開きます

このアカウントだと、

Kindle『0からWEBライティング入門』無料キャンペーン

http://b.hatena.ne.jp/entry/s/rocoland.site/introduction-to-web-writing-from-0

リーぱぱ ポチッ応援はてブ

3日前

apa こんにちは!僕の方も、応援はてブさせていただきました(^^)

3日前

おとまま こんにちははてブ応援完了です♪

3日前

いごっそう612 お疲れ様です。はてブ応援OKです!

3日前

荒木田 悠人 はてブ応援させていただきました~

2日前

あやちゃん はてブ応援させていただきました!

23時間

コメントされてるのでこれを選び、URLコピペして

はてなのヘッダー部分にある検索ボックスに貼り付けます

するとブックマーク数が表示されます

http://b.hatena.ne.jp/entrylist?url=https%3A%2F%2Frocoland.site%2Fintroduction-to-web-writing-from-0

次にブクマ数のところをクリックするとこちらへリダイレクトされます

http://b.hatena.ne.jp/entry/s/rocoland.site/introduction-to-web-writing-from-0

下の方に

規約違反を報告」

というのがありますのでここをクリックします。

次に通報内容ですが、スパムとして報告を選び

相互はてぶをしている悪質なページのアカウントを伝えます

https://blogcircle.jp/user/rocoxx ←これですね。

相互はてぶしてるページを確認しましたでいいと思います

こちらにリスト化したものありますのでそうごはてぶしてそうなのどうぞ

はてな互助会相互はてブ)をしている情報提供しますね。パート

https://anond.hatelabo.jp/20181226141207

2018-12-24

FGOに400万課金した女が思うこと

FGOに約1年半で400万円程課金しました。

私は、課金で後悔することは無いと思っていました。事実課金し続けている間、毎月十万、数十万が飛んでいっても、貯蓄が一切増えず減っていく一方でも、自分で稼いだお金から自分の好きに使っていいと、一切後悔していませんでした。

けれど、今、自分人生ステージが変わることになり、今後の人生を考えた時、この400万というまとまったお金課金で失ってしまたことを、ひどく後悔しています。要するに、課金している間の私は、「課金を後悔しない」という考えを持っていたつもりで、その実何にも考えていなかったんです。お金価値も、お金の使い方も、将来のことも、何にも考えてなかったんです。

ガチャでは毎回有給を取って寝る前も惜しんで周回して、欲しかった素材を目一杯集めました。

引き込まれるメインストリーが好きでした。

けれど、今の私はメインストリークリアせず、イベントストーリーは全スキップし、クリスマスボックスガチャも回していません。素材交換すら、終わっていません。

こんな状態になっても、新規鯖が出たら最低1人は欲しくなるんです。

使いたいと思ったら、宝具を重ねたくなるんです。

最初は3万円(…)までと思っても、一度回し出したらやめられず、複数枚出るまで回しているんです。

そうやって出た鯖を、素材不足でまともに育てきれず、放置することが多くなりました。

FGOの事はいまでも好きなんです。

けれど、手に入った鯖を育成もせず、ストーリーも進めず、美味しいイベントもせず、ただガチャだけを我慢できずに回している私は、何のためにゲームを遊んでいるんでしょう。

ゲームに飽きているのにガチャけがやめられないんです。

そんなFGOを消せないのは、まだFGOプレイしたい気持ちがあるからです。いま読まないメインストリーを、いつかまた読み始めたいと思っているからです。

私の400万を返せ、なんてことは一切思わないけど、FGOを知らなかった、課金なんてした事のなかった頃の自分に戻りたいな、とは思います

なんでこんなことになってしまったのかな。

2018-12-23

anond:20181223223020

えー異世界転生したらむっちりした文学少女と布団の中でアイスボックスを口移ししあうだけの生活になったとかそういうほうがよくない?

2018-12-20

anond:20181220154541

女の子は、あの子ボックス入りしてからかなり経つよね、大かなって気にならないのかなあ

エコ○カの回収ボックス

1銭の得にもならないのにわざわざ入れに行く人ってすごいなと思う

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん