Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 브릿지 패턴
- 함수형 팩터리
- 단순한 빌더
- 데커레이터 패턴
- 내부 팩터리
- 그루비 스타일 빌더
- 팩터리 패턴
- 브릿지
- 컴포지트 패턴
- 디자인 패턴
- 데커레이터
- 싱글턴 패턴
- 팩터리
- 모던C++디자인패턴
- 추상 팩터리
- 팩터리 메서드
- 흐름식 빌더
- 프로토타입 중복처리
- 빌더 패턴
- 싱글턴
- 동적 데커레이터
- 프로토타입
- 동적 데코레이터
- 디자인패턴
- 컴포지트 빌더
- 싱글톤 패턴
- 빌더
- 프로토타입 패턴
- 싱글톤
- 컴포지트
Archives
- Today
- Total
GGym's Practice Notes
11장. 바이트코드 패턴 본문
각각의 커맨드들이 스택에 맞추어 실행된다.
커맨드는 0 0 1 5 0 50 2 으로 아래와 같이 명령이 실행된다.
0 : 0 push
1 : 0 pop ( 오브젝트 리스트 0 )
5 : 0 의 체력 가져옴 ( 체력 출력 )
0 : 50 push
2 : 50 pop ( 체력 설정)
#include<iostream>
#include<vector>
using namespace std;
void assert(bool check){
if(!check); // 예외발생
}
// 바이트코드
enum Instruction{
INST_LITERAL = 0x00,
INST_OBJECT = 0x01,
INST_SET_HEALTH = 0x02,
INST_SET_WISDOM = 0x03,
INST_SET_AGILITY = 0x04,
INST_GET_HEALTH = 0x05,
INST_GET_WISDOM = 0x06,
INST_GET_AGILITY = 0x07,
INST_PLAY_SOUND = 0x08,
INST_SPAWN_PARTICLES = 0x09,
};
// 사운드
class Sound{
public:
void play();
private:
string fileDirectory_;
};
// 파티클
class Particle{
public:
void play();
private:
string name_;
int frame_;
};
// 오브젝트
class Object{
public:
Object(int health, int wisdom, int agility)
: health_(health), wisdom_(wisdom), agility_(agility){}
int getHealth(){ return this->health_;};
int getWisdom(){ return this->wisdom_;};
int getAgility(){ return this->agility_;};
void setHealth(int val){ this->health_ = val;};
void setWisdom(int val){ this->wisdom_ = val;};
void setAgility(int val){ this->agility_ = val;};
private:
int health_;
int wisdom_;
int agility_;
};
vector<Object*> v_object_list;
class VM{
public:
VM() : stackSize_(0){}
void push(int value){
assert(stackSize_ < MAX_STACK);
stack_[stackSize_++] = value;
}
int pop(){
assert(stackSize_ > 0);
return stack_[--stackSize_];
}
// 기타 셋업
void setHealth(int amount, Object* wizard){}
void setWisdom(int amount, Object* wizard){}
void setAgility(int amount, Object* wizard){}
void playSound(int soundId){}
void spawnParticles(int particleType){}
void interpret(char bytecode[], int size){
for(int i =0;i<size; i++){
char instruction = bytecode[i];
int amount, value;
switch(instruction){
case INST_LITERAL:
value = bytecode[++i];
push(value);
break;
case INST_OBJECT:
object = v_object_list[pop()];
push(value);
break;
case INST_SET_HEALTH:
amount = pop();
setHealth(amount, object);
cout<<"체력을 " <<amount<<"으로 만들었다."<<endl;
break;
case INST_SET_WISDOM:
amount = pop();
setWisdom(amount, object);
cout<<"지혜를 " <<amount<<"으로 만들었다."<<endl;
break;
case INST_SET_AGILITY:
amount = pop();
setAgility(amount, object);
cout<<"민첩을 " <<amount<<"으로 만들었다."<<endl;
break;
case INST_GET_HEALTH:
cout<<"체력이 " <<object->getHealth()<<"이다."<<endl;
push(object->getHealth());
break;
case INST_GET_WISDOM:
push(object->getWisdom());
break;
case INST_GET_AGILITY:
push(object->getAgility());
break;
case INST_PLAY_SOUND:
playSound(pop());
break;
case INST_SPAWN_PARTICLES:
spawnParticles(pop());
break;
}
}
}
private:
static const int MAX_STACK = 128;
int stackSize_;
int stack_[MAX_STACK];
Object* object;
};
int main(){
VM vm;
v_object_list.push_back(new Object(30,20,50));
char command[7] = {0,0,1,5,0,50,2};
vm.interpret(command,7);
return 0;
}
'Design Pattern > 게임 디자인패턴' 카테고리의 다른 글
2장. 명령 패턴 (0) | 2020.05.07 |
---|---|
6장. 싱글턴 패턴 (0) | 2020.05.07 |
5장. 프로토타입 패턴 (0) | 2020.04.27 |
4장. 관찰자 패턴 (0) | 2020.04.17 |
11장. 바이트코드(인터프리터 패턴) (0) | 2020.03.25 |