「key」を含む日記 RSS

はてなキーワード: keyとは

2019-08-19

彼氏といるとき自分アニメキャラだった

彼氏CLANNADたことないって言ってたから一緒に見てたんだよね。

なんかすごい既視感

彼氏にふざけて甘えているところがなんかKey特有キャラと似てた。

首かしげたりするところとか。

します。

2019-06-11

anond:20190611223437

その問いって00年あたりによくされてて

実際にエロゲーからエロ抜いてアニメ化したり、プレステなどの家庭機でゲーム売られたりしたんだよ

fatekey作品なんかそうじゃん。最近アニメではYU-NOエロ原作だし

社会人5年目になって久々にCLANNADリトルバスターズ!を観た

初めて増田になりました。

学生の頃にCLANNADアニメを観て、それは大層泣きました。

シナリオの都合のよさとか、主人公にキツい運命を与えすぎでは?とか、そういう理屈を超越したところにこの作品はあって、京アニは見事にこの物語演出してみせたと思う。

あの頃は家族とか友達とか人のつながりっていいな、と大まかにはそんな感想だったと思う。

しかし今の私は違う。見終わって、人はなぜこんなにも傷つきながら前を向いて生きなくてはならないのだろうと思った。

いやまあそもそも、5年目にして転職を2回しているような人生なので察してほしい。

働き続けることがこんなにもつらいのだと、布団の中で思う日々だ。

多分この日記を開いてくれた人はCLANNADリトバスをすでに履修済みだろう。よって割愛する。

私の胸を打ったのは、AFTER STORYに入って、朋也が働き始めたところだ。

卒業後にプーだったことを負い目に感じていた主人公は、自分仕事をみつけ、住む場所をみつけ、愛する人の5年目の高校生活を支える。

その18歳の岡崎朋也がなんともいじらしく、可愛く、行動してみせた自分がどこか誇らしく瞳が輝くも、あっという間に現実を突きつけられてしまうのだ。

新居に渚を迎えて浮ついた気持ち職場の先輩の芳野と初めて車で現場に向かったときに、すれ違った家族を窓越しに見送った時の未来を期待する表情。

それがもうたった一日の労働で、家に帰ったら愛する渚の話に耳を傾けられないほど疲れ切ってしまうのだ。

学生時代にはその細やかな描写に気が付かなかった、まったく印象に残っていない。

改めて視聴した今回は、汐をめぐる物語以上に、朋也が働き続ける姿が目に焼き付いて離れないのだ。

本人も作中で話してはいるが、学校生活では友人たちの悩みを解決し、手を差し伸べてよい方向へ導いてきた朋也が、

人を導くことができるという自惚れが、働き始めたことで一瞬で瓦解する。

労働とは、そりゃ楽しいこともあるかもしれないけれど、大多数は生きるために嫌々行っているものだ、

でも朋也は渚との生活を守るために必死で食らいつく。

学校が楽しくないからと不良のような生活を送っていたあの朋也が、逃げ出さずに仕事と向き合う姿は、まさしく日本という社会で生きるためには組織所属して労働しなくてはならないという現実を突きつけてくる。

古河だって流行っているパン屋ではないことから、渚や朋也の目にみえないところで重いそろばんをはじいているのだろう。

渚との生活を守るために、仕事をしている。

朋也は渚を失ってから仕事をしつづけた。本人はそれを汐からの逃避だといったが、生きるためにはお金必要で、庶民は働かないと生きていけない。

どれほど傷ついても生きることから逃れられないのなら、仕事をしたり、人とかかわって生きていかないといけない。

汐の治療のために仕事をやめた朋也は、汐が亡くなってしまったら、もう死のうと心のどこかで覚悟していたのだろう。(原作描写あったっけ…)

から生き続けるための仕事をやめて、それを察した芳野は戻ってくるようにと声をかけた。

5年目に触れたCLANNAD家族っていいなとか楽しい友達が欲しいな、とかCLANNAD人生とかそういうことも感じたけれど。

傷ついた人間もその傷が癒えずとも前を向いて生きろと、そんな空をつかむような悲しいエールを受け取ったのだ。

そして急にリトバスRefrainアニメがみたくなった。

リトバスこそ、そのような物語なのだ

いっき割愛するが、リトバス主人公親友たちを一度に失うという大きな傷を負う。

そして彼らが死ぬ運命は避けられぬのだと、その痛みを抱えてまでも生きろと言われる。

物語を通してハートが強くなった理樹は喪失をも受け止めて強く生きようとする。

まあ最終的にはうまいこと物語が展開してハッピーエンドになるのだけれども。

だーまえは何かとプレイヤーたちに強く生きてほしいと願っている気がする。

書を捨て街に出よう、じゃないけれど傷ついても現実逃避せずに真っすぐ生きてね、という応援

幸せになる番という歌なんて最もたるものだ。

