Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 159 additions & 0 deletions maanjr
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
npx create-next-app@latest my-game
cd my-game
npm install

# تثبيت مكتبة Phaser لإنشاء اللعبة
npm install phaser next-auth

# إنشاء مجلد src وإضافة ملف اللعبة
mkdir src && cd src

# إنشاء ملف تسجيل الدخول
cat > auth.js <<EOL
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
username: { label: "Username", type: "text" },
password: { label: "Password", type: "password" }
},
async authorize(credentials) {
if (credentials.username === "player" && credentials.password === "1234") {
return { id: "1", name: "Player" };
}
return null;
}
})
],
pages: {
signIn: "/login",
},
});
EOL

# إنشاء ملف اختيار الشخصية
cat > selectCharacter.js <<EOL
import { useState } from "react";
import { useRouter } from "next/router";

const characters = [
{ name: "المحارب", image: "assets/player1.png", ability: "قوة هجومية عالية" },
{ name: "النينجا", image: "assets/player2.png", ability: "سرعة ومراوغة" }
];

export default function SelectCharacter() {
const [selectedCharacter, setSelectedCharacter] = useState(null);
const router = useRouter();

const startGame = () => {
if (selectedCharacter) {
localStorage.setItem("selectedCharacter", selectedCharacter);
router.push("/game");
}
};

return (
<div>
<h1>اختر شخصيتك</h1>
<div>
{characters.map((char) => (
<div key={char.name} onClick={() => setSelectedCharacter(char.image)}>
<img src={char.image} alt={char.name} width={100} />
<p>{char.name} - {char.ability}</p>
</div>
))}
</div>
<button onClick={startGame} disabled={!selectedCharacter}>ابدأ اللعب</button>
</div>
);
}
EOL

# تعديل ملف اللعبة الأساسي لإضافة التحديات ولوحة المتصدرين
cat > game.js <<EOL
import Phaser from "phaser";
import { useSession, signIn } from "next-auth/react";
import { useEffect, useState } from "react";

const GameContainer = () => {
const { data: session } = useSession();
const [gameLoaded, setGameLoaded] = useState(false);
const selectedCharacter = typeof window !== "undefined" ? localStorage.getItem("selectedCharacter") || "assets/player1.png" : "assets/player1.png";

useEffect(() => {
if (session && !gameLoaded) {
new Phaser.Game(config(selectedCharacter));
setGameLoaded(true);
}
}, [session, gameLoaded, selectedCharacter]);

if (!session) {
return <button onClick={() => signIn()}>تسجيل الدخول للعب</button>;
}
return <div id="game-container"></div>;
};

const config = (character) => ({
type: Phaser.AUTO,
width: 800,
height: 600,
scene: new MyGame(character),
physics: {
default: "arcade",
arcade: {
gravity: { y: 300 },
},
},
parent: "game-container",
});

class MyGame extends Phaser.Scene {
constructor(character) {
super("MyGame");
this.level = 1;
this.character = character;
this.score = 0;
}

preload() {
this.load.image("sky", "assets/sky.png");
this.load.image("player", this.character);
this.load.image("ground", "assets/platform.png");
this.load.image("enemy", "assets/enemy.png");
this.load.image("portal", "assets/portal.png");
this.load.image("coin", "assets/coin.png");
}

create() {
this.add.image(400, 300, "sky");
const platforms = this.physics.add.staticGroup();
platforms.create(400, 580, "ground").setScale(2).refreshBody();

this.player = this.physics.add.sprite(400, 500, "player");
this.player.setBounce(0.2);
this.player.setCollideWorldBounds(true);
this.physics.add.collider(this.player, platforms);

this.coins = this.physics.add.group({ key: "coin", repeat: 5, setXY: { x: 100, y: 0, stepX: 120 } });
this.physics.add.collider(this.coins, platforms);
this.physics.add.overlap(this.player, this.coins, this.collectCoin, null, this);

this.scoreText = this.add.text(16, 16, "النقاط: 0", { fontSize: "32px", fill: "#fff" });
}

collectCoin(player, coin) {
coin.destroy();
this.score += 10;
this.scoreText.setText(`النقاط: ${this.score}`);
localStorage.setItem("highscore", this.score);
}
}

export default GameContainer;
EOL

cd ..