約 2,327,735 件
https://w.atwiki.jp/nakaox/pages/4.html
https://w.atwiki.jp/nakaox/pages/5.html
IEでフロートさせたボックスのマージンが倍になるバグ
https://w.atwiki.jp/seasartaro/pages/54.html
備忘録的にばらばらと書いていこうと思います。 JavaコーダーなのでJavaをやったことのある方だと説明がマッチするかと思われます。 順番はコップ本になるべく沿った形で書いていこうと思います。
https://w.atwiki.jp/yellow-yellow/pages/30.html
imgタグ 「width」と「height」「alt」は記述するが「border」はcssで指定する。 br clear="all" / 便利だけどCSSで指定するのがベター 連続した br レイアウト調整に手軽なのだが、よろしくない
https://w.atwiki.jp/codings/pages/4.html
ニュース @wikiのwikiモードでは #news(興味のある単語) と入力することで、あるキーワードに関連するニュース一覧を表示することができます 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_174_ja.html たとえば、#news(wiki)と入力すると以下のように表示されます。 【カウンターサイド】リセマラ当たりランキング - カウサイ攻略Wiki - Gamerch(ゲーマチ) ウィキペディアを作ったiMacが箱付きで競売に登場。予想落札価格は約96万円!(ギズモード・ジャパン) - Yahoo!ニュース - Yahoo!ニュース 終末のアーカーシャ(終アカ)攻略wiki - Gamerch(ゲーマチ) メトロイド ドレッド攻略Wiki - Gamerch(ゲーマチ) 【まおりゅう】最強パーティー編成とおすすめキャラ【転スラアプリ】 - Gamerch(ゲーマチ) 【グランサガ】リセマラ当たりランキング - グランサガ攻略wiki - Gamerch(ゲーマチ) アイプラ攻略Wiki|アイドリープライド - AppMedia(アップメディア) マニュアル作成に便利な「画像編集」機能を提供開始! - ナレッジ共有・社内wikiツール「NotePM」:時事ドットコム - 時事通信 マニュアル作成に便利な「画像編集」機能を提供開始! - ナレッジ共有・社内wikiツール「NotePM」 - PR TIMES 【アイプラ】リセマラは必要?当たりキャラランキング【IDOLY PRIDE】 - Gamerch(ゲーマチ) 篠原悠希×田中芳樹が明かす「歴史ファンタジー小説ならではの悩み」(現代ビジネス) - Yahoo!ニュース - Yahoo!ニュース 【Apex Legends】ヴァルキリーの能力と評価【エーペックス】 - Gamerch(ゲーマチ) モンハンライズ攻略Wiki|MHRise - AppMedia(アップメディア) 【ウインドボーイズ】リセマラ当たりランキング(最新版) - ウインドボーイズ攻略Wiki - Gamerch(ゲーマチ) ポケモンBDSP(ダイパリメイク)攻略wiki - AppMedia(アップメディア) SlackからWikiへ!シームレスな文章作成・共有が可能な「GROWIBot」リリース - アットプレス(プレスリリース) 【ウマ娘】ナリタブライアンの育成論|URAシナリオ - Gamerch(ゲーマチ) 【ウマ娘】ヒシアケボノの育成論|URAシナリオ - Gamerch(ゲーマチ) 【ウマ娘】フジキセキの育成論|URAシナリオ - Gamerch(ゲーマチ) ドラゴンクエストけしケシ攻略Wiki - Gamerch(ゲーマチ) サモンズボード攻略wiki - GameWith 【スタオケ】カード一覧【金色のコルダスターライトオーケストラ】 - Gamerch(ゲーマチ) 【スマブラSP】ソラのコンボと評価【スマブラスペシャル】 - Gamerch(ゲーマチ) 【ブレフロレゾナ】リセマラ当たりランキング【ブレイブフロンティアレゾナ】 - ブレフロR攻略Wiki - Gamerch(ゲーマチ) 【ガーディアンテイルズ】ギルドレイド戦(秘密の研究所)の攻略とおすすめキャラ【ガデテル】 - Gamerch(ゲーマチ) 仲村トオル、共演者は事前に“Wiki調べ”(オリコン) - Yahoo!ニュース - Yahoo!ニュース 【ENDER LILIES】攻略チャートと全体マップ【エンダーリリィズ】 - Gamerch(ゲーマチ) 【ウマ娘】あんしん笹針師の選択肢はどれを選ぶべき? - Gamerch(ゲーマチ) 【ポケモンユナイト】アップデート情報・キャラ調整まとめ - ポケモンユナイト攻略Wiki - Gamerch(ゲーマチ) 【Apex】シーズン11の新要素と最新情報まとめ【エーペックス】 - Gamerch(ゲーマチ) ロストジャッジメント攻略Wiki - Gamerch(ゲーマチ) 【Among us】新マップThe Airship(エアシップ)の解説【アモングアス】 - Gamerch(ゲーマチ) ハーネスについて小児科医の立場から考える(坂本昌彦) - 個人 - Yahoo!ニュース - Yahoo!ニュース ゼルダ無双攻略Wiki|厄災の黙示録 - AppMedia(アップメディア) 【テイルズオブルミナリア】リセマラ当たりランキング - TOルミナリア攻略Wiki - Gamerch(ゲーマチ) 【ポケモンユナイト】ユナイトライセンスの入手方法まとめ - AppMedia(アップメディア) ウマ娘攻略Wiki - AppMedia(アップメディア) ゲトメア(ゲートオブナイトメア)攻略Wiki - Gamerch(ゲーマチ) 【白夜極光】リセマラ当たりランキング - 白夜 極光 wiki - Gamerch(ゲーマチ) お蔵入りとなった幻の『スーパーマリオ』 オランダの博物館でプレイ可能?(リアルサウンド) - Yahoo!ニュース - Yahoo!ニュース ナレッジ共有・社内wikiツール「NotePM」が「ITreview Best Software in Japan 2021」のTOP50に選出 - PR TIMES 真女神転生5攻略Wiki|メガテン5 - AppMedia(アップメディア) 【B4B】近接ビルドデッキにおすすめのカード【back4blood】 - Gamerch(ゲーマチ) ポケモンスナップ攻略wiki - AppMedia(アップメディア) 富野由悠季「ブレンパワード」作り直したい!ファンを前に意欲(シネマトゥデイ) - Yahoo!ニュース - Yahoo!ニュース 【スマブラSP】カズヤの評価とコンボ【スマブラスペシャル】 - Gamerch(ゲーマチ) ナレッジ共有・社内wiki「NotePM」が「ITreview Grid Award 2021 Fall」で、チームコラボレーションとマニュアル作成部門において「Leader」を5期連続でW受賞! - PR TIMES メモ・ドキュメント・wiki・プロジェクト管理などオールインワンのワークスペース「Notion」が日本語ベータ版提供開始 - TechCrunch Japan 【ギアジェネ】リセマラ当たりランキング【コードギアス】 - ギアジェネ攻略Wiki - Gamerch(ゲーマチ) モンスターファーム2(MF2)攻略wiki|アプリ・Switch移植版 - AppMedia(アップメディア) 【ブラサジ】最強キャラTierランキング【ブラックサージナイト】 - Gamerch(ゲーマチ) 【パワプロ】鬼滅の刃コラボ情報まとめ - Gamerch(ゲーマチ) 【SPAJAM2021】第3回予選大会は「クイズ!WIKIにゃんず!」を開発したチーム「かよちゃんず」が最優秀賞! | gamebiz - SocialGameInfo 検索結果における「ナレッジパネル」の役割とは・・・ウィキメディア財団とDuckDuckGoの共同調査 - Media Innovation 【ウマ娘】解放結晶の入手方法と使い方 - Gamerch(ゲーマチ) ナレッジ共有・社内wikiツール「NotePM」が「BOXIL SaaS AWARD 2021 Autumn」にて「コラボレーション部門」を受賞! - PR TIMES 「ゼルダの伝説 BotW」のマラソンで23秒? 驚きの速さで完走した方法が話題(リアルサウンド) - Yahoo!ニュース - Yahoo!ニュース Wikipediaが「中国人編集者の身の安全を守るため」に一部の編集者アカウントをBANに - GIGAZINE 【ドッカンバトル】3.5億ダウンロードキャンペーン最新情報 - ドッカンバトル攻略Wiki - Gamerch(ゲーマチ) BTS(防弾少年団)のV、8月のWikipedia閲覧数が韓国アーティストで1位!グループでは4ヶ月連続トップ - Kstyle 【イース6オンライン】リセマラ当たりランキング|召喚ガチャの開放条件は? - Gamerch(ゲーマチ) 『復活のルルーシュ』の後を描くアプリ『コードギアス』新情報公開。古代中華を観測する『血盟の紅羽』などが展開 - 電撃オンライン BacklogからNotePMへwiki情報を自動API連携する「Backlog to NotePM」をSaaStainerに掲載開始 - PR TIMES ライザのアトリエ2攻略Wiki - AppMedia(アップメディア) 真女神転生3リマスター攻略Wiki|メガテン3 - AppMedia(アップメディア) タスクも文書もWikiもデータベースもまとめて管理できる「Notion」とは? - ASCII.jp ナレッジ共有・社内wikiツール「NotePM」が、見るだけ専用ユーザー『無料』の新プランを発表! - PR TIMES 【かのぱず】リセマラ当たりランキング【彼女お借りします】 - Gamerch(ゲーマチ) 【乃木フラ】リセマラの必要はある?【乃木坂的フラクタル】 - Gamerch(ゲーマチ) 【パワプロ】生放送まとめ|パワフェス2021 - パワプロ攻略Wiki - Gamerch(ゲーマチ) 【ポケモンユナイト】サーナイトのおすすめビルド(わざ・持ち物) - Gamerch(ゲーマチ) ルーンファクトリー5攻略wiki|ルンファク5 - AppMedia(アップメディア) シャーマンキングふんばりクロニクル攻略Wiki - Gamerch(ゲーマチ) アーテリーギア‐機動戦姫-攻略Wiki - Gamerch(ゲーマチ) 簡単操作で自分専用Wikiを構築できるMarkdownエディタ「Obsidian」のモバイル版を使ってみた - GIGAZINE 【東京リベンジャーズ】場地圭介の声優情報と注目ポイントをご紹介!|編集部コラム - AppMedia(アップメディア) 情報マネジメントツール「Huddler」がwiki機能を刷新 - PR TIMES シェアエコ配送アプリ「DIAq(ダイヤク)」のアンカーアプリで、高層ビル・商業施設の入館方法などお役立ち情報をまとめた「DIAqwiki」を公開 - アットプレス(プレスリリース) 【ツイステ】マスターシェフの攻略~辛味のふるさと~【料理イベント】 - Gamerch(ゲーマチ) 【ラグナロクオリジン】リセマラは不要?おすすめ職業は?【ラグオリ】 - Gamerch(ゲーマチ) 白夜極光攻略wiki - AppMedia(アップメディア) 【バイオミュータント】2.02アプデ|アップデート1.4情報 - バイオミュータント攻略Wiki - Gamerch(ゲーマチ) ニーアレプリカントリメイク攻略wiki|ver.1.22 - AppMedia(アップメディア) 【ウマ娘】ゴルシウィークはいつから?キャンペーン情報まとめ - Gamerch(ゲーマチ) シーズン66 - 【超速GP】ミニ四駆 超速グランプリ攻略まとめwiki - 電撃オンライン 乃木坂的フラクタル攻略Wiki - Gamerch(ゲーマチ) 「こんなことになるとは…」13年前のエイプリルフールについた“嘘”がネットで… ある男の告白(BuzzFeed Japan) - Yahoo!ニュース - Yahoo!ニュース 整理不要の情報共有ツール(社内Wiki)「Nerve」シードラウンドで総額約3500万円の資金調達を実施 - PR TIMES Nerve - 整理不要の情報共有ツール(社内Wiki) ローンチカスタマー募集開始のお知らせ - PR TIMES Among Us攻略Wiki【アマングアス・アモングアス】 - Gamerch(ゲーマチ) 稲作アクションRPG『天穂のサクナヒメ』における「農林水産省攻略wiki説」は本当なのか? - AUTOMATON 無料とは思えない多機能っぷりなWikiインフラ「Wiki.js」レビュー、自前でホスト&外部サービスと連携可能 - GIGAZINE Microsoft Teamsの基本と活用(24) TeamsのWikiを使う - マイナビニュース 『ゲーミングお嬢様』での提起が話題に “企業系wiki”に横たわる問題点とは - リアルサウンド 「エイリアンのたまご」,自動周回機能と公式wikiが登場 - 4Gamer.net 【リゼロス】Re ゼロから始める異世界生活 Lost in Memories攻略まとめwiki - 電撃オンライン ヌーラボ、プロジェクト管理ツール「Backlog」の絵文字入力の補完機能・Wiki編集の自動マージ機能を修正改善 - PR TIMES Backlog、Wikiにファイル添付が容易にできる機能をリリース -- グローバルバーの視認性改善なども実施 - PR TIMES GK川島、パンチング失点でWiki書き換え炎上 「セネガル代表」「プロボクサー」... - J-CASTニュース 「ウィキ」の「寄付バナー」がデカすぎ 「広告にしたら?」の声、元管理者にぶつけると... - J-CASTニュース
https://w.atwiki.jp/makimaaki/pages/18.html
見やすいプログラムかどうかは、コーディングスタイルで決まります。 メンテナンス性向上のためにも全員が守れるようにしましょう。 代入 変数に値を導入する際には、変数名とイコール、イコールと値の間には必ず空白を入れなければならない。通常は半角空白を1つとする。ただし、可読性向上のための複数の空白であれば、入れることを推奨。 計算式を代入する場合などは、各要素の間に空白を入れる 代入の例 $total = 1 + 2; //良い例 $total = $value1 + $value2; //良い例 $total = (1 + 2) * 2; //良い例 $total=1+2; //悪い例 $total = $value1+$value2; //悪い例 $total = ( 1 + 2 ) * 2; //悪い例 複数行の代入を揃える例 //良い例(下に合わせるため空白を入れた) $name = 山田太郎 ; $address = 東京都港区 ; //悪い例(イコールがずれ、見にくくなる) $name = 山田太郎 ; $address = 東京都港区 ; 文字列 文字列はリテラル(変数の展開などが含まれない)か否かに関わらず、「シングルクォート( )」で囲まなければならない 文字列中に改行を入れたい場合は、改行部分のみ「ダブルクォート(")」で囲み、「ドット(.)」で連結する 文字列の連結には「ドット(.)」を使用し、ドットの前後には常に空白を入れなければならない。複数行になる場合、二行目以降の変数名記述は不可。ドットを一行目のイコールと同じ位置にして連結する。 配列が改行で長くなる場合は、複数行の記述でも構わないが、二行目以降の開始位置は、array()の後ろに合わせる リテラル:最もシンプルな例。「シングルクォート」で囲む $greeting = こんにちは。 ; //良い例 $greeting = "こんにちは。"; //ダブルクォートは使わない 文字列の連結:文字列の連結には「ドット(.)」を使用。ドットの前後には常に空白を入れなければならない $greeting = こんにちは。 . 今日はいい天気ですね。 ; 連結が長くなる場合:複数行の記述でも構わないが、二行目以降の変数名の記述は不可。二行目以降のドットは一行目のイコールと同じ位置にする //良い例 $greeting = こんにちは。今日はいい天気ですね . でも夕方から雨が降るそうですよ ; //悪い例 変数名を複数回記述することで混乱の元になる恐れがある $greeting = こんにちは。今日はいい天気ですね ; $greeting .= でも夕方から雨が降るそうですよ ; 変数の展開:文字列中に変数を入れたい場合は、文字列の連結を使用。「ダブルクォート」を使用してはいけない $greeting = こんにちは、 . $name . さん。 ; //良い例 $greeting = こんにちは、 $name . さん。 ; //悪い例 $greeting = こんにちは、{$name}さん。 ; //悪い例 改行の使用:文字列中に改行を入れたい場合は、改行部分のみ「ダブルクォート」で囲み、連結する //良い例 $greeting = こんにちは。 . "\n" . 今日はいい天気ですね。 ; //悪い例 改行が分かりにくい $greeting = "こんにちは。\n今日はいい天気ですね。"; 配列が改行で長くなる場合:複数行の記述でも構わないが、二行目以降の開始位置は、array()の後ろに合わせる //良い例 $myArray = array(1, 2, 3, Zend , Framework , $value1, $value2, $value3, 100, 200, 300); //悪い例 区切りのカンマを行頭に書いてはいけない $myArray = array(1, 2, 3, Zend , Framework , $value1, $value2, $value3 , 100, 200, 300); 配列 通常配列 配列の添字に負の数を使用してはならない 特別な理由が無い限り0から始める array()を使用して数値添字の配列を宣言する場合は、要素を区切るカンマの後に空白を入れなければならない 通常配列の例 //良い例 $myArray = array(1, 2, 3, Zend , Framework ); //悪い例 要素を区切るカンマの後に空白がない $myArray = array(1,2,3, Zend , Framework ); //悪い例 カッコ内の前後に空白を入れてはいけない $myArray = array( 1, 2, 3, Zend , Framework ); 連想配列 連想配列をarray()で宣言する場合、1要素につき改行を入れなければならない 各要素の開始位置は揃えて記述する 連想配列の例 $myArray = array( firstKey = firstValue , secondKey = secondValue ); 要素が多い場合:終了のカッコをarrayの先頭に合わせる $myArray = array( firstKey = firstValue , secondKey = secondValue thirdKey = thirdValue fourthKey = fourthValue fifthKey = fifthValue ); 条件分岐(if/else/else if) 条件を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない 条件文の中では演算子の前後にも空白を入れる 条件分岐開始の中カッコ({)は条件文と同じ行に書き、終了の中カッコ({)は改行して書かなければならない 中カッコ内では「半角空白4文字分の字下げ」を行う 「elseif」は使用しない。「else if」(「else」と「if」の間に空白を入れる)を使用する 条件が一つの場合 //良い例 if ($age 20) { echo 未成年です。 ; } //悪い例 (条件を指定するカッコ前およびカッコを閉じた後のそれぞれ空白や演算子前後の空白が無い) if($age 20){ echo 未成年です。 ; } //悪い例 (演算子前後の空白が無い) if ($age 20) { echo 未成年です。 ; } //悪い例 (条件を指定するカッコ前およびカッコを閉じた前にも空白を入れてしまっている) if ( $age 20 ) { echo 未成年です。 ; } //悪い例 (改行がない) if ($age 20) { echo 未成年です。 ; } //悪い例 (改行位置が違う) if ($age 20) { echo 未成年です。 ; } 条件分岐が続く例 //良い例 if ($age 20) { echo 未成年です。 ; } else if ($age 30) { echo 20代です。 ; } else { echo 30代です。 ; } //悪い例 (elseifは使わない) if ($age 20) { echo 未成年です。 ; } elseif ($age 30) { echo 20代です。 ; } else { echo 30代です。 ; } 選択分岐(switch) 条件を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない switchの中は「半角空白4文字分の字下げ」を行い、さらにcaseの中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)はswitchと同行に書き、終了の中カッコ(})は改行して書かなければならない defaultは決して省略してはならない switchの例 //良い例 switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; case rainy echo 傘は必須です。 break; default //何もなくても省略してはいけない break; } //悪い例(空白行がないと見にくい) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; case rainy echo 傘は必須です。 break; default //何もなくても省略してはいけない break; } //悪い例 (defaultは省略不可) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; case rainy echo 傘は必須です。 break; } //悪い例(caseの中はインデントが必要) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; (後略) //悪い例 (case自体もインデントが必要) switch ($weather) { case fine echo いい天気ですよ! ; break; case cloudy echo ちょっと曇ってますね。 break; (後略) //悪い例 (開始の中カッコは switch と同行に書く) switch ($weather) { case fine echo いい天気ですよ! ; break; (後略) //悪い例 (カッコの前とカッコ終了の後には空白が必要) switch($weather){ case fine echo いい天気ですよ! ; break; (後略) //悪い例 (カッコの中は空白禁止) switch ( $weather ) { case fine echo いい天気ですよ! ; break; (後略) 繰り返し(while) 条件を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない whileの中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)は、whileと同じ行に書き、終了の中カッコ(})は改行して書かなければならない whileの例 // 良い例 while ($i 10) { echo $i . 回目の出力です。 ; $i++; } //悪い例(まったく空白が入っていない) while($i 10){ echo $i . 回目の出力です ; $i++; } //悪い例(カッコ内に演算子の前後には空白が必要) while ($i 10) { echo $i . 回目の出力です ; $i++; } //悪い例(カッコの中は空白禁止) while ( $i 10 ) { echo $i . 回目の出力です ; $i++; } //悪い例(中カッコの開始はwhileと同行にしなければならない) while ($i 10) { echo $i . 回目の出力です ; $i++; } 繰り返し(for) 条件式を指定するカッコ前およびカッコを閉じた後に、それぞれ空白を入れなければならない forの中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)はforと同じ行に書き、終了の中カッコ(})は改行して書かなければならない 条件式の各要素のセミコロン(;)の後には空白を入れる 条件式の各要素に演算子が入っている場合は、その前後に空白を入れなければならない forの例 //良い例 for ($i = 0; $i 10; $i++) { echo $i . 回目の出力です。 ; } //悪い例(条件式の演算子の前後やセミコロンの後に空白を入れなければならない) for ($i=0;$i 10;$i++) { echo $i . 回目の出力です。 ; } //悪い例(条件式の前後に空白を入れてはいけない) for ( $i = 0; $i 10; $i++ ) { echo $i . 回目の出力です。 ; } //悪い例(中カッコの開始は while と同行にする) for ( $i = 0; $i 10; $i++ ) { echo $i . 回目の出力です。 ; } for文は配列の要素数分ループさせるなどで利用する事が多いですが、配列の要素数の取得を条件式に入れてはなりません。これは、ループするたびに配列の要素数を取得する処理が実行されてしまうからです 条件式では関数を呼び出してはならない // 良い例 $cnt = count($data); for ($i = 0; $i $cnt; $i++) { echo $data[$i]; } //悪い例(条件式内で関数呼び出しをしてはいけない) for ($i = 0; $i count($data); $i++) { echo $data[$i]; } 関数の使用 関数名とカッコの間に空白は入れてはならない 引数が複数ある場合は、引数の区切りのカンマの後に空白を入れる 関数の例1 //良い例 $outData = htmlspecialchars($message); //悪い例(関数とカッコの間に空白を入れてはならない) $outData = htmlspecialchars ($message); //悪い例(引数のカッコ内に空白を入れてはいけない) $outData = htmlspecialchars( $message ); 関数の例2 //良い例 $aList = explode( - , $tel); //悪い例(関数とカッコの間に空白を入れてはならない) $aList = explode( - , $tel); //悪い例(引数と引数の間には空白が必要) $aList = explode( - ,$tel); //悪い例(引数のカッコ内に空白を入れてはいけない) $aList = explode( - , $tel ); 関数の宣言 関数を宣言する場合は、関数内とカッコの間に空白を入れてはいけない 引数が複数ある場合は、引数の区切りのカンマの後に空白を入れる 関数の中は「半角空白4文字分の字下げ」を行う 開始の中カッコ({)は関数名と同じ行に書き、終了の中カッコ(})は改行して書く 関数の宣言の例 //良い例 function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(関数内は半角空白4文字分の字下げが必要) function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(引数の間に空白がない、引数の同じカッコの後に空白がない) function myFunc($param1,$param2){ $total = $param1 + $param2; return $param; } //悪い例(関数名の後に空白をいれてはいけない) function myFunc ($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(中カッコの開始は関数名と同行でなければならない) function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } //悪い例(return する値をカッコで囲んではいけない) function myFunc($param1, $param2) { $total = $param1 + $param2; return ($param); } クラスの宣言 クラスの宣言の開始の中カッコはクラス名の下に書かなければならない(one true brace形式) 終了の中カッコ(})は改行して書く クラス内は全て「半角空白4文字分の字下げ」を行う クラスの宣言の例 //良い例 class MyClass { //クラス内は半角空白4文字分の字下げが必要 } クラスのメンバー変数の宣言 クラス内で宣言される全てのメンバー変数は、クラス開始の中カッコの事業にまとめて書かなければならない メンバー変数は適切なアクセス権限(「private」「public」「protected」)で宣言する !!基本は「private」です。外部からメンバー変数に代入させたい場合は「public」にして直接代入するのではなく、アクセサ(set/get)を使用してください。 クラスのメンバー関数宣言の例 //良い例 class MyClass { private $_variable1; //良い例 public $_variable2; //良い例 protected $_variable3; //良い例 var $variable3; //エラーにはならないが悪い例 } クラスのメンバー関数の宣言 クラスのメンバー関数宣言の開始の中カッコ({)はメンバー関数名の下に書かなければならない(one true brace形式) 終了の中カッコ(})は改行して書く メンバー関数内は全て「半角空白4文字分字下げ」を行う メンバー関数名と引数の開始カッコの間に空白は入れてはいけない クラスの宣言の例 //良い例 class MyClass { private function myFunc($param1, $param2) { $total = $param1 + $param2; return $param; } } コメント コメント記号の後に必ず空白を入れなければならない 複数行コメントの場合はコメント開始記号の行と終了記号の行には他の文字を書いてはならない コメントの例 //一行コメント ←良い例 //一行コメント ←悪い例 //良い例 /* これは 複数行コメントです */ // 悪い例 /* これは 複数行コメントです。 */ // 悪い例 /*これは複数行コメントです。*/ プログラム中のSQL文の記述 SQL文内にシングルクォートが含まれるためシングルクォートではなくダブルクォートで囲む SQL構文や関数は、大文字で記述する 可読性を良くする為、適切にインデントを行う プレースホルダを使う場合はmシングルクォートで囲む SQL文の例 //良い例 $sql = "SELECT " . "id, " . "name " ."FROM " . "m_user " ."WHERE " . "group = 開発部 "; //良い例 (プレースホルダを使う場合) $sql = SELECT . id, . name . FROM . m_user . WHERE . group = ? ; //悪い例(1行で書いている) $sql = "SELECT id, name FROM m_user WHERE group = 開発部 "; //悪い例(SQL構文を小文字で書いている) $sql = "select " . "id, " . "name " ."from " . "m_user " ."where " . "group = 開発部 "; //悪い例(カンマを頭に持ってきている) $sql = "SELECT " . "id " . ",name " ."FROM " . "m_user " ."WHERE " . "group = 開発部 "; //悪い例(インデントしていない) $sql = "SELECT " . "id, " . "name " . "FROM " . "m_user " . "WHERE " . "group = 開発部 ";
https://w.atwiki.jp/takeyori/pages/19.html
Zend FrameWorkが推奨しているコーディング規約 PHPタグPHPタグの終了タグ(? )は省略する。省略することで終了タグ後の空白等が存在する場合のエラーなどを回避できる。 プログラム記述字下げ(インデント)半角空白 4文字で行う。タブは使用しない。 1行の長さ80文字で抑えられるようにする。最大でも120文字。 改行改行はUnit標準にあわせる。 命名規則クラスクラス名は英数字のみ使用することができる。数字の使用は推奨していない。クラス名は単語の最初の文字は大文字、それ以外は小文字で構成されていなくてはならない。クラス名がディレクトリパスを考慮したクラス名にしなくてはならない。例) クラス D \src\applcation\Test\IndexController.php であった場合クラス名はTest_IndexControllerとなる。(D \src\applcationまでがアプリケーション格納パスであるため含めない) インターフェースインターフェースを定義する場合もクラスの同様の命名規則に従い、最後に「_Interface」を付けなくてはならない。 ファイル名ファイル名は英数字、アンダースコア(_)、ハイフン(-)のみ使用できる。クラスはファイル名と対応してなくてはならない。 関数名関数名は英数字のみ使用することができる。数字は推奨していない。関数名は小文字から始まらなくてはならない。各単語の最初の文字は大文字でなくてはならない。関数名は省略しすぎず、詳細な名前をつけるようにする。グローバル関数は使用せず、できるだけ静的関数でまとめることを推奨する。例)filterInput()getElementById()widgetFactory() 変数変数名には英数字のみ使用することができる。クラス内のprivate, protected変数は最初にアンダースコア(_)を1文字入れなくてはならない。public変数はアンダースコアを含めてはならない。変数も関数名同様に単語の最初の文字は大文字でなくてはならない。 定数定数は英数字、アンダースコアを使用することができる。定数はすべて大文字でなくてはならない。可読性のため、単語の間はアンダースコアで区切らなくてはならない。クラス内の定数は const で定義することを推奨する。 コーディングスタイル文字列文字列リテラル変数が含まれていない文字列はシングルクォート( )で囲まなくてはならない。だたし、SQL等の文字列でシングルクォートを使用する場合はダブルクォートで囲んでもかまわない。 変数の展開文字列内での変数の展開を行う場合は以下の2パターンの記述方法のみとする。$greeting = "こんにちは $name さん。ようこそ!";$greeting = "こんにちは {$name} さん。ようこそ"; 文字の連結文字列を連結する場合は「.」を使用する。また、可読性の考慮して「.」の前後には空白を入れなくてはならない。文字列の連結により、コードが長い場合は複数行に分ける。この場合、以下のように「=」と「.」が同じ位置にこなくてはならない。$sql = "SELECT `id`, `name` FROM `people` " . "WHERE `name` = Susan " . "ORDER BY `name` ASC "; 配列通常配列(数字の配列)通常配列は負の数字を使用してはならない。arrayを使用して配列を宣言する場合は可読性のため、カンマ(,)の後ろに空白を入れなくてはならない。複数行またがって宣言を行う場合は開始位置が同じになるようにしなくてはならない。$sampleArray = array(1, 2, 3, Zend , Studio , $a, $b, $c, 56.44, $d, 500); 連想配列arrayで宣言をする場合は可読性をあげるために複数行宣言を推奨する。また、キーと値の位置を揃えなくてはならない。$sampleArray = array( firstKey = firstValue , secondKey = secondValue ); クラスクラス宣言クラスの括弧({)はクラス名の下に書かなくてはならない。1つのクラスファイルには1つのクラスしか定義できない。クラス内にクラス以外のコード(グローバル関数など)を追加することは推奨しない。追加する場合は2行空けて追加を行う。クラス名の上にはPHPDocを記述しなくてはならない。/** * これがドキュメントブロックです */class SampleClass{ // クラスのすべての内容は、 // 空白 4 文字の字下げを使用します。} クラスのメンバ変数メンバ変数は関数(コンストラクタを含む)が始まる前に定義しなくてはならない。var宣言は使用してはならない。private, protected, publicのいずれかを宣言する。public変数にアクセスする場合はアクセサ(get/set)によるアクセスを推奨する。 関数、メソッド関数、メソッドの宣言private, protected, publicのいずれかを宣言しなくてはならない。開始括弧は関数名の下につけなくてはならない。返り値に括弧をつけてはならない。参照渡しは関数の宣言(引数)のみ使用することができる。(通常時は使用してはならない)/** * これがドキュメントブロックです */class Foo{ /** * 正しい形式です */ public function bar( $baz) { return $this- bar; }} 関数、メソッドの呼び出し引数のカンマの後ろは1つ空白を入れなくてはならない。複数行にまたがる配列を渡す場合は以下のような記述を行う。threeArguments(array(1, 2, 3, Zend , Studio , $a, $b, $c, 56.44, $d, 500), 2, 3); 制御構造if, else if, elseif, else ifの前括弧「(」に前、後括弧「)」の後ろには空白を1つ入れなくてはならない。if、elseを使用する場合、波括弧{}を省略してはならない。else ifはelseifと宣言してはならないif ($a != 2) { $a = 2;{ } elseif ($a == 3) {{ $a = 4;{ } else {{ $a = 7;{ }} switchswitchの前括弧「(」に前、後括弧「)」の後ろには空白を1つ入れなくてはならない。defaultは省略してはならない。switch ($numPeople) { case 1 break; case 2 break; default break;} インラインドキュメント(PHPDOC)ファイルファイルの先頭に以下のブロックを作成しなくてはならない。/** * ファイルについての短い説明 * * ファイルについての長い説明 (もしあれば)... * * LICENSE ライセンスに関する情報 * * @copyright 2005 Zend Technologies * @license http //www.zend.com/license/3_0.txt PHP License 3.0 * @version CVS $Id $ * @link http //dev.zend.com/package/PackageName br() * @since File available since Release 1.2.0*/ クラスクラスの先頭に以下のブロックを作成しなくてはならない。/** * クラスについての短い説明 * * クラスについての長い説明 (もしあれば)... * * @copyright 2005 Zend Technologies * @license http //www.zend.com/license/3_0.txt PHP License 3.0 * @version Release @package_version@ * @link http //dev.zend.com/package/PackageName br() * @since Class available since Release 1.2.0 * @deprecated Class deprecated in Release 2.0.0*/ 関数 すべての関数には以下の説明を入れる。・関数については説明・引数・返り値
https://w.atwiki.jp/codings/pages/13.html
人気商品一覧 @wikiのwikiモードでは #price_list(カテゴリ名) と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。 カテゴリには以下のキーワードがご利用できます。 キーワード 表示される内容 ps3 PlayStation3 ps2 PlayStation3 psp PSP wii Wii xbox XBOX nds Nintendo DS desctop-pc デスクトップパソコン note-pc ノートパソコン mp3player デジタルオーディオプレイヤー kaden 家電 aircon エアコン camera カメラ game-toy ゲーム・おもちゃ全般 all 指定無し 空白の場合はランダムな商品が表示されます。 ※このプラグインは価格比較サイト@PRICEのデータを利用しています。 たとえば、 #price_list(game-toy) と入力すると以下のように表示されます。 ゲーム・おもちゃ全般の売れ筋商品 #price_list ノートパソコンの売れ筋商品 #price_list 人気商品リスト #price_list
https://w.atwiki.jp/codings/pages/14.html
インスタグラムプラグイン 人気の画像共有サービス、Instagram(インスタグラム)の画像をアットウィキに貼れるプラグインです。 #ig_user(ユーザー名) と記載することで、特定ユーザーのInstagramのフィードを表示することができます。 例)@dogoftheday #ig_user #ig_tags(タグ名) と記載することで、特定タグのInstagramのフィードを表示することができます。 #dogofthedayjp タグ #ig_tag #ig_popular と記載することで、Instagramのpopularフィードを表示することができます。 詳しい使い方は以下のページを参考にしてください! =>http //www1.atwiki.jp/guide/pages/935.html
https://w.atwiki.jp/sm4wiki/pages/18.html
ここは? ボススプライトを書くような高度なASMになると詰まっても助けてくれる人がいない…orz そこで、みんなで知識を持ち寄ってより高度でよりスタイリッシュなASMを作くったり、高度なASMの解析をしましょう! というページです。 目次 ここは? [#a88bf435] 目次 [#r7e0d310] 分岐ジャンプ命令とアドレスジャンプ命令の複数使用による偽類絶対アドレスモード分岐ジャンプ命令を行っている方へ [#cd717d41] JSR命令の仕様 [#sbbf5a3c] JSRについて知っておくべきこと [#rb15ae6c] GET DRAW INFO内のINVALIDについて [#u14912ff] JSLでGET_DRAW_INFOに飛ばす [#ka901d0c] Graphics Routine [#medbed90] はじめに [#v9ae12be] 1タイルのグラフィック [#be9097bd] 1タイルのグラフィック - 発展 [#t9689fe7] 条件によって異なるグラフィックを描く[#a61b3a59] 8x8サイズのタイルを描く [#b4dfd82a] 2タイル分のグラフィック [#fc953604] 2タイル描写 -アニメーションetc [#aa48ab7a] その他 [#oaa39067] マリオの座標上にグラフィックを描く [#j6cfa346] おまけ [#m1dc7e51] おこめ [#f614f587] 分岐ジャンプ命令とアドレスジャンプ命令の複数使用による偽類絶対アドレスモード分岐ジャンプ命令を行っている方へ ↓みたくJSRやJMPを複数のBEQなどで#??の値を1づつ増やしたりして分岐している方のための解説です。 ;code1 LDA MOTION,x BNE NOT_MOTION_0 JMP MOTION_0 NOT_MOTION_0 CMP #$01 BNE NOT_MOTION_1 JMP MOTION_1 NOT_MOTION_1 CMP #$02 BNE NOT_MOTION_2 JMP MOTION_2 : : : MOTION_0---code--- MOTION_1---code--- MOTION_2---code--- : : : ↑はこの項目を書いた私が昔に書いたコードです。汚いです、はぃ… ↑のコードは忘れて↓のサンプルコードを覚えてもらいたいです。 *下記のコードの成立条件:DBがPBと同一されてること ;code2 MOTION_POS_TXTdcw MOTION_0 $FFFF,MOTION_1 $FFFF,MOTION_2 $FFFF,... ;↑dcwより値は16bit、MOTION_?のアドレスの下位16bitが直書きされる MOTION_ROTINE LDA MOTION,x;A=0の時MOTION_0にジャンプ、A=1の時MOTION_1... ASL;ここから TAY REP #$20 LDA MOTION_POS_TXT,y STA $00 SEP #$20 JMP ($0000);ここまでで14bytes分 MOTION_0---code--- MOTION_1---code--- MOTION_2---code--- MOTION_?の?を0以外の任意の数とすると分岐コードだけの総byte数は、~ code1では分岐コード分だけで?×7+1、code2は?×2+16 結論:分岐が2以下だとcode2方がcode1より容量を食います。(´;ω;`)ウッ… なので使い分けてください。 JSR命令の仕様 GET_DRAW_INFOを逆汗中に詰まってたコードがやっと理解できたので載せておきます。 JSRについて知っておくべきこと 例えば org $012345;loromとかは省略しています。 JSR ROTINE org $013456 ROTINE というコードを挿入したとします。 この場合はJSRは$20,ROTINEの下位2bytesの3bytesで構成されます つまりこの場合JSR ROTINEは$20,$56,$34にアセンブルされます。 そして、JSRはPH命令を使う命令です。なので例えば org $012345 JSR ROTINE PLA RTS ROTINEPHA RTS こんなコードを入れるとフリーズします。 そのPHされる数はJSRの命令の最後尾のアドレス(例では$012347)の下位2bytes(例では$2347)がPHされます。そしてそれをRTSの命令によって2bytes分PLされてアドレス$012348目に戻ってくるわけです。(JSL、RTLの場合は3bytes分のPH,PLが実行されるだけ) GET DRAW INFO内のINVALIDについて 〇の数字順通りに命令が実行されます。 ;この時スタックには何も入っていないとする ;ここをアドレス$012345と置く JSR CODE;?JSRによって$2347がPHされる(stack=$47,$23) RTS;?ここに戻ってくる ;ここをアドレス$013456と置く CODEJSR INVALID;?JSRによって$3458がPHされる(stack=$47,$23,$58,$34) RTS;実質ここには来ません INVALIDPLA;?1byteがPLされる(stack=$47,$23,$58) PLA;?1byteがPLされる(stack=$47,$23) RTS;?stackの中にある2byteを読み込んで飛ぶ こんな感じです。なのでxkasなどでGET_DRAW_INFOをRTS→RTLだけして入れてJSLで読み込もうとすると画面外に出た瞬間にフリーズします。注意してください。 JSLでGET_DRAW_INFOに飛ばす どうしてもJSLで飛ばしたいお、と言う人のために一応載っけておきます。 「TABLE1」〜「BNE INVALID」は変わらず PHB PHK PLB 「LDY #$00」〜「BPL ON_SCREEN_LOOP」は変わ(ry PLB 「LDY $15EA,x」〜「STA $01」は(ry RTL INVALIDREP #$20 PLA PLY PLA PHY PHA SEP #$20 RTL ちなみに、JSLでGET_DRAW_INFOに飛ばす前にJSRでGFX_ROTINEに飛ばす的なコードなのが前提なコードです。 Graphics Routine はじめに カスタムスプライト(コマンド除く)での共通事項、それはグラフィックです。 カスタムスプライトを作る上でかなりの人が躓くであろうグラフィックの描写を攻略していきます。 では早速解説からいきましょう! グラフィックの描写 = スプライトの絵が描かれたタイルの設置です。 つまりグラフィックを描写するには、 タイルの位置、タイルの番号、タイルの情報(パレットなど)、タイルのサイズを決めてあげるのです。 スプライトにはそれぞれインデクス番号という番号が割り振られています。 65c816資料を見ると分かるようにスプライト関連のアドレスは他のRAMアドレスと違い長さ(12bytes)があります。 スプライトの向きや座標、速度のアドレスが被ると誤動作を起こすので被らないようにしてあるのです。 インデックス番号はXレジスタにスプライトルーチン開始時に代入されます。 つまり実際のスプライト用アドレスにインデクス番号を足したアドレスがそのスプライトのアドレスとなるのです。 ややこしや カスタムスプライトのグラフィックは$300~ 1つのタイルにつき4つ分のRAMを使います。 RAMアドレス 説明 $0300,y タイルの画面上でのX座標 $0301,y タイルの画面上でのY座標 $0302,y タイルのタイル番号下位バイト $0303,y タイルの属性 GET_DRAW_INFOによりOAMインデックスがYレジスタに格納されるので、$300,yのようにそれぞれのアドレスの後ろに,yをつけてあげます。 また、2タイル目以降も同様に $0304 タイル2の画面上でのX座標 $0305 タイル2の画面上でのY座標 $0306 タイル2のタイル番号下位バイト $0307 タイル2の属性 となっています。 GET_DRAW_INFOについては詳しく触れません、がGET_DRAW_INFOを呼び出すと、 $00に画面枠と比較したスプライトのX位置 つまりスプライトの画面上のX座標 $01に画面枠と比較したスプライトのY位置 つまりスプライトの画面上のY座標 がストアされます。この程度の認識でいいでしょう。 それではasmを編集していきましょう。 まず、適当なところでグラフィックルーチンを呼び出します。 普通はメインスプライトルーチンの最初に記述します。名前はなんでもいいですが、ここではSUB_GFXとします。 JSR SUB_GFX ;---------------------------------- ; GET_DRAW_INFOを呼び出します。当然同asm内にGET_DRAW_INFOの内容を記述してください。 ; GET_DRAW_INFOの内容はsprite tool(v135)のtutorialsフォルダ内のlibrary.asmにあるので ; そこからそっくりそのままコピペしましょう。そしてJSRで呼び出します。 SUB_GFX JSR GET_DRAW_INFO ;----------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; GET_DRAW_INFO ; This is a helper for the graphics routine. It sets off screen flags, and sets up ; variables. It will return with the following ; ;Y = index to sprite OAM ($300) ;$00 = sprite x position relative to screen boarder ;$01 = sprite y position relative to screen boarder ; ; It is adapted from the subroutine at $03B760 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TABLE1dcb $0C,$1C TABLE2dcb $01,$02 GET_DRAW_INFO STZ $186C,x; reset sprite offscreen flag, vertical STZ $15A0,x; reset sprite offscreen flag, horizontal LDA $E4,x; \ CMP $1A; | set horizontal offscr een if necessary LDA $14E0,x; | SBC $1B; | BEQ ON_SCREEN_X; | INC $15A0,x; / ON_SCREEN_X LDA $14E0,x; \ XBA; | LDA $E4,x; | REP #$20; | SEC; | SBC $1A; | mark sprite invalid if far enough off screen CLC; | ADC.W #$0040; | CMP.W #$0180; | SEP #$20; | ROL A; | AND #$01; | STA $15C4,x; / BNE INVALID; LDY #$00; \ set up loop LDA $1662,x; | AND #$20; | if not smushed (1662 0x20), go through loop twice BEQ ON_SCREEN_LOOP; | else, go through loop once INY; / ON_SCREEN_LOOP LDA $D8,x ; \ CLC; | set vertical offscreen if necessary ADC TABLE1,y; | PHP; | CMP $1C; | (vert screen boundry) ROL $00; | PLP; | LDA $14D4,x; | ADC #$00; | LSR $00; | SBC $1D; | BEQ ON_SCREEN_Y; | LDA $186C,x; | (vert offscreen) ORA TABLE2,y; | STA $186C,x; | ON_SCREEN_Y DEY; | BPL ON_SCREEN_LOOP; / LDY $15EA,x; get offset to sprite OAM LDA $E4,x; \ SEC; | SBC $1A; | $00 = sprite x position relative to screen boarder STA $00; / LDA $D8,x; \ SEC; | SBC $1C; | $01 = sprite y position relative to screen boarder STA $01; / RTS; return INVALID PLA; \ return from *main gfx routine* subroutine... PLA; | ...(not just this subroutine) RTS; / 今後GET_DRAW_INFOの記述はソースが冗長になるので省略させていただきますが、記述があると仮定して話を進めていきます。 ここからグラフィックの大きさや向きなどによって内容が分岐していきます。よって話の導入はここまで。 余談ですがlibrary.asmはGET_DRAW_INFOの他にも役に立つ処理やアドレスが載っているので目を通しておくといいかもしれません。 1タイルのグラフィック まずはX,Y座標の指定です。スプライトの画面上の座標 = タイルの画面上での座標とすればいいですね。 GET_DRAW_INFOを呼び出しその結果を用います。 $00がスプライトの画面上のX座標で$01がスプライトの画面上のY座標でしたね。 SUB_GFX JSR GET_DRAW_INFO LDA $00; \ 画面上のX座標 STA $0300,y; / LDA $01; \ 画面上のY座標 STA $0301,y; / こうなりますね。次にタイル番号の前に属性を指定します。 スプライトにはYXPPCCCTフォーマットという独自の形式があります。 これらの英文字の位置は2進数のbit位置と同じです。bit0がTでbit7がYになりますね。 Y 1で上下反転 X 1で左右反転 PP タイルの優先度...10で手前に表示され、11で透過します CCC パレット...SMWにおいて000がPalette 8…111がPalette Fです T 1でSP3,4のタイルを使います。0だとSP1,2になります これと$303,yに入るフォーマットとは一致しています。 これをそのままストア、つまり LDA #%???????? STA $0303,y とすればよいのですが、タイルが多くなると大変面倒になります。 タイル属性を設定するにあたって以下のRAMも覚えましょう。 ・$15F6,x スプライトのパレットです。Palette 8を使う場合$00が,9の場合$02が…Fの場合$0Eです。 またタイル番号上位バイト(つまりSP1,2/SP3,4のどちらか)でもあります。 SP3,4のページのタイル番号を使う場合、上の値に+$01しましょう。その数値が$15F6,xに入ります。 スプライトに関するRAMなので,xをつけてあげましょう。 ・$64 そのLevelのLevel ModeのSprite Layerの値が入ります。 入る値はLunar Magicでを押すと出る、マップのモードのSprite Layerの値です。 [パレットA,Sprite Layer 20,SP3,4のページを使用する]とした時の例です。 ; まずパレットの値を読み込みからです。 LDA $15F6,x ; ↑パレットA...$04 / SP3,4を使うので+$01 = $05 よって2進数で #%00000101 ORA $64 ; ↑Sprite Layer 20...$20なので2進数で #%00100000 ; ORAは論理和...2進数で足し算をすればいいです。 ; つまり#%00000101 + #%00100000 = #%00100101となりますね。 ; そしてこれを代入します。 STA $0303,y パレットやらSP3,4ページを使うといった設定はどこでするのでしょうか? 簡単な方法だとcfg_editorで設定します。どこかに日本語化を置いてあるので分かりやすいかと。 もちろんYXPPCCCTフォーマットを詳しく指定することでも設定できますが、 $15F6,xと$64を上のように使えば勝手にやってくれるので面倒な計算がいりません。 次にタイルのタイル番号の指定です。とにかく先に番号を決めてしまいましょう。~ LDA #$80 STA $0302,y Lunar Magicの (8x8エディタ)Tile 0x200からがスプライトのタイルです。 SP3,4のページを使う場合 Tile 0x300~のページを参照し、使わない場合は0x200~を参照します。 したがってSP3,4のページを使わずLDA #$70の場合Tile 0x270となり、SP3,4のページを使いLDA #$80の場合Tile 0x380となりますね。 それからそのタイルが8x8か16x16であるかを決めます。 $460,xが第1タイル、$461,xが第2タイル…と大きさを決めれます。値は$00が8x8で$02が16x16となります。 が、これはタイル毎に大きさを決める場合に使えばいいので今回はスルーします。 これを設定しない場合 Yレジスタに値を入れることですべての大きさが決まります。~ LDY #$00で8x8,LDY #$02で16x16と統一されます。指定した場合は$FFを入れましょう。 続いてA(アキュームレータ)に[設置するタイル数 - 1]の値を入れます。ここでの解説は1タイルのグラフィックなので[1 - 1 = 0]よりLDA #$00とします。 その後、画面外で描写しないルーチン(SNES $01 B7B3)にJSLで飛ばして終了です。 LDY #$02; タイルサイズを16x16で統一 LDA #$00; タイル数(1) - 1 = 0 JSL $01B7B3; 画面外で描写しない RTS; 終了 ↓ 最後に、今回できたグラフィックルーチンです。 SUB_GFX JSR GET_DRAW_INFO LDA $00; \ 画面上X座標 STA $0300,y; / LDA $01; \ 画面上Y座標 STA $0301,y; / LDA $15F6,x; \ ORA $64; | タイル属性 STA $0303,y; / LDA #$80; \ タイル番号 0x?80 STA $0302,y; / LDY #$02; タイルサイズを16x16で統一 LDA #$00; タイル数(1) - 1 = 0 JSL $01B7B3; 画面外で描写しない RTS; 終了 1タイルのグラフィック - 発展 ここまでで、1タイルのグラフィックの基本は学びました。知識を発展させましょう。 スプライトの向きを指定する 上で学んだグラフィックはあくまで必要な情報だけを取り入れたものなので、常に同じ方向しか向いていません。 一定方向に進むスプライトにしか使えませんね(´・ω・`)そこで$0303,yのタイル属性を弄ります。 $157C,x これはスプライトの向きを表すRAMです。($00-右向き,$01-左向き) スプライトに関するRAMなので,xがついてます。 $00〜$0F あらゆる場面において計算に使われているRAMです。だからと言って空きRAMというわけではないのでご注意を ここからはグラフィックの記述において必要以外の部分は省略します。;----省略内容---という風に省略されます。 (ほぼ文字説明と言えど量が多いとページ表示が遅くなりますし) SUB_GFX JSR GET_DRAW_INFO LDA $157C,x; まずこのスプライトの向きを STA $02; $02というRAMに代入します。 ; これで$02は、スプライトが右向きなら$00,左なら$01が入ることになります。 ;--------座標指定略--------- LDA $15F6,x PHX; まずこのカスタムスプライトのインデクス番号を保管しておきます。 LDX $02; 続いてこのスプライトの向きを呼び出します。 BNE NO_FLIP; $00(右向き)でないなら[NO_FLIP]に移動させます。 ORA #$40; 左向きの場合 タイルを左右反転させます。 NO_FLIP ORA $64; 右向きなら左右反転をせずにそのまま$0303,yに代入します。 STA $0303,y PLX; スプライトのインデクス番号を戻してあげます。 ;--------以下略--------- なぜ#$40(= #%01000000)を加えるのか... それはYXPPCCCTフォーマットに当てはめるとXが1になり、左右反転するからですね。 左向き時はORA #$40によりタイルは左右反転、右向き時はこれを飛ばすので反転無しとなりますね。 こんな感じです。もちろん他の場所でマリオの方を向かせるように設定しないと効果がありません。(墓場のカスタムスプライトのうんちく参照) LDXなどとXレジスタを使う命令を用いる場合、このようにPHXとPLXを使ってインデクス番号を保管します。 でないとインデックス番号が変わってしまい誤動作を起こすからです。 アニメーションさせる $14 フレームカウンタです。常に1フレームに$01増加していますがマリオのダメージ中などは停止します。 ちなみに止まらないのは$13です。RAMアドレスについてはCにあるRAM Mapを見ましょう。 $14は常に$00~$FFまで増加し、また$00に戻ります。$FFの時に1/2(LSR)にするとどうなるでしょうか? $FF * 1/2 = $7Fですね。さらに1/2倍で$3F、3回目{1/8(LSR *3)}で$1Fになりますね。 LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して STA $03; $03に代入 これで$03は$00~$1Fに増加し、$1Fになったあと$00に戻ることになります。 この$03をAND #$03してみましょう。ANDは論理積です。 $03の中身が$1Fだとすると $1F- #%00011111 AND #$03 - *#%00000011 ---------------------------- =#%00000011 となり答えは#$03になります。同様に計算していくと、中身が$1Eなら答えは#$02,$1Dなら#$01,$1Cなら#$00,$1Bなら#$03... もうお分かりのはずです、この場合$03は$00~$03まで増加し$00へ戻るものとなります。 LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して AND #$03; さらに#%00000011で論理積を出し STA $03; $03に代入 こうすればOKです。これで$00~$03まで増加し、また$00へ戻るという4種類のタイル番号専用カウンタができました。 2種類にしたい場合はどうでしょうか?AND #$01とすれば$00~$01まで増加し$00へ戻るので、 2種類のタイル番号専用カウンタが出来上がりです。 また、アニメーションの速度を変えるにはLSRを増やすことでさらに遅くなり、ASL(*2倍)を加えると速くなります。 次にタイルの指定方法です。 TILEMAPdcb $80,$82,$84,$86 ; まずタイルのテーブルを組みます。SUB_GFXの上に置けばいいでしょう。 ; この場合$80→$82→$84→$86→$80→$82...と変わっていきます。 ; 2種類の場合はdcb $80,$82とすれば$80→$82→$80→$82...となります。 ; その場合は上のAND #$03を#$01に、TILEMAPを dcb $80,$82としましょう。 ; --------------------- LDX $03; 上で設定したようにXは$00→$01→$02→$03→$00...と変わっていきます。 LDA TILEMAP,x; したがってXが$00のときTILEMAPは$80,$01のとき$82...となります。 STA $0302,y; それを代入すればOKです。 これまでの物を組み合わせましょう。 TILEMAPdcb $80,$82,$84,$86 SUB_GFX JSR GET_DRAW_INFO LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して AND #$03; さらに#%00000011で論理積を出し STA $03; $03に代入 ;--------座標,属性指定略--------- PHX; LDXを使うのでスプライトインデックス番号を格納しておく LDX $03; 上で設定したようにXは$00→$01→$02→$03→$00...と変わっていきます LDA TILEMAP,x; したがってXが$00のときTILEMAPは$80,$01のとき$82...となります STA $0302,y; それを代入すればOKです PLX; Xを使い終わったのでインデックス番号を戻してあげます ;--------以下略--------- こうなります。これが1タイルで4種類にアニメーションするタイルのグラフィックとなります。 条件によって異なるグラフィックを描く 条件は何でも好きに決めましょう。 たとえばON/OFF or Pスイッチ、座標を調べたりあるいは空きRAMだったり…今回はON/OFFスイッチにしましょう。 TILEMAPdcb $80,$82 ;↑ ON時,OFF時 グラフィック ;----GET_DRAW_INFOの記述--- LDA $14AF; \ ON/OFFスイッチの現在の値を STA $03; / $03に代入 ;----座標指定---- LDX $03 LDA TILEMAP,x STA $0302,y ;--------以下略--------- $14AFはご存じ、ON/OFFスイッチのRAMです。ON $00 / OFF $01がAに入ります。 したがってONの時にはTILEMAPを$00右にずらす(=ずれない)ので$80、OFF時はTILEMAPを$01右にずらすので$82となるのです。 次にフレームと組み合わせます。これが一番厄介です。 1タイル分のグラフィックは簡単ですが、タイル数が大きいとTILEMAPも多くなり指定がかなり面倒になります。 「ON時 $80,$82のアニメーション有り、OFF時 $A0のアニメ無し」というグラフィックの記述です。 TILEMAPdcb $80,$82,$A0 ;↑ ON /OFF ;----GET_DRAW_INFOの記述--- LDA $14; \ LSR A; | 1フレーム毎に$00,$01,$00…となり LSR A; | $03に代入されます。 LSR A; | 詳しくは前章『アニメーションさせる』を参照してください。 AND #$01; | STA $03; / LDA $14AF; \ ON(A=0)の場合は BEQ NEXT; | ラベル NEXTに飛び LDA #$02; | OFF(A=1)の場合は、#$02を STA $03; / $03に代入 NEXT ;----座標指定---- LDX $03 LDA TILEMAP,x STA $0302,y ;--------以下略--------- まずLDA $14~STA $03でアニメーションをさせているのがわかります。 $03に$00,$01.$00…と入るので、TILEMAPは右に[$00ずれる,$01ずれる,$00ずれる…] 即ち、TILEMAPは[$80,$82,$80…]となりますね。 次にOFFの場合は$03を$02で固定させます。これにより右に[$02ずれるで固定]される… つまりTILEMAPは [$A0で固定]されるのです。ONの場合はそれを飛ばしています。 この場合LDA $14AF〜の記述は必ず後に持ってきます。でないとアニメーションが変になります。 これでアニメーション/固定はできました。 つぎにアニメーション/アニメーションをやってみましょう。 TILEMAPdcb $80,$82,$A0,$A2 ;↑ ON / OFF ;----GET_DRAW_INFOの記述--- LDA $14AF; \ OFF(≠$00)なら BNE NEXT; / ラベル NEXTへ LDA $14; \ LSR A; | 1フレームごとのアニメーション LSR A; | $03は[$00,$01,$00…]と毎フレーム変動する LSR A; | AND #$01; | STA $03; / BRA NEXT2; 次のNEXTの部分は必要ないので飛ばす NEXT LDA $14; \ LSR A; | 1フレームごとのアニメーション LSR A; | LSR A; | AND #$01; | CLC; | ADC #$02; | に +02をする。 STA $03; / これで$03は[$02,$03,$02…]と毎フレーム変動する NEXT2 ;----座標指定---- LDX $03 LDA TILEMAP,x STA $0302,y ;--------以下略--------- これはTILEMAPの指定位置をずらす方法です。 ON時はTILEMAPが右に[$00,$01,$00…]分ずれるので、TILEMAPは[$80,$82,$80…]となり、 OFF時は右に[$02,$03,$02…]分ずれるので、TILEMAPは[$A0,$A2,$A0…]となります。 今回は1フレーム毎のアニメーションだってので+02をしましたが、フレーム数によって変わるので注意してください。 別解があります。状況に応じてどちらを使うか決めましょう。 TILEMAPdcb $80,$82; ON時のアニメーション TILEMAP2dcb $A0,$A2; OFF時のアニメーション ;----GET_DRAW_INFOの記述--- LDA $14; \ LSR A; | 1フレームごとのアニメーション LSR A; | $03は[$00,$01,$00…]と毎フレーム変動する LSR A; | AND #$01; | STA $03; / ;----座標指定---- LDX $03 LDA $14AF; \ OFF(≠$00)なら BNE NEXT; / ラベル NEXTへ LDA TILEMAP,x; ONだったのでTILEMAPを読み込む BRA NEXT2 NEXT LDA TILEMAP2,x; ONだったのでTILEMAP2を読み込む NEXT2 STA $0302,y ;--------以下略--------- こちらは二つのTILEMAPを用いる方法です。 ON/OFFの状況に応じてどちらのTILEMAPを読み込むか決めているのが分かりますね。こっちの方が分かりやすいと思いますが、タイル数が多いと変わってくるでしょう。 8x8サイズのタイルを描く 最初の方で説明しましたが$460,xが第1タイルの大きさ、$461,xが第2タイル…と個別に大きさを決めることが可能です。値は$00が8x8で$02が16x16となります。 4フレームのアニメーションをするタイル描写をしてみましょう。 TILEMAP dcb $2C,$2D,$2C,$2D PROPERTIES dcb %00000100,%00000100,%11000100,%11000100; XYPPCCCTフォーマット ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB_GFX JSR GET_DRAW_INFO; Yレジスタ = OAM offset LDA $14; フレームカウンタを LSR A; 1/2倍 LSR A; 計1/4倍 LSR A; 計1/8倍して AND #$03; さらに#%00000011で論理積を出し STA $03; $03に代入 LDA $00; \ 画面上X座標 STA $0300,y; / LDA $01; \ 画面上Y座標 STA $0301,y; / PHX; Xを使うのでスプライトインデックス番号を格納しておく LDX $03; \ LDA PROPERTIES,x; | タイル属性 ORA $64; | STA $0303,y; / PLX; Xを使い終わったのでインデックス番号を戻してあげます PHX; Xを使うのでスプライトインデックス番号を格納しておく LDX $03; \ LDA TILEMAP,x; | タイル番号を代入 STA $0302,y; / PLX; Xを使い終わったのでインデックス番号を戻してあげます LDA #$00; \ タイルの大きさを8x8に STA $0460,x; / LDY #$FF; タイルサイズを個別に指定 LDA #$00; タイル数(1) - 1 = 0 JSL $01B7B3; 画面外で描写しない RTS; 終了 始めに気付くのはPROPERTIESです。$15F6だと一括指定しかできません。そこでこのようにタイル毎に決めて上げるのです。 PROPERTIESはXYPPCCCTフォーマットの書式で決めます。分かり易いように2進数表記なので%aaaaaaaaとなっていますが、2進数や16進数がバッチリな方は16進数表記($aa)に直すと見やすくなるでしょう。 またこれで指定するのはフォーマットのX,Y,CCC,Tの部分のみで大丈夫です。ORA $64がPPの判断をしてくれるからです。 一通りタイルの指定が終わった後、$0460,xに00を入れ、『このタイルは8x8サイズだ』という宣言をします。 タイルの大きさを個別に宣言した場合は最後にYレジスタに$FFを入れればいいんでしたよね。 これで8x8サイズのタイル描写の完成です。 2タイル分のグラフィック 縦に2タイル並べたり、横に並べたりいろいろありますがとりあえず縦の描写をやってみましょう。 まず知っておきたいことはループです。ループについてはこちらを見ることで説明の代わりとさせていただきます。 次に概念的なお話です。 2タイルの描写をするので描かれるタイルは2枚、当然タイル毎に位置を決めてあげないと描写する位置が被ってしまいます。 そこでタイルの描写位置をずらします。 何も指定しない(位置をずらさない)場合の位置を(つまり基準)$00とすると、 X座標において10加えると1タイル分右にずれ、F0加えると1タイル分左にずれます。 Y座標において10加えると1タイル分下にずれ、F0加えると1タイル分上にずれます。 16進数では、1~7Fが正、80~FFが負となります。これは2進数に直した場合bit7が0か1かによるものです。 また正の場合横(X)移動では右に、縦(Y)移動には下に移動します。負の場合は横移動では左に、縦(Y)移動には上に移動します。 このことから上2つの説明が成り立ちますね。また1タイルの半分ずらすには正方向には08、負方向にはF8ずらせばいいです。 10は10進数で16なので半分の08となるからですね。 詳しくはこれを見るといいでしょう。(鬼畜王氏の講座にほぼ同じものがあるケド) #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (pos.png) これを見る限り、縦に2タイル分を作る場合は (X 00/Y F0)+(X 00/Y 00) もしくは (X 00/Y 00)+(X 00/Y 10) とずらして描けばいいみたいですね。 しかし後者(Y 00-Y 10)の場合を考えてみましょう。(X 00/Y 00)が基準と説明しました。 なので地面と接するスプライト(例えばノコノコ)は基準の位置が地面に接します。 したがって、Y 10だと下に1タイル分ずれるので下半分のタイルが地面に埋まってしまうのです。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (nokonoko.png) なので (X 00/Y F0)+(X 00/Y 00) の方を用いましょう。まずは、必要なものを決めちゃいます。 TILEMAP dcb $82,$A2; 上のタイル番号,下のタイル番号 Y_OFFSET dcb $F0,$00; 同上 続いてループ処理の設定です。 PHX; ループにXレジスタを使用するので、インデクス番号を保護する LDX #$01; ループ回数 = タイル数(2) - 1 = 1 LOOP_START ; ここからループさせたい処理 DEX; \ ループの処理でこの記述は必須ですよね BPL LOOP_START; / PLX; ループが終了したのでインデクス番号を戻してあげる 65C816プログラミングのループについてををみるとこのように指定していますね。この中にタイル描写をする処理を入れて繰り返させるのです。 ではソースを見てみましょう。 TILEMAP dcb $82,$A2 Y_OFFSET dcb $F0,$00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB_GFX JSR GET_DRAW_INFO; Yレジスタ = OAM offset PHX; ループにXレジスタを使用するので、保護する LDX #$01; ループ回数 = タイル数(2) - 1 = 1 LOOP_START LDA $00; \ X座標はこれまで通り STA $0300,y; / LDA Y_OFFSET,x; \ CLC; | タイル位置(基準=00)にF0と00を足すと ADC $01; | タイル位置はF0と00になりますね STA $0301,y; / LDA TILEMAP,x; \ タイルマップを代入 STA $0302,y; / PHX; Xレジスタを使用するのでインデクス番号を保管 LDX $15E9; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります LDA $15F6,x; \ ORA $64; | タイル属性 STA $0303,y; / PLX; Xレジスタを使い終わったのでインデクス番号をもどす INY; \ INY; | INY; | INY; / DEX; \ ループの処理でこの記述は必須ですよね BPL LOOP_START; / PLX; ループが終了したのでインデクス番号を戻してあげる LDY #$02; タイルサイズを16x16で統一 LDA #$01; タイル数(2) - 1 = 1 JSL $01B7B3; 画面外で描写しない RTS; 終了 これまでの説明が分かる人なら、座標とタイル番号、タイル属性をどう指定しているか大体分かるハズです。 しかし1つ気にかかる点があることでしょう。なぜINYを4つも入れているのでしょうか? 講座の最初の方にタイルに関するRAMの説明をしましたね。$0300,$0301,$0302,$0303のことです。例えば1タイル目のX座標は$0300で2タイル目のX座標は$0304です。察しのいい人は気付いたかも知れません。 $0300に4を足すと$0304になります。もともと$0300,yとなっているのでYに4を足せば$0304になるのが分かるでしょう。 つまり最初のループで1タイル目に関して一通りの設定(座標、属性etc...)が終わった後にYを増加させます。 すると$030Xは+4されて『2タイル目の設定ができますよー』という状態になります。そこでループ処理(BPL LOOP_START)でタイル指定の最初に戻すのです。 そうすれば2タイル目の設定をやってくれるのです。ちょっと日本語がおかしいですが大体の流れはつかめたはずです。 横へ2タイルは座標指定の部分をこうすればいいですね。 LDA Y_OFFSET,x CLC ADC $00 STA $0300,y LDA $01 STA $0301,y この説明では必要な情報のみでアニメーションもなく向きも変わらないものなので、それらの機能をつけて上げましょう。 2タイル描写 -アニメーションetc やりたいことの説明は既に済んでます。これを読み直すといいでしょう。2タイルになってもほとんど変わりません。 ということで早速ソースを見てみましょう。 TILEMAP dcb $82,$A2; 1フレーム目のタイル dcb $82,$A0; 2フレーム目のタイル Y_OFFSET dcb $F0,$00; 上のタイル.下のタイル ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB_GFX JSR GET_DRAW_INFO; Yレジスタ = OAM offset LDA $157C,x; \ スプライトの向きを$02に代入 STA $02; / LDA $14; \ フレームカウンタを LSR A; | (1/2) LSR A; | (1/4) LSR A; | 計1/8倍 AND #$01; | これで $00 → $01 → $00 → $01 となるカウンタになる ASL A; | 2倍すると $00 → $02 → $00 → $02 となるカウンタになる STA $03; / これを$03に代入 PHX; ループにXレジスタを使用するので、保護する LDX #$01; ループ回数 = タイル数(2) - 1 = 1 LOOP_START LDA $00; \ X座標はこれまで通り STA $0300,y; / LDA Y_OFFSET,x; \ CLC; | タイル位置(基準=00)にF0と00を足すと ADC $01; | タイル位置はF0と00になりますね STA $0301,y; / PHX TXA; X → A(つまりインデクス番号をAに持ってくる) CLC; \ Aにカウンタの分を足してあげます ADC $03; / TAX; A → X(足した値を戻す) LDA TILEMAP,x; \ タイルマップを代入 STA $0302,y; / PLX PHX LDX $15E9; スプライトのインデクス番号に関するRAM これがないとパレットなどがおかしくなります LDA $15F6,x; パレット LDX $02; \ このスプライトの向きを呼び出します BNE NO_FLIP; | = 0(右向き)でないなら[NO_FLIP]に移動させます ORA #$40; | 左向きの場合、タイルを左右反転させます NO_FLIP ORA $64; | 右向きなら左右反転をせずにそのまま$0303,yに代入します STA $0303,y; / タイル属性を代入 PLX INY; \ INY; | ループ毎にタイルのRAMのアドレスを増やす INY; | INY; / DEX; \ ループの処理でこの記述は必須ですよね BPL LOOP_START; / PLX; ループが終了したのでインデクス番号を戻してあげる LDY #$02; タイルサイズを16x16で統一 LDA #$01; タイル数(2) - 1 = 1 JSL $01B7B3; 画面外で描写しない RTS; 終了 スプライトをどうアニメーションさせるかは、どのようにカウンタ(今回は$03)をつくるかと同じです。 ソース内の記述にあるように$03は$00 → $02 → $00 → $02…と変化します。 つまりTILEMAPは$00分右にずれる → $02分右にずれる → $00分右にずれる → $02分右にずれる… よって$82,$A2 → $82,$A0 → $82,$A2 → $82,$A0…となるのです。 あとはほとんど変わりないはずです。これで2タイル分のグラフィックは終了です。 書いた人は疲れてしまいました。続きを見たい方はワッフルワッフル その他 マリオの座標上にグラフィックを描く スプライトの座標 = マリオの座標として、マリオを隠せばいいだけです。 したがって、 LDA #$7F; \ マリオを透明化 STA $78; / ;------ LDA $94; \ スプライトX座標 low = マリオX座標 low STA $E4,x; / LDA $96; \ スプライトY座標 low = マリオY座標 low STA $D8,x; / LDA $95; \ スプライトX座標 high = マリオX座標 high STA $14E0,x; / LDA $97; \ スプライトY座標 high = マリオY座標 high STA $14D4,x; / これをメインルーチンに記述すればいいのです。 しかしこの場合、マリオがチビの時はマリオの頭上(スーパーマリオの顔の位置)にスプライトが来てしまいます。 なのでマリオのY座標(low)を修正しましょう。LDA $96/STA $D8,xを以下に変えてください。 LDA $96; \ スプライトY座標 low = マリオY座標 low + $10 CLC; | $10で1タイル分です ADC #$10; | STA $D8,x; / おまけ #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (graphics.zip) これまでの講座で学んできたグラフィックルーチンの参考例です。 スプライト製作に少しでも役立てられたら幸いです。 ASL/LSRのご指摘ありがとうございました。 間違っているところがあったら勝手に直すか、コメントお願いします。 おこめ