ビジュアルアーツ20周年のイベントで配布された曲なのだが、わざわざイベントに来たような熱心なファンに「僕はもう大丈夫から 今度はそう、きみが幸せになる番だよ」なんて語りかけてくる。

オタクなんて大小あれども、傷ついて生きてきて、エンタメにそれを救われているような人間ばかりなのだ

そんなオタクたちに、現実に立ち向かえとスパルタ的に奮い立たせようとする。

あと多くのkey作品現実から逃げるとBADED行きなのだ、智代ルートなど非常に印象に残っている。

そこまでして、どうして生きていかねばならないのか、、、なんて思う。

俺たちは人生主人公なのだから現実から逃げずに、居心地のいい環境を作って、ささやかながら生きがいをみつけて、VAにお布施して生きろと。

才能もない、とりえもない、頭もよくない、覚えも悪い。

ぐずぐずに崩れた自尊心を取り戻す手助けをしてくれる渚や朋也、恭介や理樹、そんな存在は周囲にはいない。

そんな現実から目を背けるなということなのだろう。

久々にCLANNADを観て、そりゃあもう想像外の感想を抱いたのだ。

現実をまっとうに生きている人々が圧倒的に多い世にこんないじけた文章を残せるのなんてここしかない。

自室に引きこもっていたようにみえた恭介だって、実は虚構世界四苦八苦していた。己の失敗に落胆してはいても、決して行動をやめていたわけではない。

生きることとは行動なのだと、布団の中でスマホを触るオタク作品を通して鼓舞している。

もしもここまで読んでくれた人がいたらありがとう

サマポケ面白かったから買ってプレイしてね、プレイし終わってたらFD発売か京アニアニメ化することを一緒に願おうね。

あとVAにできることは、だーまえ後継者必死に探して育成することか、keyを畳んで新たな才能で作品を作るか、だーまえ治療費を全額出してあげてkeyブランドを守るかだ。

2019-05-04

anond:20190504185952

オタクの人ら、70年代から内でも外でもひたすら喧嘩してる連中のあつまりなんですが…。

宮崎駿高畑勲組合作って労働争議やったり、庵野秀明らがアマチュアから商業業界に無理くり入り込んだり

ポルノ分野で力をつけてメジャーに乗り込んだり(Keyとかニトロ)、タフな人はたくさんいるんですよね。

もちろん弱い人もいるでしょうが、それはどのような属性の人にもいるかと思われます


社畜会社を訴える物語は、経済小説という分野になるのでファンタジー路線ライトノベルには向いてないという話ですよね。

オタクが逃げている、というのは全くそぐわない。やろうと思えばできるけど、市場に対して有効かどうかという問題です。

で、オタクのことをなんで逃げてると思ったんですかね。快楽的な物語を描くことは「逃げること」なんですか?

仕事疲れたから僕の好きな甘いもの食べよー、程度のことなのでは?

2019-04-26

anond:20190426001052

ほい。なんとなく波長に合わなかった面々も多いのであまり気にしないで欲しい

ただ、"死ねばいいのに"といった非生産的タグを使ってるid積極的非表示にしてる

最近ようやくブコメ生産的なコメントばかり並ぶようになったけどブクマ数2桁くらいの新規idが日々増殖しててなかなか大変

b:id:aaaaiyaaaa

b:id:abcd0035

b:id:abcdefghijklmnopqrstuvwxy5

b:id:abll

b:id:abracadabra321

b:id:ad2217

b:id:aflske

b:id:afurikamaimai

b:id:agricola

b:id:akatibarati

b:id:akiko0027

b:id:akutsu-koumi

b:id:allmanbrothers

b:id:alphaorange69

b:id:aneet

b:id:Annihilator

b:id:another931244

b:id:Apps

b:id:aquatofana

b:id:araikacang

b:id:arearekorekore

b:id:arrack

b:id:aruzentina

b:id:astefalcon

b:id:at_home_all_day

b:id:at25250410

b:id:atoz602

b:id:atsushieno

b:id:atsushifx

b:id:aUIDZTN97jhrRQK

b:id:AyanoIchijo

b:id:Ayrtonism

b:id:Balmaufula

b:id:barbarkun

b:id:Barton

b:id:baseb

b:id:beed

b:id:beginnerchang

b:id:behuckleberry02

b:id:beramines37

b:id:bigstrides

b:id:billword

b:id:bisuta

b:id:bitscreen

b:id:blackdragon

b:id:blueeyedpenguin

b:id:bobjoebobbob

b:id:bocbqcmn

b:id:bookmarker35

b:id:bornslippy

b:id:brendon

b:id:buhoho

b:id:bunkashiken

b:id:buu

b:id:bventi

b:id:bYMQ

b:id:c0ntinue

b:id:cabas

b:id:cafeduck

b:id:carios

b:id:catsnail

b:id:cha16

b:id:cheapcode

b:id:chiba1008

b:id:CIA1942

b:id:clamm0363

b:id:cleome088

b:id:cloudliner

b:id:comitlog

b:id:cook593

b:id:coper

