Commit b1f21e41 authored by 18신대성's avatar 18신대성

이정도면 프로토타입-1버전쯤 되지않을까

parents 5487749b 3189664a
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
\ No newline at end of file
# sejong25
## 필수
1. nodejs 설치
- https://nodejs.org/en/download/
2. npm
- nodejs를 설치하면 함께 설치됨
- `$ npm install npm -g` 하면 최신 버전으로 업데이트
3. Dependency 모듈 설치
- `$ npm install`
- sejong25 디렉토리에서 콘솔을 열고 명령어 실행
- package.json과 package-lock.json을 참고하여 필요한 모듈들을 자동으로 설치해 줌
## 서버 및 네트워킹
```
$node server.js
```
위 커맨드를 입력하면 서버가 실행됨
테스트가 하고 싶을 땐 서버를 실행하고 웹브라우저에서 `localhost` 또는 `127.0.0.1`로 접속하면 됨
\ No newline at end of file
This diff is collapsed.
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<script src="script/phaser.js"></script> <meta charset="utf-8"/>
<script src="/socket.io/socket.io.js"></script>
<script src="js/phaser.js"></script>
<script src="js/Background.js"></script>
<script src="js/Input.js"></script>
<script src="js/WordSpace.js"></script>
<script src="js/WordObject.js"></script>
<script src="js/WordReader.js"></script>
</head> </head>
<body> <body>
<script src="js/Main.js"></script>
<script>
var config = {
type: Phaser.AUTO,
width: 800,
height: 600,
physics: {
default: 'arcade',
arcade: {
gravity: { y: 200 }
}
},
scene: {
preload: preload,
create: create
}
};
var game = new Phaser.Game(config);
function preload ()
{
this.load.setBaseURL('http://labs.phaser.io');
this.load.image('sky', 'assets/skies/space3.png');
this.load.image('logo', 'assets/sprites/phaser3-logo.png');
this.load.image('red', 'assets/particles/red.png');
}
function create ()
{
this.add.image(400, 300, 'sky');
var particles = this.add.particles('red');
var emitter = particles.createEmitter({
speed: 100,
scale: { start: 1, end: 0 },
blendMode: 'ADD'
});
var logo = this.physics.add.image(400, 100, 'logo');
logo.setVelocity(100, 200);
logo.setBounce(1, 1);
logo.setCollideWorldBounds(true);
emitter.startFollow(logo);
}
</script>
</body> </body>
</html> </html>
\ No newline at end of file
var BackGround = BackGround || {}
BackGround.isImageLoaded = false;
BackGround.brainGroup = null;
BackGround.loadImage = function(scene)
{
if (!this.isImageLoaded)
{
scene.load.image('brainGround0', 'assets/platform.png'); // horizontal
scene.load.image('brainGround1', 'assets/platform2.png'); // vertical
}
}
BackGround.drawBrain = function(scene)
{
brains = scene.physics.add.staticGroup();
brains.create(400, 500, 'brainGround0').setScale(1.5).refreshBody();
brains.create(400, 100, 'brainGround0').setScale(1.5).refreshBody();
brains.create(100, 300, 'brainGround1').setScale(0.5).refreshBody();
brains.create(700, 300, 'brainGround1').setScale(0.5).refreshBody();
brains.immovable = true;
this.brainGroup = brains;
}
\ No newline at end of file
var grade3Array = new Array();
var grade2Array = new Array();
var grade1Array = new Array();
var grade0Array = new Array();
function CSVParse($data) {
var allRows = $data.split('\n')
for(var singleRow = 0; singleRow < allRows.length; singleRow++)
{
var typing;
var grade;
typing = WordReader.getWordTyping(allRows[singleRow]);
grade = WordReader.getWordGrade(typing);
if(grade==3) {
grade3Array.push(allRows[singleRow]);
} else if(grade==2) {
grade2Array.push(allRows[singleRow]);
} else if(grade==1) {
grade1Array.push(allRows[singleRow]);
} else {
grade0Array.push(allRows[singleRow]);
}
}
}
\ No newline at end of file
This diff is collapsed.
class WordObject
{
constructor(text)
{
this.generationCode = WordSpace.nextWordCode++;
this.wordText = text;
//this.wordText = Input.removeConVow(text);
this.wordTyping = WordReader.getWordTyping(this.wordText);
this.wordGrade = WordReader.getWordGrade(this.wordTyping);
this.wordWeight = (function(_wordGrade)
{
var temp = 0;
temp = _wordGrade == 3 ? 3 :
_wordGrade == 2 ? 5 :
_wordGrade == 1 ? 7 : 10;
return temp;
})(this.wordGrade);
WordSpace.totalWeight += this.wordWeight;
WordSpace.setGameOverTimer();
console.log("Total weight : " + WordSpace.totalWeight);
//console.log("wordTyping : " + this.wordTyping + '\n' + "wordGrade : " + this.wordGrade + '\n' + "wordWeight : " + this.wordWeight + '\n');
this.wordSpeed = 1;
//alert("wordTyping : " + this.wordTyping + '\n' + "wordGrade : " + this.wordGrade + '\n' + "wordWeight : " + this.wordWeight + '\n');
}
instantiate(scene)
{
var randomX = Phaser.Math.Between(100, 700);
this.physicsObj = scene.physics.add.sprite(randomX, 100, 'wordBackground').setScale(0.3);
this.physicsObj.body.bounce.set(0.5);
this.wordObj = scene.add.text(randomX, 100, this.wordText, {fontFamily: '"궁서", 궁서체, serif'}).setColor('#000000');
this.wordObj.setOrigin(0.5,0.5);
}
destroy()
{
console.log(this.generationCode + ': ' + this.wordText + ' destroyed');
this.wordObj.destroy();
const groupIdx = WordSpace.wordGroup.findIndex(function(item) {return this.isEqualObject(item.generationCode)}, this);
if (groupIdx > -1) WordSpace.wordGroup.splice(groupIdx, 1);
const forceIdx = WordSpace.wordForcedGroup.findIndex(function(item) {return this.isEqualObject(item.generationCode)}, this);
if (forceIdx > -1) WordSpace.wordForcedGroup.splice(forceIdx, 1);
WordSpace.wordPhysicsGroup.remove(this.physicsObj, true, true);
}
attract()
{
var dist = Phaser.Math.Distance.Between(this.physicsObj.x, this.physicsObj.y, WordSpace.gravityPoint.x, WordSpace.gravityPoint.y);
var angle = Phaser.Math.Angle.Between(this.physicsObj.x, this.physicsObj.y, WordSpace.gravityPoint.x, WordSpace.gravityPoint.y);
this.physicsObj.setVelocity(dist * Math.cos(angle) * this.wordSpeed, dist * Math.sin(angle) * this.wordSpeed);
this.wordObj.setPosition(this.physicsObj.x, this.physicsObj.y);
}
getWordWeight() { return this.wordWeight; }
isEqualObject(_generationCode) { return _generationCode === this.generationCode; }
}
\ No newline at end of file
var WordReader = WordReader || {};
//초성의 타수를 반환함
function firstSound(charText)
{
var r = parseInt(((charText.charCodeAt(0) - parseInt('0xac00',16)) /28) / 21);
//쌍자음일 경우
if(r === 1 || r === 4 || r === 8 || r === 10 || r === 13) return 1.3;
else return 1;
}
//중성의 타수를 반환함
function middleSound(charText)
{
var r = parseInt(((charText.charCodeAt(0)- parseInt('0xac00',16)) / 28) % 21);
//'ㅒ' 또는 'ㅖ'일 경우
if(r === 3 || r === 7) return 1.3;
//조합된 모음일 경우
else if(r === 9 || r === 10 || r === 11 || r === 14 || r === 15 || r === 16 || r === 19) return 2;
else return 1;
}
//종성의 타수를 반환함
function lastSound(charText)
{
var r = parseInt((charText.charCodeAt(0) - parseInt('0xac00',16)) % 28);
//쌍자음일 경우
if(r === 2 || r === 20) return 1.3;
//없을 경우
else if(r === 0) return 0;
//조합된 자음일 경우
else if(r === 3 || r === 5 || r === 6 || r === 9 || r === 10 || r === 11 || r === 12 || r === 13 || r === 14 || r === 15 || r === 18) return 2;
else return 1;
}
//입력 받은 단어의 타수를 반환함
WordReader.getWordTyping = function(stringText)
{
var temp = 0;
for(var i = 0; i < stringText.length; i++)
{
temp += parseFloat(firstSound(stringText.charAt(i))) + middleSound(stringText.charAt(i)) + lastSound(stringText.charAt(i));
}
return temp;
}
//입력 받은 단어의 등급을 반환함
WordReader.getWordGrade = function(_wordTyping)
{
return 2 <= _wordTyping && _wordTyping < 7 ? 3 :
7 <= _wordTyping && _wordTyping < 12 ? 2 :
12 <= _wordTyping && _wordTyping < 17 ? 1 : 0;
}
\ No newline at end of file
var WordSpace = WordSpace || {};
WordSpace.isImageLoaded = false;
WordSpace.nextWordCode = 0;
WordSpace.totalWeight = 0; //현재 단어 무게 총합
WordSpace.brainCapacity = 20; //수용 가능한 단어 무게 최대치
WordSpace.defeatTime = 3000;
WordSpace.gameOverTimer = null; //게임 오버 판정 타이머
WordSpace.isTimerOn = false;
WordSpace.wordGroup = [];
WordSpace.wordForcedGroup = [];
WordSpace.wordPhysicsGroup = null;
WordSpace.gravityPoint = {x: 400, y: 300};
WordSpace.attackGauge =
{
value: 0,
add: function(plus)
{
if (this.value + plus > 11) this.value = 11;
else this.value += plus;
this.text.setText('게이지: ' + this.value.toFixed(1));
},
sub: function(minus)
{
if (this.value - minus < 0) this.value = 0;
else this.value -= minus;
this.text.setText('게이지: ' + this.value.toFixed(1));
},
resetValue: function() {this.value = 0;},
cutValue: function(cutOut) {this.value *= (1-cutOut);},
resetCycle: function(scene)
{
var option =
{
delay: 300,
callback: function()
{
WordSpace.attackGauge.sub(0.1);
},
loop: true
};
this.currentCycle = scene.time.addEvent(option);
this.text = scene.add.text(100,100,'게이지: ' + this.value.toFixed(1)).setColor('#ffffff');
},
pauseCycle: function(bool) {this.currentCycle.paused = bool;}
// showValue: 아래쪽에 바의 길이로 게이지 표시, 색으로 게이지의 강도 표현
}
WordSpace.wordCycle =
{
currentCycle: null,
resetCycle: function(scene, _delay)
{
var option =
{
delay: _delay,
callback: function()
{
WordSpace.generateWord(this)
},
callbackScope: scene,
loop: true
};
if (this.currentCycle != null)
{
this.currentCycle = this.currentCycle.reset(option);
}
else
{
this.currentCycle = scene.time.addEvent(option);
}
}
}
WordSpace.loadImage = function(scene)
{
if (!this.isImageLoaded)
{
scene.load.image('wordBackground', 'assets/wordBackground.png');
}
}
WordSpace.generateWord = function(scene)
{
word = new WordObject("솽젠커");
word.instantiate(scene);
WordSpace.wordGroup.push(word);
WordSpace.wordForcedGroup.push(word);
word.physicsObj.topObj = word;
scene.physics.add.collider(word.physicsObj, WordSpace.wordPhysicsGroup, function(object1)
{
if (object1.topObj.wordSpeed > 0.5) object1.topObj.wordSpeed = 0.05;
});
scene.physics.add.collider(word.physicsObj, BackGround.brainGroup);
WordSpace.wordPhysicsGroup.add(word.physicsObj);
}
function gameOver()
{
this.wordCycle.currentCycle.paused = true;
//To Do
console.log('defeat');
}
//게임 오버 판정을 위한 타이머
WordSpace.setGameOverTimer = function()
{
//만약 현재 단어 무게 총합이 뇌 용량보다 크다면 타이머를 시작함
if(this.brainCapacity < this.totalWeight && !this.isTimerOn)
{
this.gameOverTimer = setTimeout(gameOver.bind(this), this.defeatTime);
isTimerOn = true;
}
}
WordSpace.findWord = function(word)
{
var found = WordSpace.wordGroup.find(function(element)
{
return Input.isEqual(word, element.wordText);
});
if (found != undefined)
{
switch(found.wordGrade) // 이부분 나중에 더 효율적으로 바꿀수있지 않을까
{
case 0: WordSpace.attackGauge.add(2.5); break;
case 1: WordSpace.attackGauge.add(1.5); break;
case 2: WordSpace.attackGauge.add(0.9); break;
case 3: WordSpace.attackGauge.add(0.5); break;
default: console.log('[ERR] wrong grade of word'); break;
}
found.destroy();
}
}
\ No newline at end of file
var config = {
type: Phaser.AUTO,
width: 800,
height: 600,
physics: {
default: 'arcade',
arcade: {
debug: true
}
},
backgroundColor: Phaser.Display.Color.GetColor(0,0,0),
scene: {
preload: preload,
create: create,
update: update
}
};
var game = new Phaser.Game(config)
// load assets
function preload()
{
BackGround.loadImage(this);
WordSpace.loadImage(this);
Input.inputField.loadImage(this);
}
function create()
{
BackGround.drawBrain(this);
Input.inputField.generate(this);
WordSpace.wordPhysicsGroup = this.physics.add.group();
WordSpace.wordCycle.resetCycle(this, 2000);
WordSpace.attackGauge.resetCycle(this);
}
function update()
{
WordSpace.wordForcedGroup.forEach(function(element)
{
element.attract();
});
}
var socket = io.connect();
socket.on('hi', function(msg) {
console.log(msg);
});
socket.emit('hello');
\ No newline at end of file
function selectstartWord()
{
var i;
var grade3List = {};
var grade2List = {};
var grade1List = {};
for(i=0;i<5;i++)
{
grade3List[i] = Phaser.Utils.Array.GetRandom(CSVParsing.grade3Array);
}
for(i=0;i<4;i++)
{
grade2List[i] = Phaser.Utils.Array.GetRandom(CSVParsing.grade2Array);
}
grade1List[0] = Phaser.Utils.Array.GetRandom(CSVParsing.grade1Array);
}
\ No newline at end of file
This diff is collapsed.
{
"name": "sejong25",
"version": "1.0.0",
"description": "",
"main": "run_server.js",
"scripts": {
"test": "test"
},
"repository": {
"type": "git",
"url": "https://git.kucatdog.net/tear-of-sejong/sejong25.git"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"socket.io": "^2.2.0"
}
}
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io').listen(server);
app.use('/css', express.static(__dirname + '/css'));
app.use('/js', express.static(__dirname + '/js'));
app.use('/assets', express.static(__dirname + '/assets'));
app.get('/', function(req, res) {
res.sendFile(__dirname + '/index.html');
});
// http 기본 포트(80)에 서버 열기
server.listen(80, function() {
console.log('Listening on port ' + server.address().port);
});
// 클라이언트 요청에 대한 콜백 정의
io.on('connection', function(socket) {
socket.on('hello', function() {
console.log('client request');
socket.emit('hi', 'Hello, Client!');
});
});
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment