<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>超RSSニュースリーダー</title>
<style>
body {
font-family: "Segoe UI", sans-serif;
background: #f4f4f4;
margin: 0;
padding: 20px;
}
h1 {
text-align: center;
color: #222;
}
#search {
display: block;
margin: 10px auto;
padding: 10px;
width: 80%;
font-size: 16px;
border-radius: 8px;
border: 1px solid #ccc;
}
#feeds {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 20px;
}
.feed-card {
background: white;
border-radius: 12px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
width: 320px;
padding: 12px;
box-sizing: border-box;
}
.feed-card img {
width: 100%;
height: auto;
border-radius: 8px;
margin-bottom: 10px;
}
.feed-card h2 {
font-size: 16px;
margin: 0 0 5px;
}
.feed-card p {
font-size: 14px;
color: #555;
}
.feed-card time {
display: block;
font-size: 12px;
color: #999;
margin-top: 5px;
}
</style>
</head>
<body>
<h1>超RSSニュースリーダー</h1>
<input type="text" id="search" placeholder="記事を検索...">
<div id="feeds"></div>
<script>
const rssUrls = [
"https://news.yahoo.co.jp/rss/topics/top-picks.xml",
"https://b.hatena.ne.jp/hotentry/it.rss",
"https://www.nhk.or.jp/rss/news/cat0.xml",
"http://tyosuke20xx.com/rss"
];
const proxy = "https://api.allorigins.win/get?url=";
const feedsContainer = document.getElementById("feeds");
const searchInput = document.getElementById("search");
let allCards = [];
function formatDate(pubDateStr) {
const date = new Date(pubDateStr);
return isNaN(date) ? "" : `${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日 ${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`;
}
function extractImageFromDescription(desc) {
const match = desc.match(/<img.*?src="(.*?)"/);
return match ? match[1] : null;
}
async function fetchAndDisplayFeeds() {
feedsContainer.innerHTML = "🔄 更新中…";
allCards = [];
for (const url of rssUrls) {
try {
const res = await fetch(proxy + encodeURIComponent(url));
const data = await res.json();
const parser = new DOMParser();
const xml = parser.parseFromString(data.contents, "text/xml");
const items = xml.querySelectorAll("item");
items.forEach((item, i) => {
if (i >= 5) return;
const title = item.querySelector("title")?.textContent || "";
const link = item.querySelector("link")?.textContent || "#";
const desc = item.querySelector("description")?.textContent || "";
const pubDate = item.querySelector("pubDate")?.textContent || "";
const dateFormatted = formatDate(pubDate);
const img = extractImageFromDescription(desc);
const card = document.createElement("div");
card.className = "feed-card";
card.innerHTML = `
${img ? `<img src="${img}" alt="thumbnail">` : ""}
<h2><a href="${link}" target="_blank">${title}</a></h2>
<p>${desc.replace(/<[^>]+>/g, '').slice(0, 100)}...</p>
<time>${dateFormatted}</time>
`;
allCards.push({ title, desc, element: card });
feedsContainer.appendChild(card);
});
} catch (e) {
console.error("RSS取得失敗:", url, e);
}
}
}
searchInput.addEventListener("input", () => {
const keyword = searchInput.value.toLowerCase();
feedsContainer.innerHTML = "";
allCards.forEach(({ title, desc, element }) => {
if (title.toLowerCase().includes(keyword) || desc.toLowerCase().includes(keyword)) {
feedsContainer.appendChild(element);
}
});
});
fetchAndDisplayFeeds();
setInterval(fetchAndDisplayFeeds, 60000); // 60秒ごと自動更新
</script>
</body>
</html>
美少女ゲーム業界の衰退について
🔻 主な衰退の原因
1. スマホゲーム・ソーシャルゲームの台頭
- 2010年代以降、スマートフォン向けのソシャゲ(例:Fate/Grand Order、ブルーアーカイブ)が市場を急速に拡大。
- 無料で始められ、課金で収益を得るモデルが主流となり、従来のパッケージ型PCエロゲは売上が激減。
2. ユーザー層の高齢化と新規参入の減少
- 2000年代のエロゲブーム時代にプレイしていた層がそのまま年齢を重ね、若年層の参入が少ない。
- 新規ファンを獲得するマーケティングやジャンル刷新が進まず、固定ファン頼みの構造に。
3. 表現規制と倫理的圧力の強化
- 政治的・社会的にアダルト表現に対する目が厳しくなり、過激な内容を出しづらくなった。
- SteamやDMMなどのプラットフォームでも規制強化や販売制限があり、制作の自由度が下がる。
4. 制作コストの増加と売上の減少
- フルボイス、アニメーション、豪華な原画・シナリオなど、品質向上で開発費が増大。
- しかし、パッケージ版は売れなくなり、回収が難しくなる → 開発会社の倒産が相次ぐ。
5. ユーザーの性癖やニーズの細分化
- 需要が「NTR」「ロリ」「男の娘」「異種姦」など多様化し、大衆向け作品では満足されにくくなった。
- その結果、ニッチ特化の低予算同人ゲーに市場を奪われつつある。
🔁 現在の潮流と生き残り戦略
✅ DL販売・同人の台頭
- DLsiteやFANZAなどを通じたダウンロード販売が主流に。
- 小規模な個人・同人サークルが高コスパな作品を出しやすくなった(例:「対魔忍」「ドーナドーナ」など)。
✅ ジャンルの変化
- 従来の「純愛・学園モノ」よりも、「異世界×エロ」「ゲーム性×エロ(RPG、SLGなど)」へのシフト。
- ゲーム性を伴うことでSteamなどの一般プラットフォームでも一部販売が可能に。
✅ 海外市場の開拓
- 英語・中国語翻訳での海外展開。
- ただし、欧米では性表現に厳しい文化もあり、ローカライズの壁が大きい。
📉 代表的な衰退の事例
- âge(アージュ):「マブラヴ」シリーズで有名だが、近年は新作が出せず苦戦。
- minori(ミノリ):ビジュアルと演出で一世を風靡したが、2020年に解散。
- Nitro+:エロゲから一般作品(アニメやFGO)に移行し、エロゲ制作を事実上撤退。
🔮 今後どうなるか?
- 同人・個人開発+DL販売が中心となり、大手ブランドは減少。
- VRエロゲやAIエロゲのような新技術との融合で、新しい波が起きる可能性はあり。
- 一方で、完全復活は難しいという見方が一般的。ニッチな趣味市場として生き残っていく形になるでしょう。
新しい技術のアイディア
🔮 1. 感情同期型ウェアラブルAI(EmoSync)
概要: 身に着けると、ユーザーの感情をリアルタイムでAIが解析し、対話や環境を調整してくれる。
例:
- ユーザーがストレスを感じている → 照明を暖色に、音楽をリラックス系に自動変更
- ネガティブな会話をしている → AIがそっと話題を変えるアドバイスを表示
🌐 2. バーチャル記憶共有ネットワーク(MemNet)
概要: VR/AR空間で記憶や体験を他人と部分的に共有できるネットワーク。
用途:
- 歴史の授業 → 偉人の記憶にアクセスしてその時代を体験
- PTSD治療 → セラピストと一緒に記憶を「再体験」して段階的に克服
🧠 3. ノンインベイシブ脳内入力UI(ThoughtTap)
概要: 頭に装着するだけで、思考をコマンドとして認識し、スマホやPCを操作できる技術。
特徴:
- キーボード・マウス不要
- 「メールを送信」と思うだけで送信動作に反映
- 一種の“考えるだけで操作するOS”
🏙️ 4. 空間圧縮型住宅システム(FoldSpace)
概要: 家具や空間を動的に再配置できる可変型居住空間。壁や床が折りたたまれたり、伸縮したりして用途が変わる。
活用例:
- 6畳の部屋が、昼は書斎・夜はベッドルームに自動切り替え
- 壁収納が展開して3Dプリンタや調理ロボになる
🐾 5. バーチャルペット触感再現装置(HaptiPet)
概要: 仮想ペットを実際に“撫でる”感触を与えてくれる触覚デバイス。
仕組み:
- 手に装着するグローブ型デバイス
- 仮想キャラクターの動きに合わせて反力・温度・振動を再現
- VRゲームや孤独対策にも応用可能
🎮 ゲーム企画書:『カスタムロボ RE:BOOST(仮)』
🎮 ゲーム企画書:『カスタムロボ RE:BOOST(仮)』
1. タイトル案
- 『カスタムロボ RE:BOOST』
- 『カスタムロボ R:Reboot』
- 『カスタムロボ∞(インフィニティ)』
2. コンセプト
「少年の夢が、再び現実になる。」
プレイヤーはカスタムロボのパイロットとして、機体を自由にカスタマイズし、リアルかつスピーディな戦闘を繰り広げる。かつてのロボットバトルの熱狂を、現代のビジュアルとシステムで完全再現し、シリーズ未体験の若年層と当時のファン両方に向けた“進化系リメイク”。
3. ターゲットユーザー
- 【主】20~40代:旧作ファン層(N64 / GC / DSユーザー)
- 【副】10~20代:現代のロボットアクションゲームファン(スプラトゥーン、ARMORED CORE、ガンダム系)
4. プラットフォーム
- Nintendo Switch 2(想定)
- PC(Steam)
- PS5(マルチプラットフォーム想定)
5. ゲームジャンル
- 対戦型ロボットカスタマイズバトルアクション
(3Dアクション+パーツ収集+オンライン対戦)
6. 主なゲーム要素
| 要素 | 内容 |
| ロボットのカスタマイズ | 頭・胴・脚・ガン・ボム・ポッドなど1000種類以上のパーツ。性能とビジュアルに影響。 |
| スピード感重視のバトル | 従来のダッシュ・ジャンプ・バーストに加え、新アクション「ブーストチェイン」導入。 |
| シングルモード | オリジナルストーリー+リメイク要素。「ラウンドダクロン」のようなドラマ展開。 |
| オンライン対戦 | ランクマッチ・ルームマッチ・トーナメント。観戦モードあり。 |
| ギルド/クラブ要素 | ユーザー同士でクランを組み、週替わりのイベントに参加。 |
| スキン/アバター | キャラやロボの見た目を変更できる。課金なしでも入手可能。 |
7. 世界観とストーリー(概要)
西暦2089年。AR空間で行われる仮想バトル「ホロロイド」が世界大会に昇格し、ロボット競技は再び脚光を浴びていた。
主人公は「伝説のロボ乗り」の息子として大会に挑む。背後には国家機密とされる人工知能兵器の陰謀が…。
8. ビジュアルイメージ
- キャラデザイン:アニメ調+SFテイスト(イラスト例:天神英貴・貞本義行風)
- ロボデザイン:トイ的なかわいさとメカのかっこよさを両立(例:LBX×AC)
9. 技術・開発情報
- エンジン:Unreal Engine 5
- ネットワーク:Photon Fusion / Epic Online Services
- カスタムAI:バディAIとの協力バトルモードあり
10. マネタイズ・展開
| 方式 | 内容 |
| 買い切り型 | 基本価格:6,980円(DLCパックあり) |
| DLC | ストーリー拡張・新パーツセット(例:コラボ機体・歴代作品機体) |
| コラボ展開 | 他ゲーム/玩具/アニメとコラボ(例:メダロット、LBX、ガンダム) |
| メディア展開 | アニメ化・コミカライズ・プラモデル販売(3Dプリント連携も) |
11. 差別化ポイント
- パーツごとの「フィジカル挙動」シミュレーションでリアル感UP
- AIロボ同士のオート戦も可能(観戦専用モード)
- 「仮想バトル空間」×「現実の世界」の行き来するハイブリッドストーリー
12. 開発スケジュール(案)
| フェーズ | 内容 | 期間 |
| 企画・プロトタイプ | プロトタイピング/ビジュアル検証 | 3ヶ月 |
| α開発 | 基本システム構築 | 6ヶ月 |
| β開発 | 全体完成・バグ修正 | 3ヶ月 |
| PR・リリース | 体験版配布/事前登録/製品版発売 | 2ヶ月 |
Github風サイト
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>GitHub風 - SampleRepo</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap & FontAwesome -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: #f6f8fa;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.repo-header { background: #fff; padding: 20px; border: 1px solid #ddd; margin-bottom: 10px; }
.nav-tabs .nav-link.active { border-color: #ddd #ddd #fff; background: #fff; }
.file-list li { border-bottom: 1px solid #eee; padding: 8px 0; display: flex; align-items: center; }
.file-list i { margin-right: 10px; }
.readme-box, .issues-box, .commits-box { background: #fff; padding: 20px; border: 1px solid #ddd; margin-top: 10px; }
#editor { height: 400px; width: 100%; border: 1px solid #ccc; }
</style>
</head>
<body>
<!-- ヘッダー -->
<nav class="navbar navbar-dark bg-dark px-3">
<a class="navbar-brand" href="#"><i class="fab fa-github"></i> GitHub風サイト</a>
<span class="text-white"><i class="fas fa-user-circle"></i> yuhei</span>
</nav>
<div class="container mt-3">
<!-- リポジトリヘッダー -->
<div class="repo-header">
<h3><i class="fas fa-book"></i> yuhei / <strong>SampleRepo</strong></h3>
<p class="text-muted">最終更新: 2025年5月26日</p>
<button class="btn btn-sm btn-outline-secondary"><i class="fas fa-star"></i> Star</button>
<button class="btn btn-sm btn-outline-secondary"><i class="fas fa-code-branch"></i> Fork</button>
</div>
<!-- タブ -->
<ul class="nav nav-tabs" id="repoTabs">
<li class="nav-item"><a class="nav-link active" href="#" onclick="switchTab('code')"><i class="fas fa-code"></i> Code</a></li>
<li class="nav-item"><a class="nav-link" href="#" onclick="switchTab('issues')"><i class="fas fa-exclamation-circle"></i> Issues</a></li>
<li class="nav-item"><a class="nav-link" href="#" onclick="switchTab('commits')"><i class="fas fa-history"></i> Commits</a></li>
</ul>
<!-- Codeタブ -->
<div id="tab-code" class="tab-content">
<ul class="file-list list-unstyled bg-white p-3 border">
<li><i class="fas fa-folder"></i> src/</li>
<li><i class="fas fa-file-code"></i> index.js</li>
<li><i class="fas fa-file-alt"></i> README.md</li>
<li><i class="fas fa-file-alt"></i> LICENSE</li>
</ul>
<div class="readme-box">
<h4><i class="fas fa-book-open"></i> README.md</h4>
<hr>
<div id="readme-content"></div>
</div>
<div class="mt-4">
<h5><i class="fas fa-code"></i> コード編集 (Monaco Editor)</h5>
<div id="editor"></div>
<button id="saveCode" class="btn btn-success mt-2"><i class="fas fa-save"></i> 保存</button>
<button id="themeToggle" class="btn btn-secondary mt-2"><i class="fas fa-adjust"></i> テーマ切替</button>
</div>
</div>
<!-- Issuesタブ -->
<div id="tab-issues" class="tab-content" style="display:none;">
<div class="issues-box">
<h4><i class="fas fa-exclamation-circle"></i> Open Issues</h4>
<ul class="list-group">
<li class="list-group-item">
<strong>#1</strong> READMEの翻訳が必要です<br>
<small class="text-muted">posted by yuhei - 1日前</small>
</li>
<li class="list-group-item">
<strong>#2</strong> index.jsにテストコードを追加してください<br>
<small class="text-muted">posted by yuhei - 2日前</small>
</li>
</ul>
</div>
</div>
<!-- Commitsタブ -->
<div id="tab-commits" class="tab-content" style="display:none;">
<div class="commits-box">
<h4><i class="fas fa-history"></i> Commits</h4>
<ul class="list-group">
<li class="list-group-item">
<strong>Initial commit</strong> - 2025-05-25<br>
<small class="text-muted">by yuhei</small>
</li>
<li class="list-group-item">
<strong>README updated</strong> - 2025-05-26<br>
<small class="text-muted">by yuhei</small>
</li>
</ul>
</div>
</div>
</div>
<!-- ライブラリ -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.45.0/min/vs/loader.min.js"></script>
<!-- タブ切替・Markdown表示・Monaco起動 -->
<script>
const markdown = `
# SampleRepo
ようこそ!これはGitHub風サイトのデモです。
## 特徴
- Monaco Editorでコード編集
- Markdown表示(README)
- ダークモード対応
- Issue・コミットのUI
## 技術
- HTML/CSS/JS
- Bootstrap5
- Monaco Editor
- Marked.js
`;
document.getElementById('readme-content').innerHTML = marked.parse(markdown);
function switchTab(tab) {
['code', 'issues', 'commits'].forEach(id => {
document.getElementById('tab-' + id).style.display = (id === tab) ? 'block' : 'none';
});
document.querySelectorAll('#repoTabs .nav-link').forEach(link => link.classList.remove('active'));
document.querySelector(`#repoTabs .nav-link[onclick*="${tab}"]`).classList.add('active');
}
// Monaco起動
require.config({ paths: { 'vs': 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.45.0/min/vs' }});
require(['vs/editor/editor.main'], function () {
window.editor = monaco.editor.create(document.getElementById('editor'), {
value: localStorage.getItem('savedCode') || `function hello() {\n console.log("Hello from Monaco Editor!");\n}`,
language: 'javascript',
theme: 'vs-light',
automaticLayout: true
});
document.getElementById('saveCode').onclick = function () {
const code = editor.getValue();
localStorage.setItem('savedCode', code);
alert('保存しました!');
};
document.getElementById('themeToggle').onclick = function () {
const theme = monaco.editor.getTheme() === 'vs-dark' ? 'vs-light' : 'vs-dark';
monaco.editor.setTheme(theme);
};
});
</script>
</body>
</html>
NeuroLink VR
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>フルダイブVR - 仮想世界体験</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Arial', sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.vr-container {
width: 95vw;
height: 95vh;
background: #000;
border-radius: 20px;
position: relative;
overflow: hidden;
box-shadow: 0 20px 50px rgba(0,0,0,0.3);
}
.boot-screen {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(45deg, #0f0f23, #1a1a2e);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 100;
transition: opacity 1s ease-out;
}
.boot-screen.hidden {
opacity: 0;
pointer-events: none;
}
.logo {
font-size: 3rem;
color: #00d4ff;
margin-bottom: 30px;
text-shadow: 0 0 20px #00d4ff;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
.loading-bar {
width: 300px;
height: 4px;
background: #333;
border-radius: 2px;
overflow: hidden;
margin-bottom: 20px;
}
.loading-progress {
height: 100%;
background: linear-gradient(90deg, #00d4ff, #ff006e);
width: 0%;
animation: loading 3s ease-out forwards;
}
@keyframes loading {
to { width: 100%; }
}
.boot-text {
color: #00d4ff;
font-size: 1.2rem;
margin-top: 20px;
}
#canvas {
width: 100%;
height: 100%;
display: block;
}
.hud {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 10;
}
.status-panel {
position: absolute;
top: 20px;
left: 20px;
background: rgba(0, 212, 255, 0.1);
border: 1px solid #00d4ff;
border-radius: 10px;
padding: 15px;
color: #00d4ff;
font-family: 'Courier New', monospace;
backdrop-filter: blur(10px);
}
.controls {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 15px;
pointer-events: all;
}
.control-btn {
background: rgba(0, 212, 255, 0.2);
border: 2px solid #00d4ff;
color: #00d4ff;
padding: 12px 20px;
border-radius: 25px;
cursor: pointer;
font-size: 14px;
font-weight: bold;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
}
.control-btn:hover {
background: rgba(0, 212, 255, 0.4);
box-shadow: 0 0 20px rgba(0, 212, 255, 0.5);
transform: translateY(-2px);
}
.neural-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: radial-gradient(circle at center, transparent 30%, rgba(0, 212, 255, 0.05) 100%);
pointer-events: none;
z-index: 5;
}
.dive-complete {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #00d4ff;
font-size: 2rem;
text-align: center;
opacity: 0;
animation: fadeInOut 4s ease-in-out;
z-index: 50;
text-shadow: 0 0 20px #00d4ff;
}
@keyframes fadeInOut {
0%, 100% { opacity: 0; }
20%, 80% { opacity: 1; }
}
</style>
</head>
<body>
<div class="vr-container">
<div class="boot-screen" id="bootScreen">
<div class="logo">NeuroLink VR</div>
<div class="loading-bar">
<div class="loading-progress"></div>
</div>
<div class="boot-text">Neural Interface Initializing...</div>
</div>
<canvas id="canvas"></canvas>
<div class="neural-overlay"></div>
<div class="hud">
<div class="status-panel">
<div>Neural Sync: <span id="sync">98.7%</span></div>
<div>Reality Index: <span id="reality">VIRTUAL</span></div>
<div>Immersion Level: <span id="immersion">MAXIMUM</span></div>
<div>Connected Users: <span id="users">1,247</span></div>
</div>
</div>
<div class="controls">
<button class="control-btn" onclick="changeWorld('cyber')">サイバー都市</button>
<button class="control-btn" onclick="changeWorld('forest')">森林世界</button>
<button class="control-btn" onclick="changeWorld('space')">宇宙ステーション</button>
<button class="control-btn" onclick="disconnect()">ログアウト</button>
</div>
<div class="dive-complete" id="diveComplete">
フルダイブ完了<br>
<small>仮想世界へようこそ</small>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
let scene, camera, renderer, world = 'cyber';
let particles = [];
let buildings = [];
let stars = [];
let trees = [];
// 起動シーケンス
setTimeout(() => {
document.getElementById('bootScreen').classList.add('hidden');
initVR();
setTimeout(() => {
document.getElementById('diveComplete').style.display = 'block';
}, 1000);
}, 3500);
function initVR() {
// Three.js セットアップ
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
renderer = new THREE.WebGLRenderer({ canvas: document.getElementById('canvas'), antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0x000011);
// 初期世界を構築
buildCyberWorld();
// カメラ位置
camera.position.set(0, 5, 10);
// アニメーションループ
animate();
// HUD更新
updateHUD();
}
function buildCyberWorld() {
// クリア
clearWorld();
scene.fog = new THREE.Fog(0x000033, 10, 100);
// ネオンビル群
for (let i = 0; i < 50; i++) {
const height = Math.random() * 20 + 5;
const geometry = new THREE.BoxGeometry(
Math.random() * 3 + 1,
height,
Math.random() * 3 + 1
);
const material = new THREE.MeshBasicMaterial({
color: Math.random() > 0.5 ? 0x00ffff : 0xff00ff,
transparent: true,
opacity: 0.8
});
const building = new THREE.Mesh(geometry, material);
building.position.set(
(Math.random() - 0.5) * 100,
height / 2,
(Math.random() - 0.5) * 100
);
scene.add(building);
buildings.push(building);
}
// パーティクル効果
createParticles(0x00ffff);
// 地面
const floorGeometry = new THREE.PlaneGeometry(200, 200);
const floorMaterial = new THREE.MeshBasicMaterial({
color: 0x001122,
transparent: true,
opacity: 0.5
});
const floor = new THREE.Mesh(floorGeometry, floorMaterial);
floor.rotation.x = -Math.PI / 2;
scene.add(floor);
}
function buildForestWorld() {
clearWorld();
scene.fog = new THREE.Fog(0x228B22, 5, 50);
// 木々
for (let i = 0; i < 100; i++) {
// 幹
const trunkGeometry = new THREE.CylinderGeometry(0.3, 0.5, 8);
const trunkMaterial = new THREE.MeshBasicMaterial({ color: 0x8B4513 });
const trunk = new THREE.Mesh(trunkGeometry, trunkMaterial);
// 葉
const leavesGeometry = new THREE.SphereGeometry(3);
const leavesMaterial = new THREE.MeshBasicMaterial({ color: 0x228B22 });
const leaves = new THREE.Mesh(leavesGeometry, leavesMaterial);
leaves.position.y = 6;
const tree = new THREE.Group();
tree.add(trunk);
tree.add(leaves);
tree.position.set(
(Math.random() - 0.5) * 80,
4,
(Math.random() - 0.5) * 80
);
scene.add(tree);
trees.push(tree);
}
createParticles(0x90EE90);
// 地面
const floorGeometry = new THREE.PlaneGeometry(200, 200);
const floorMaterial = new THREE.MeshBasicMaterial({ color: 0x2F4F2F });
const floor = new THREE.Mesh(floorGeometry, floorMaterial);
floor.rotation.x = -Math.PI / 2;
scene.add(floor);
}
function buildSpaceWorld() {
clearWorld();
scene.fog = null;
renderer.setClearColor(0x000000);
// 星々
for (let i = 0; i < 1000; i++) {
const starGeometry = new THREE.SphereGeometry(0.1);
const starMaterial = new THREE.MeshBasicMaterial({ color: 0xffffff });
const star = new THREE.Mesh(starGeometry, starMaterial);
star.position.set(
(Math.random() - 0.5) * 200,
(Math.random() - 0.5) * 200,
(Math.random() - 0.5) * 200
);
scene.add(star);
stars.push(star);
}
// 宇宙ステーション
const stationGeometry = new THREE.TorusGeometry(10, 3, 8, 20);
const stationMaterial = new THREE.MeshBasicMaterial({
color: 0x888888,
wireframe: true
});
const station = new THREE.Mesh(stationGeometry, stationMaterial);
station.position.set(0, 0, -20);
scene.add(station);
createParticles(0xffffff);
}
function createParticles(color) {
for (let i = 0; i < 200; i++) {
const particleGeometry = new THREE.SphereGeometry(0.05);
const particleMaterial = new THREE.MeshBasicMaterial({
color: color,
transparent: true,
opacity: 0.6
});
const particle = new THREE.Mesh(particleGeometry, particleMaterial);
particle.position.set(
(Math.random() - 0.5) * 50,
Math.random() * 20,
(Math.random() - 0.5) * 50
);
particle.velocity = {
x: (Math.random() - 0.5) * 0.02,
y: Math.random() * 0.01,
z: (Math.random() - 0.5) * 0.02
};
scene.add(particle);
particles.push(particle);
}
}
function clearWorld() {
buildings.forEach(b => scene.remove(b));
trees.forEach(t => scene.remove(t));
stars.forEach(s => scene.remove(s));
particles.forEach(p => scene.remove(p));
buildings = [];
trees = [];
stars = [];
particles = [];
// シーン全体をクリア
while(scene.children.length > 0) {
scene.remove(scene.children[0]);
}
}
function animate() {
requestAnimationFrame(animate);
// カメラの自動回転
const time = Date.now() * 0.0005;
camera.position.x = Math.cos(time) * 20;
camera.position.z = Math.sin(time) * 20;
camera.lookAt(scene.position);
// パーティクルアニメーション
particles.forEach(particle => {
particle.position.add(particle.velocity);
if (particle.position.y > 25) {
particle.position.y = -5;
}
if (particle.position.x > 25) particle.position.x = -25;
if (particle.position.x < -25) particle.position.x = 25;
if (particle.position.z > 25) particle.position.z = -25;
if (particle.position.z < -25) particle.position.z = 25;
});
// ビルの光る効果
buildings.forEach(building => {
if (Math.random() > 0.98) {
building.material.opacity = Math.random() * 0.5 + 0.5;
}
});
renderer.render(scene, camera);
}
function changeWorld(newWorld) {
world = newWorld;
switch(world) {
case 'cyber':
buildCyberWorld();
break;
case 'forest':
buildForestWorld();
break;
case 'space':
buildSpaceWorld();
break;
}
}
function updateHUD() {
setInterval(() => {
document.getElementById('sync').textContent = (98 + Math.random() * 2).toFixed(1) + '%';
document.getElementById('users').textContent = (1200 + Math.floor(Math.random() * 100)).toLocaleString();
}, 2000);
}
function disconnect() {
document.querySelector('.vr-container').style.opacity = '0';
setTimeout(() => {
document.body.innerHTML = `
<div style="display: flex; justify-content: center; align-items: center; height: 100vh; color: #00d4ff; font-size: 2rem; text-align: center;">
<div>
<div>Neural Link Disconnected</div>
<div style="font-size: 1rem; margin-top: 20px; opacity: 0.7;">現実世界へ戻りました</div>
</div>
</div>
`;
}, 1000);
}
// リサイズ対応
window.addEventListener('resize', () => {
if (camera && renderer) {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
});
</script>
</body>
</html>
C# 抽象クラス
using System;
// 抽象クラス
// User -> Japanese, American
abstract class User {
public abstract void SayHi();
}
class Japanese: User {
public override void SayHi() {
Console.WriteLine("こんにちは!");
}
}
class American: User {
public override void SayHi() {
Console.WriteLine("hi!");
}
}
class MyApp {
static void Main() {
Japanese aki = new Japanese();
aki.SayHi();
American tom = new American();
tom.SayHi();
}
}
『デビルチルドレン リメイク』企画書
1. タイトル案
『デビルチルドレン:リバースコード』
2. 企画意図
2000年代初頭に登場し、少年少女が悪魔と契約して戦うという世界観で人気を博した『デビルチルドレン』シリーズを、現代の技術とニーズに合わせてリメイク。ペルソナやポケモン、デジモンの人気が再燃する中、悪魔との契約・育成・融合・人間ドラマを融合させたRPGとして、懐かしさと新しさを両立させます。
3. 想定プラットフォーム
- Nintendo Switch
- PlayStation 5
- Steam(PC)
- スマートフォン(クラウド連携 or 外伝展開)
4. ゲーム概要
ジャンル
- 悪魔育成RPG+ダークファンタジーADV
主な要素
- ターン制バトル(3対3)
- 悪魔の仲間化・進化・合体(従来の悪魔合体に加え、個体ごとの性格やスキル成長分岐あり)
- 悪魔と絆を深める「契約イベント」や「共鳴システム」
- 選択によるストーリールート分岐(LAW / CHAOS / NEUTRAL)
- ジュブナイル・ホラー要素(子供視点で描く社会の闇)
5. ストーリー構成(例)
あらすじ(リメイク用に刷新)
主人公(カイ / アミ)は、異世界「魔界」と現実世界の交差点である「黄昏区(たそがれく)」に迷い込む。悪魔と契約する能力を持つ「契約者」として覚醒し、2つの世界の崩壊を止める旅へ出る。だが、選ぶ道によって人類の運命も変わる──。
6. メインキャラクター(案)
- カイ(主人公・男性)
- アミ(主人公・女性)
- ロキ(主人公に付き添う謎の悪魔)
- セト(CHAOSルートの導き手)
- メタトロン(LAWルートの守護天使)
- ルシフェル(真実を知る者)
7. 主な新要素
| 項目 | 内容 |
|---|---|
| 3Dグラフィック化 | Unity / Unreal Engineによるリアルタイム3D |
| 悪魔フルボイス化 | 合体時や契約時に専用セリフあり |
| 難易度調整機能 | EASY〜CHAOSまで選択可能 |
| マルチエンディング | ルート分岐と「真・人類ルート」追加 |
| オンライン育成交換要素 | プレイヤー間で悪魔を交換できる |
8. 想定スケジュール
| フェーズ | 期間 | 内容 |
|---|---|---|
| 企画・プリプロ | 3か月 | シナリオ/仕様書/キャラデザイン |
| 開発 | 12〜18か月 | モデリング/実装/収録/テスト |
| テスト・調整 | 3か月 | バランス調整/デバッグ |
| 発売 | XX年XX月 | パッケージ&DL版展開 |
9. 想定ターゲット
- 元祖『デビチル』ファン(20〜40代)
- 現代のRPGファン(ペルソナ、ポケモン、デジモン層)
- ダークジュブナイルや退廃SFが好きなプレイヤー
10. プロモーション戦略案
- 初報ティザーPV公開(『デビチル』ロゴを強調)
- キャラ人気投票キャンペーン
- 悪魔デザインコンテスト(ユーザー参加型)
- オリジナルサウンドトラック配信
- コラボカフェ、限定グッズ展開
とある魔術の禁書目録と宗教
『とある魔術の禁書目録』(とあるまじゅつのインデックス)は、鎌池和馬によるライトノベルシリーズで、科学と魔術が同時に存在する世界を舞台にした作品です。このシリーズでは宗教的な要素が非常に深く関係しており、物語の根幹やキャラクター設定にも強く反映されています。
🔷 1. 宗教的テーマの主な特徴
◾ キリスト教の影響
特にカトリック・プロテスタント・正教会などのキリスト教宗派が頻繁に登場します。
- 「必要悪の教会(ネセサリウス)」:イギリス清教(Puritan Church of England)内の秘密組織。インデックスやステイル・マグヌスが所属。
- ローマ正教(ローマカトリック教会):ヴェントやアニェーゼ部隊が所属し、対立組織として描かれる。
- 天草式十字凄教:日本のキリスト教系地下組織。和風とキリスト教の融合。
◾ 魔術体系と宗教
- 魔術は「信仰」によって体系化されており、神・天使・聖人などの宗教的概念が魔術の理論や力の根拠になっています。
- **天使(エンジェル)や聖人(セイント)**の存在も科学的理論ではなく宗教的奇跡として扱われます。
🔷 2. 宗教と科学の対立構造
本作の最大のテーマは「科学と魔術の対立」です。これは単なるファンタジー設定ではなく、宗教と理性(啓蒙思想)的価値観の対立のメタファーとも解釈できます。
| 科学サイド | 魔術サイド |
|---|---|
| 学園都市(超能力開発) | 世界中の宗教組織 |
| 理性・再現性・実験 | 信仰・奇跡・象徴 |
| 能力開発による進化 | 神や奇跡への帰依 |
🔷 3. 主要キャラと宗教背景
| キャラクター | 宗教的背景 |
|---|---|
| インデックス | イギリス清教のシスター、10万3000冊の魔道書を記憶 |
| ステイル・マグヌス | イギリス清教の神父、炎の魔術師 |
| 神裂火織 | 天草式十字凄教出身の聖人 |
| アニェーゼ=サンクティス | ローマ正教の魔術師 |
| ヴェント=オブ=ザ=フロント | ローマ正教の「神の右席」 |
🔷 4. 宗教の扱いに関する考察
- 現実の宗教を直接的にモデル化してはいるが、あくまでフィクションとしてのアレンジが加えられている。
- 各宗派の描写は誇張や創作を含んでいるが、中世~現代の神学的概念や教義、聖書などに基づく知識が元になっており、作者の宗教知識の深さが感じられる。
- 一方で、宗教そのものへの風刺や批判は少なく、信仰を持つ者たちの「矛盾」「苦悩」「理想」を描写するスタンスが基本。
🔷 まとめ
『とある魔術の禁書目録』は、宗教を単なる設定の一部ではなく、登場人物の信念や世界の構造そのものに組み込んでいる稀有な作品です。宗教と科学、信仰と理性の相克をエンタメ作品として巧みに表現している点が評価されるべきでしょう。
希望があれば、「とある魔術の禁書目録に登場する宗派一覧」「現実の宗教との違い」「魔術理論の構造」など、さらに深掘りした解説もできます。
4o
C# コンストラクタ
using System;
// コンストラクタ
class User {
public string name;
// public User() {
// this.name = "ME";
// }
public User(string name) {
this.name = name;
}
// public User() { // オーバーロード
// this.name = "nobody";
// }
public User(): this("nobody") {
}
public void SayHi() {
Console.WriteLine($"hi {name}");
}
}
class MyApp {
static void Main() {
// User user = new User();
// user.SayHi();
User tom = new User("Tom");
tom.SayHi();
User user = new User();
user.SayHi();
}
}