b:id:corydalis

b:id:cotbormi

b:id:craprak

b:id:croissant2003

b:id:cruyf

b:id:Cunliffe

b:id:d_doridori

b:id:damae

b:id:dancel

b:id:danseikinametaro

b:id:dareshimu

b:id:daybeforeyesterday

b:id:dazz_2001

b:id:dededidou

b:id:differential

b:id:dimitrygorodok

b:id:djshacho

b:id:doko

b:id:don_ikura

b:id:dongdeng

b:id:douai

b:id:Dragoonriders

b:id:dreamfire

b:id:driving_hikkey

b:id:drying_flower

b:id:dsino

b:id:eggheadoscar

b:id:el-condor

b:id:emmie714

b:id:ene0kcal

b:id:EoH-GS

b:id:exshouqosa

b:id:falkbeer

b:id:fashi

b:id:ffrog

b:id:fishma

b:id:flookswing

b:id:FlowerLounge

b:id:flowing_chocolate

b:id:fn7

b:id:fourddoor

b:id:fujifavoric

b:id:fujitaweekend

b:id:FUKAMACHI

b:id:fumofff

b:id:furseal

b:id:fuzyy

b:id:gakkouhate

b:id:galapagosu

b:id:gbkmm

b:id:ge4678

b:id:gf_ra2

b:id:gfd00016

b:id:ginori446699

b:id:giyo381

b:id:gkmond

b:id:Gl17

b:id:gomaaji

b:id:gomunaga

b:id:gorgeous1020

b:id:goturu

b:id:grdgs

b:id:guguguguPC

b:id:ha8i1i8ah

b:id:hahihahi

b:id:hanajibuu

b:id:hanamizuruzuru

b:id:Hanpuu

b:id:hapilaki

b:id:hapoa

b:id:hase0510

b:id:hate_flag

b:id:hatebutabooboo

b:id:hatehenseifu

b:id:Hayano

b:id:hazlitt

b:id:hdance

b:id:heaco65

b:id:headspa

b:id:Helfard

b:id:hellshake

b:id:helvet

b:id:hetoheto

b:id:hikakinnouraaka

b:id:Hipparchus

b:id:hirokichin

b:id:hiroshe

b:id:hituzinosanpo

b:id:ho4416

b:id:hobbiel55

b:id:hocopi

b:id:houjiT

b:id:hryord

b:id:hunyoki

b:id:hutottyo3

b:id:hyoutenka20

b:id:hyujico

b:id:I_L_S

b:id:iasna

b:id:ifttt

b:id:II-O

b:id:IkaMaru

b:id:ikurii

b:id:imakimam

b:id:Ingunial

b:id:inouey

b:id:invalid_touhu

b:id:irbs

b:id:ironsand

b:id:ishikawake

b:id:iwagrandstar

b:id:j3q

b:id:japonium

b:id:jd9

b:id:jpmccartney-jo

b:id:julienataru

b:id:junk6

b:id:k-holy

b:id:k-wacky76

b:id:kaakaa_hoe

b:id:kae1990

b:id:kagehiens

b:id:kagobon

b:id:kajuido

b:id:kamenoseiji

b:id:kangiren

b:id:kantei3

b:id:kathew

b:id:KAZ99K

b:id:kei_1010

b:id:keisuker

b:id:kemboorg

b:id:kemononeko

b:id:kenjou

b:id:kettkett

b:id:keys250

b:id:khtokage

b:id:kibarashi9

b:id:kibiya

b:id:kiku72

b:id:kikurages

b:id:kimokute-kanenonai-obasan

b:id:kingate

b:id:kinnosabakan

b:id:Kitajgorodskij

b:id:kitamati

b:id:kiwi0120

b:id:kizimuna06

b:id:kk_clubm

b:id:kloud

b:id:knjname

b:id:kokosoko

b:id:Kouboku

b:id:kowyoshi

b:id:krarie

b:id:kudoku

b:id:kumanomiii

b:id:kumpote

b:id:kuro_pp

b:id:kurolab1028

b:id:kuxttoba

b:id:kuzira4ever

b:id:kuzumaji

b:id:kxkx5150

b:id:kyasarin123

b:id:kyogoku174

b:id:lady_joker

b:id:lag-o

b:id:laislanopira

b:id:layback

b:id:lc475nyks

b:id:lectro3000

b:id:localnavi

b:id:lololol_stWh2

b:id:Louis

b:id:Lumin

b:id:MacRocco

b:id:maeda124

b:id:makeyoulaugh

b:id:mame_3

b:id:mamezou_plus2

b:id:marimonbunny

b:id:marony0109

b:id:maruX

b:id:masa_bob

b:id:masabossa

b:id:masahiko_of_joytoy

b:id:masahiro1977

b:id:masakanou

b:id:masao_hg

b:id:masudatarou

b:id:matchy2

b:id:maturi

b:id:MCBYND

b:id:medakamaster

b:id:meshupecialshi1

b:id:mikawa_1964

b:id:millitant_girl_hana

b:id:miluru

b:id:mionhi

b:id:miraiez

b:id:Miroc

b:id:miruna

b:id:Mirunayo

b:id:misopi

b:id:miyakawa_taku

b:id:miz999

b:id:mku2

b:id:mmm143

b:id:moegi_yg

b:id:mohno

b:id:momojiro5200

b:id:mon_sat

b:id:monster-energy-zx14

b:id:mopo123

b:id:moppii

b:id:morikakeokawari

b:id:morimarii

b:id:motobitsrk

b:id:mouseion

b:id:mozukuyummy

b:id:mozz1207

b:id:muchonov

b:id:mugi-yama

b:id:mugicha1000

b:id:mujisoshina

b:id:munioka303

b:id:mur2

b:id:murasakizaru

b:id:mutinomuti

b:id:muutarosan

b:id:myaoko

b:id:n_231

b:id:nachurie

b:id:nack1024

b:id:nakag0711

b:id:nakami_midsuki

b:id:namawakari

b:id:nanana_nine

b:id:nankotsu2

b:id:nao_cw2

b:id:napsucks

b:id:nashirox

b:id:Nean

b:id:neogratche

b:id:nerineko1205

b:id:nissax

b:id:Nobeee

b:id:noemi_itoh

b:id:numtostring

b:id:o8i8s8k8a

b:id:ohayo0

b:id:ohchidani

b:id:ohisashiburi

b:id:oilanlion

b:id:Oji6

b:id:okemos

b:id:oktnzm

b:id:omanchi

b:id:omfnskkak

b:id:onesplat

b:id:ono_matope

b:id:oops_design

b:id:oreoreoore

b:id:osaan

b:id:oshisage

b:id:otation

b:id:Outfielder

b:id:p_funny

b:id:pandaporn

b:id:paradisemaker

b:id:parallel-world

b:id:Parama222

b:id:Pgm48p

b:id:pj_lim

b:id:plenao

b:id:Polyhymnia

b:id:ponjpi

b:id:ponyoponyokun

b:id:popoi

b:id:ppummu

b:id:pratto

b:id:preciar

b:id:proverb

b:id:pukarix

b:id:pzp

b:id:qpni

b:id:quality1

b:id:questiontime

b:id:rag_en

b:id:rakugoman

b:id:riawiththesam

b:id:ribbentrop189

b:id:rider250

b:id:rig

b:id:right_eye

b:id:ringonouen

b:id:RIP-1202

b:id:rKoneru_waiwai

b:id:rocoroco3310

b:id:rodprice

b:id:rti7743

b:id:rurisizimi

b:id:ryun_ryun

b:id:sanshiro921

b:id:sanui0822

b:id:sanukite

b:id:sawaglico

b:id:scopedog

b:id:scorelessdraw

b:id:segawashin

b:id:sekreto

b:id:senbuu

b:id:shea

b:id:shibainu46

b:id:shibaone

b:id:shibuya12

b:id:shimajitan

b:id:shimomurayoshiko

b:id:shin2rou1971

b:id:shinobue679fbea

b:id:shinonomen

b:id:shira0211tama

b:id:shiroikona333

b:id:shsh0shsh

b:id:sika2

b:id:silentliberater

b:id:sin4xe1

b:id:sink_kanpf

b:id:sippo_des

b:id:sisopt

b:id:skicco

b:id:snobbishinsomniac

b:id:songsfordrella

b:id:soratansu

b:id:spirobis

b:id:ss-vt

b:id:ssig33

b:id:starmiss

b:id:stkmkt

b:id:stonedlove

b:id:stp7

b:id:suikax

b:id:sumika_09

b:id:supu6000

b:id:surume000

b:id:sushi-K

b:id:sushisashimisushisashimi

b:id:syasara

b:id:syo-sa19820615

b:id:table

b:id:taimatu

b:id:takamurasachi

b:id:TAKAPPRS

b:id:takashi1211

b:id:takayoz

b:id:take1117

b:id:takuzo1213

b:id:tamu2822

b:id:tanzmuzik

b:id:techboon

b:id:tekitou-manga

b:id:tel30

b:id:teto2645

b:id:tetsuya_m

b:id:theta

b:id:timpotoolf

b:id:TKC1984

b:id:tmurakam

b:id:tnakamura

b:id:tnishimu

b:id:toakai

b:id:tokage3

b:id:tokatongtong

b:id:tomoeyabunko

b:id:Tora1014

b:id:toratsugumi

b:id:toririr

b:id:toro-chan

b:id:townphilosopher

b:id:triceratoppo

b:id:tukanpo-kazuki

b:id:u_xxxx

b:id:uehaj

b:id:ugutan

b:id:ujuki

b:id:unakowa

b:id:underhitpoint

b:id:unfallen_castle

b:id:unfettered

b:id:usi4444

b:id:ustam

b:id:utibori1

b:id:vanillayeti

b:id:vbwmle

b:id:vjdvnf43vd

b:id:vkgofboston

b:id:Wafer

b:id:warp9

b:id:warulaw

b:id:watarux

b:id:wumf0701

b:id:X-key

b:id:xevra

b:id:yakouhai

b:id:yamadatakasi

b:id:yamamoto-h

b:id:YarmUI

b:id:yas-mal

b:id:yasudeyasu

b:id:yasyas

b:id:yoiIT

b:id:yoko-hirom

b:id:yoshis1210

b:id:you1983

b:id:youco45

b:id:your

b:id:yuki_furu

b:id:YUKI14

b:id:z1h4784

b:id:zakinco

b:id:zentarou

b:id:ZeroFour

b:id:zu-ra

b:id:zu2

b:id:zyugem

b:id:zyzy

b:id:zzzbbb

2019-04-15

anond:20190415042641

ざっくりだし同じこと言ってるところもあるかもしれないけど、自分解釈はこんな感じ。

2000年以前は社員数名の弱小エロゲメーカーが小粒の良ゲーを発売できていたが、ボリューム重厚長大化によって開発期間が長期化、開発費は高騰化し、弱小エロゲメーカーの体力がもたなくなった

上記に関連して、そもそも小粒のエロゲーなら流通に乗せる必要もなく同人で出せばいいということに気づいた

2000年移行のファイル共有ソフトカジュアル化も弱小エロゲメーカー沈没を加速した

PS2/PSP(Vita)の頃に全年齢対象版を出す流れがあって割と売れたので、そもそもエロゲである必要があるのか?と気づいた(Key

エロゲが衰退したのはラノベのせい、、、ではない

http://kazenotori.hatenablog.com/entry/2019/04/14/113600

 

00年前後青春ど真ん中だったエロゲヲタのひとりとして衰退理由一言でまとめると、、、

オタクサブカル最前線という地位を失ったから」

だと思う。

あの当時の作品若いオタク熱狂させる力があった。

Leafでいえば『雫』『痕』『To Heart』。Tactics/keyでいえば『MOON.』『ONE』『Kanon』『AIR』『CLANNAD』。TYPE-MOONは『月姫』『Fate/stay night』。エロゲではないけど同人の流れをくんだ『ひぐらしのなく頃に』。

この辺のソフトプレイヤーを熱くさせ、語りたい欲を大いに刺激し(葉鍵板なんてのもあった)、「これエロゲーじゃないか泣きゲーから」などという妄言を口走りながら周囲にプレイを勧めさせるだけの力があった(売上だけなら『鬼作』とか『大悪司』も当時強かったけど語るもんでも勧めるもんでもないから伝播力に欠けた)。

これらはざっくり「伝奇/サスペンス」「泣き」に分けることができてそれぞれブームを作ったけど、かなしいかなそれに続くブームはつくれなかったし、フォロワー作品は年を追うごとに小粒化して(初期は『sense off』とか『みずいろ』とか『秋桜の空に』とか『それ散る』とか良質なフォロワー作品がいっぱいあった)エロゲ全体のブームを急速に沈下させた。エロゲ時代は突然やってきてあっというまに終わった。

自滅、というのは言い過ぎかもしれないが、文化として根付かせることができなかった、ぐらいは言ってもいいだろう。

粒が小さくなって新しい体験提供できなくなったエロゲ世代交代(『恋姫シリーズ世代はいると思ってる)に失敗したし、熱狂してた連中はエロゲといっしょにオタク卒業するか新たな最前線へと旅立っていった。

それは『ラグナロクオンライン』/『東方』(RO2002年開始だけどコミケ流行葉鍵/型月→RO東方と変わっていった(型月はしぶとく東方共存してたような記憶)のは大きなトピック)だったり、ラノベ西尾維新/『ハルヒ』/『とある』/『ゼロ魔』)だったり、ニコ動ボカロアイマス文化だったりした。

ブームが完全に去った現代ソシャゲ(『艦これ』/『デレマス』/『グラブル』/『FGO』)でゲーム体験を満たしつつエロはその同人摂取する時代から本格的にエロゲの出番はないだろう。ニッチ需要同人エロゲが担っているから尚更だ(『奴隷との生活』はヒットしたなあ)。

 

最初URLをはったブログではエロゲの衰退理由として

1. ラノベ深夜アニメソシャゲ(あるいはスマホゲー)など他のメディアに客を奪われた。

2. ファイル共有ソフトなどにより海賊版蔓延して購入者が減った。

3. CDからDVDへの移行、スマホの普及、光学ドライブのつかないノートパソコンの普及など、周辺環境の変化によりプレイヤーが減った。

4. エロゲ大長編化による制作コストプレイコストの上昇。

の4つがかかげられていたけど、

1. はラノベ以外時代がズレてる

2. は共有ソフト以前にコピー問題があったので要因とまではいえない

3. はスマホの普及以外論外(エロゲをやるためにパソコンを買う・組む連中は多数いた。DVDへの移行なんて屁でもないし、光学ドライブがつかない云々はDL販売とかUSBドライブ存在無視してる)

4. は正しい。制作コストの増加とプレイコストの上昇は別問題なので切り分ける必要はあるが、これらの問題は大きかった

という所感。

 

上記以外の理由としてはこのエントリの主張であるオタクサブカル最前線という地位を失ったから」と、もうひとつあるとすればスマホの登場による可処分時間の細切れ化。エロゲをやるようなオタクはもともとインターネットとの親和性が高かったわけで、スマホの登場でネット常時接続する消費スタイルへ移行すると、パソコンに向かってじっくりエロゲプレイするなんてことが難しくなった面はあると思う(ここに物語長大化によってプレイコストが上昇した問題からんでくる)。

 

まあ同人エロゲエロゲといえばエロゲだし、DMM GAMESのエロゲも形をかえたエロゲと言えるだろうし(大本オモコロ記事はまさにその宣伝だ)、FGOエロゲに含めれば(含めるな)過去最大のエロゲ市場爆誕してると言えるのかもしれないが。

 

追記

Q. 「オタクサブカル最前線という地位を失ったから」ってそれトートロジーじゃないの?

A. そう見えるかもしらんけど、オタク熱狂させる弾がなくなったから、という話をしてるつもり。

逆になんで00年前後にそういう作品雨後の筍のごとくでてきたかというとまあ割と謎なんだけどひとつ言えるとしたら若いクリエイター申し訳程度のエロさえつけてれば自分のやりたいことをやれる場所だって認知されたことがデカいんじゃないかなーって(日活ロマンポルノみたいなやつって言えば伝わるのかね)。

Phantom -PHANTOM OF INFERNO-』ってエロゲがある。ニトロプラス(今はたぶん刀剣乱舞で有名)の処女作シナリオぶっさん虚淵玄。今だと『まどマギ』で有名……ってそれももう古いか)。

アメリカ旅行した青年が殺しの現場を見たせいでマフィア拉致られ暗殺者をやらされるって話なんだけど、ハードボイルド小説映画かってあらすじでもうエロゲじゃないよね。で、なんとこのゲーム暗殺に使う銃を選べて、なおかつその銃がポリゴン表現されてた上に、どの銃を選んでもシナリオには一ミリも影響がない、というのが爆笑ポイントで単に作り手がそういうの好きなだけっていう。当時すでにIllusionとかがポリゴンエロゲを世に送り出してたとはいえ銃だけポリゴン表現にしたエロゲって『Phantom』が最初最後じゃねーかな(ゲームめっちゃ面白かったよ念の為)。

『雫』だって新興宗教オモイデ教』のフォロワーだし、菌糸類が菊地秀行とかの影響モロに受けてるの見ても、外の文化エロをつけてエロゲ流通に乗せる、は所謂たまによくあるってやつだった(そういうのの元祖はたぶん蛭田昌人と剣乃ひろゆき)。

まあ結局売り手も買い手もスケベ心があったんだよな。当時はエロさえ入れてれば一定の購買が見込める市場で、市場が未熟な分、制作コストが安くすんだ。買う方としてもエロがあるだけでオトクな感じがしたし地雷でも許せた(Tony絵に騙されて買った『Partner』ですら俺は許したよ)。上で挙げた諸作が仮に非エロだったらここまで売れてなかったと思うね(『CLANNAD』とか『ひぐらし』は地盤を築いた後だったからヒットした説)。

 

さら追記

エロゲ商業パッケージ)の売上は2015年に底を打っててV字回復しているとか,10年代でも名作はあるとか,本当に崩壊したのはエロゲ批評コミュニティだとかいう話をすればいいんです? / “エロゲが衰退したのはラノベのせい、、、ではない”

https://twitter.com/nix_in_desertis/status/1117750519840198656

なんだろな,一連の流れを読んでいて思うのは,『千桃』とか『サクラノ詩』とか『金色ラブリッチェ』とは言わんにせよ,『ホワルバ2』とか『はるくる』とか『つり乙』あたりをスルーされると,お前エロゲ追わなくなって10年近くないか感強くて,一気にもにょるんだよな。

https://twitter.com/nix_in_desertis/status/1117753560047898624

こういう論旨を理解せずに訳知り顔するやつが一番むかつくんだよね。

とりあえずエロゲ市場規模は02年の段階で560億(財界さっぽろ)、15年の実績値で150億(矢野総研)。V字回復というからには18年実績値で300億ぐらいに戻してるんだろうな?

そして本稿は00年台前半にエロゲ市場が盛り上がったあと衰退した理由をその当時オタクシーンの最前線をはれる弾がありその後そういうのがなくなったから、に求めてるのであって、それ以降にエロゲとして名作と呼ばれる作品があったかなかったかなんて話は一切していない。

俺が最後にやったエロゲは『もっと!孕ませ!炎のおっぱい異世界エロ魔法学園』(2018年4月27日発売)だ。ゲスパーすんなヴォケ。

 

またムカつくコメントがついたら全力で殴りに行く。

2019-02-23

anond:20190223045232

perlでは連想配列

しかし、この話を読んでJavaだけ違うよなって思ってしまった。他のはみんな実装言語処理系にお任せだけれど、JavaだけはMapは単なるインタフェースで、どの実装にするかはお前が選べってところがねぇ。こいつだけはGenericsを使って、keyvalueの型を指定するのも違う。

Javascriptはプロトタイプベースオブジェクト指向言語から、こいつもこいつで思想が他のと違うんじゃないかとも思えてきた。

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:20190101161939

次の解説

staticキーワードを付けることで

クラス内にグローバル関数から呼べる関数を作る

これでHWNDを通して

グローバル関数にthisポインタを伝える

	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;
	}

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-21

https://anond.hatelabo.jp/20181221162102

七福神 -- Key:雑学事典より。

後に福禄寿寿老人が加えられ、七福神誕生することとなった。この際、五福神福禄寿を加えただけでは六福神になるため、「福」と「禄」を福禄寿とし、「寿」だけを独立させて寿老人を作り、無理矢理七福神としたと伝えられる。

福禄寿寿老人神様ではなく仙人であり、元々数合わせ的に参加させられたためか、元禄10年(1697年)の『日本七福神伝』には、「福禄寿の変わりに吉祥天七福神に加えてもよい」と記され、また享保年間(1716-1735年)の『書言字考』では寿老人に代えて猩猩七福神の一柱とされている。また、寿老人福禄寿はともに南極老人星化身とされることから、この二神は本来同一とみなし、寿老人の代わりに吉祥天猩猩が入れられた時代もあったといわれている。

2018-12-20

自分デッドロック対策トランザクションかけてる時は、primary key昇順で更新するように気をつけるてるんだよ、

でも他の人はselect ... for updateで別トランザクション更新後の値を取得しつつデッドロック対策してて、自分もその書き方に直すとなると結構手間だな

2018-12-13

当時16歳の私から見た『涼宮ハルヒの憂鬱

私は1990年まれ高校の時にリアルタイムハルヒニコニコ動画出会った男性です。あまりアニメ全般については詳しくありませんが、私の経験の限りにおいてハルヒについて語ってみます

ハルヒは当時の印象では「わけがからないが、とにかく新時代のすごいアニメ」という作品でした。一つ一つの要素を見ると取り立てて珍しいものではないのですが、それらをアレンジするセンスと細部のクオリティがずば抜けていたと思います

まず、日常系学園ラブコメと高度なSFとを融合させたアニメが珍しかたことは記憶しています。当時の私はスクールランブルあずまんが大王にハマっていましたし、エヴァンゲリオンカウボーイビバップも大好きでした。しかし、両者の世界観が融合するような日常系アニメがあり得るとは思ってもいませんでした。その後六畳間の侵略者ニャル子さんなど似たような作品が出てきましたが、少なくとも当時の私にとっては斬新な世界観でした。

もちろん作画も素晴らしかったです。これについて私はほとんど語れませんが、日常系萌え作品であれだけぬるぬると人物を動かしたことには驚きました。それまではロボット飛行機をどれだけなめらかに動かすのかについては意識してきました。しか美少女の手足や顔を実写のように丁寧に動かすことについては、ほとんど注目していませんでした。明らかにキャラクター日常身体動作を美しく作画する流れは、けいおんやその他の萌えアニメに繋がっていったでしょう。

また、ブログや2chなどでの考察が盛んになったのもこの頃でした。ハルヒは謎が多い設定や話数シャッフルなど、視聴者探究心を刺激するギミックが多数仕掛けられていました。当時のアニメブログ上では考察記事参考書籍の一覧があちこちで見られ、2chでは解釈を巡る論争が白熱していました。その後、シュタインズ・ゲートまどマギでも同じような光景が繰り広げられることになります

さらにはニコニコ動画Youtubeの「ハレ晴レユカイ踊ってみた動画社会現象になりました。この流行高校生や大学生の社交的な人々の多くが参加したこと意味は大きかったです。これによって電車男以来続いてきた、社会におけるオタク文化容認の流れが加速することになったと思います。深夜に放送している萌えアニメが、陰気なオタクが見るものから「(女性も含めた)普通の」中高生も楽しめるものに変わる転機でした。

2000年代京アニは、Key作品のような男主人公ハーレムかららき☆すたけいおんのような百合日常物へと変化していきました。それは2000年代から2010年代にかけてアニメの潮流がエロゲ的な物からラノベきらら的な物、オタク的な物からサブカル的な物、男性作家原作から女性作家原作へと変化する動きと重なっているように私には見えました。そういったアニメ界の地殻変動結節点存在していたのがハルヒであり、90年代文化終焉10年代に続く新たな文化の始まりの両者を象徴するアニメだったのではないかと今にして思うのです。もしかするとハルヒのこうした両義的な立ち位置フォロワーの少なさに影響しているのかもしれません。

ちなみに2010年前後の私は一連のアニメ業界流行の変化を「男性向けアニメ少女マンガ化」だと漠然と感じ、個人的にそのことを嬉しく思っていました。というのも私はエロゲ象徴されるようなハーレム作品が苦手で、少女漫画百合が大好きだったからです。けいおん以降の百合アニメ全盛のこの10年間は私にとってアニメ黄金期でした。今後、ハルヒやその前後アニメの潮流は、どのように分析批評されるのでしょうか?近い内にどなたかが『10年代想像力』を書かれる日を楽しみにしています

ハルヒ第三次オタク黎明期〜隆盛期間だから分析は難しい

anond:20181212171225

ちょいちょい分析として抜けてるので勝手上から目線で補足してみたい。

下手くそ補足ってことは最初に謝っておく

あくま社会的観点として分析で、

作品の是非や好みは個人問題だと思う。

京アニについて

京アニハルヒ以前にAIRがあり、加えてもともと人気ラノベフルメタの二期もやりきり、

すでに実力派だったよね。Key作品もあったから、

人気原作 + 泣き演出 + 作画 という武器の多さもあったと思う。

ラノベブームは背景にエロゲブームもあったのよ

ラノベエロゲ同人月姫ひぐらし)が相互に影響を与えていったというのがある。

メディアミックス読み物コンテンツアニメ化が色々されてきた頃だった。

今はエロゲ原作ってほとんどないんだよな。。

音楽は歌だけでなく、劇伴人気もあった。

今はアニメ界のAKBであるアイドルマスター楽曲をやっていたMONOKAの人が

劇伴担当してコア層も確保してた。

メディアミックス展開のお手本というのがハルヒの一番の強み

まとめの通り社会的な変化が背景にあった。

加えて、ハルヒアニメ人気がでたあとも、二期までは本当に

毎月といってもいいくらい何かしらコンテンツを順繰りに出し続けてた。

アニメ

ラノベ新刊

マンガ

フィギュア

ゲーム

キャラソン

イベント

・毎年7月サイト更新とか

今はどの作品も当たり前のようにやりすぎてる手法麻痺してるけど、

オタクコンテンツがまだ少ない当時、

ここまで上手に展開し続けたのは当時少なかったじゃないかな。。

これも角川の資本があったからだと思う。

最後個人的な感想

なんだかんだハルヒ面白い

小説ラノベを初めてまとめ買いした作品だった。

SFとか全然しらなかったけど、

野ブタをプロデュースとか、蹴りたい背中とかもあったからかな、

当時は作品青春をすごく感じた記憶がある。

ほんと純粋に魅力があったよなーと思うわ。

2018-12-03

日本ポリコレって女性限定から男性オーケーな変更が多い

https://ja.m.wikipedia.org/wiki/ポリティカル・コレクトネス

これ見てて思った

性別限定する職業を男女共通で使えるようにするのもポリコレだが↓のように

職業 伝統的な表現 ポリティカル・コレクト表現

議長 chairman chairperson または chair

警察官 policeman police officer

消防官 fireman fire fighter

実業家 businessman businessperson

写真家 cameraman Photographer[要検証 – ノート]

要の人物 key man key person

英語で見ると男性限定表現だったもの女性も使えるようになった例が多い

それに対して日本女性限定名称男性も使えるように変更されたものが多い。

この違いはどこからまれたのか興味深い。

カメラマンビジネスマンキーマンのような海外では既に改定された用語はそのままなのは日本人はマン=男という意識が薄いからだろうか?

従来の用語 中立用語 備考

看護婦

看護士 看護師 2002年保健師助産師看護師法改正男性職業に就いているため。

障害者 障がい者

障碍者 「害」の字が使われていることに不満がある人の感じる悪い印象を回避するため。2001年平成13年)に東京都多摩市最初採用

助産婦 助産師 2002年保健師助産師看護師法改正。ただし現行では資格付与対象女性限定である同法3条)。

保健婦 保健師 2002年保健師助産師看護師法改正

保母

保父 保育士 1999年児童福祉法改正男性職業に就いているため。

スチュワーデス

スチュワード 客室乗務員

フライトアテンダント

キャビンアテンダント (CA) 1996年日本航空が従来の呼称廃止。他社も追随した。世界航空会社では、男性従事している。

土人 先住民 1997年北海道土人保護廃止

トルコ風呂 ソープランド トルコ人留学生、ヌスレットサンジャクリの抗議により、1984年に改称。

肌色 ペールオレンジ

うすだいだい 人種により、肌の色は異なることから

女優 俳優 男優という言葉があるのにもかかわらず、男性のみに俳優という肩書が使われることが多いため。

メクラフランジ 閉止フランジ JISなども改正済み 英語ではblank flange・blind flangeなどと云い、JISでも記号BLと残る

ログイン ユーザー登録
ようこそ ゲスト さん