青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿

初步做完粒子系統想著如何從腳本中載入數據,配送方法這樣不是很好
腳本我打算首先支持lua和天使腳本等引擎成熟了再支持python

首先來看使用lua語言改寫上篇的粒子系統代碼.
(不過鄙人的lua,python都很菜的,其原因就是一直沒有練習的機會)
對于Lua,其擴展有luabind,tolua++,luaplus,前2著都與boost有關
所以就使用luaplus,簡單些
開始了先上lua腳本代碼(我把lua當成了c++,開始書寫很不習慣,居然不知道lua中的邏輯符號是not and or 而非 !&& || 呵呵)

  1 
  2 -- 這是蓋莫引擎中使用lua腳本的測試粒子 
  3 
  4 -- 定義粒子池粒子個數
  5 max_particles = 2400
  6 
  7 -- 定義粒子初始位置
  8 particle_pos_x = 0.0
  9 particle_pos_y = 0.0
 10 particle_pos_z = 3.0
 11 
 12 -- 定義重力加速度
 13 gravity = 9.8
 14 
 15 -- 定義粒子大小
 16 particle_size = 0.8
 17 
 18 -- 定義粒子壽命
 19 particle_life = 8.2
 20 
 21 -- 定義批處理粒子個數
 22 batch_particles = 80
 23 
 24 -- 定義粒子和地面之間的摩擦力
 25 friction = 0.75
 26 
 27 -- 定義粒子系統發射半徑
 28 fountain_radius = 1.6
 29 
 30 -- 定義粒子范圍半徑
 31 particle_r = (fountain_radius + particle_size/2)*(fountain_radius + particle_size/2)
 32 
 33 -- 初始化隨機種子
 34 function InitRand()
 35    math.randomseed(os.time());
 36 end
 37    
 38 -- 初始化粒子顏色red,green,blue
 39 function InitColorRed(t)
 40     return 0.7 + 0.3 * math.sin(0.34*+ 0.1);
 41 end
 42 function InitColorGreen(t)
 43     return 0.6 + 0.4 * math.sin(0.63*+ 1.1);
 44 end
 45 function InitColorBlue(t)
 46     return 0.6 + 0.4 * math.sin(0.91*+ 2.1);
 47 end
 48 
 49 -- 定義粒子速度
 50 particle_vel = 8.0
 51 
 52 -- 獲取時間對應的速度值
 53 function GetVelByTime(t)
 54     return particle_vel*(0.8 + 0.1*(math.sin(0.5*t)+math.sin(0.31*t)));
 55 end
 56 
 57 -- 獲取粒子初始速度
 58 function InitZVel()
 59     return 0.7 + (0.3/4096.0* (math.random(1,4095));
 60 end
 61     
 62 -- 獲取xy平面隨機轉角
 63 function GetRandRotXY()
 64     return (2.0*3.14159265/4096.0* math.random(1,4095)
 65 end    
 66 
 67 -- 獲取粒子隨機速度x分量
 68 function InitXVel(t)
 69    xy_angle = GetRandRotXY();
 70    vt = GetVelByTime(t);
 71    return 0.45 * math.cos(xy_angle)*vt;
 72 end
 73 
 74 -- 獲取粒子隨機速度y分量
 75 function InitYVel(t)
 76    xy_angle = GetRandRotXY();
 77    vt = GetVelByTime(t);
 78    return 0.45 * math.sin(xy_angle)*vt;
 79 end
 80 
 81 -- 定義更新粒子后的全局變量
 82 new_life = 0;
 83 new_xpos = 0;
 84 new_ypos = 0;
 85 new_zpos = 0;
 86 new_xvel = 1;
 87 new_yvel = 1;
 88 new_zvel = 1;
 89  
 90 -- 更新粒子狀態
 91 function UpdateParticles(life,xpos,ypos,zpos,xvel,yvel,zvel,dt)
 92     -- 修正粒子生命 
 93     new_life = life - dt * (1.0 / particle_life);
 94     -- 修正粒子速度 
 95     new_zvel = zvel - gravity  *dt;
 96     new_xpos = xpos + xvel*dt;
 97     new_ypos = ypos + yvel*dt;
 98     new_zpos = zpos + new_zvel*dt;  
 99     if new_zvel < 0.0 then
100         if new_xpos*new_xpos + new_ypos*new_ypos < particle_r and new_zpos < particle_pos_z + particle_size/2 then
101             new_zvel = -friction * new_zvel;
102             new_zpos  = particle_pos_z + particle_size/2 + friction * (particle_pos_z + particle_size/2 - new_zpos);
103         -- 當粒子碰撞到地面應該跳起來 
104         elseif new_zpos < particle_size/2 then
105            new_zvel = -friction * new_zvel;
106            new_zpos  = particle_size/2 + friction * (particle_size/2 - new_zpos);
107         end
108     end         
109 end

cppblog居然沒有lua的代碼高亮...

然后其關聯的c++代碼如下:
  1 
  2 #include <GEngine/Main.hpp>
  3 #include <luaplus/luaplus.h>
  4 
  5 #define WIN_WIDTH  640
  6 #define WIN_HEIGHT 480
  7 
  8 //! 粒子紋理 
  9 static const unsigned char particle_texture[] = 
 10 {
 11     0x000x000x000x000x000x000x000x00,
 12     0x000x000x110x220x220x110x000x00,
 13     0x000x110x330x880x770x330x110x00,
 14     0x000x220x880xff0xee0x770x220x00,
 15     0x000x220x770xee0xff0x880x220x00,
 16     0x000x110x330x770x880x330x110x00,
 17     0x000x000x110x330x220x110x000x00,
 18     0x000x000x000x000x000x000x000x00
 19 };
 20  
 21 //! 粒子紋理大小  
 22 #define P_TEX_WIDTH  8    
 23 #define P_TEX_HEIGHT 8
 24  
 25 ////////////////////////////////////////////////////////////
 26 /// 給出一個初始化粒子的方法 
 27 ////////////////////////////////////////////////////////////
 28 void G_CALL InitParticle(core::Particle* p,float t);
 29 
 30 ////////////////////////////////////////////////////////////
 31 /// 更新粒子函數 
 32 ////////////////////////////////////////////////////////////
 33 void G_CALL UpdateParticle(core::Particle* p,float time);
 34 
 35 ////////////////////////////////////////////////////////////
 36 /// 場景旋轉和偏移 
 37 //////////////////////////////////////////////////////////// 
 38 float TransForm(double t);
 39  
 40 ////////////////////////////////////////////////////////////
 41 /// 構造紋理 
 42 ////////////////////////////////////////////////////////////  
 43 void BuildTexture(GLuint& texture_id);
 44 
 45 ////////////////////////////////////////////////////////////
 46 /// 渲染場景 
 47 //////////////////////////////////////////////////////////// 
 48 void RenderScene(); 
 49 
 50 core::Device* device = NULL; 
 51 libmath::TriTable* table = NULL;  
 52 
 53 LuaPlus::LuaStateOwner *state = NULL; 
 54   
 55 ////////////////////////////////////////////////////////////
 56 /// 初始化luaplus  
 57 ////////////////////////////////////////////////////////////     
 58 void InitLua(const char* lua)
 59 {    
 60     state = new  LuaPlus::LuaStateOwner;
 61     // 載入Lua腳本
 62     (*state)->DoFile(lua);  
 63     LuaPlus::LuaFunction<void> initrand(*state,"InitRand");
 64     initrand();  
 65 }  
 66 
 67 void DeinitLua()
 68 {
 69     delete state; 
 70 
 71 
 72 ////////////////////////////////////////////////////////////
 73 /// 從腳本載入粒子描述數據 
 74 //////////////////////////////////////////////////////////// 
 75 void LoadData(core::ParticleSystemDesc &desc); 
 76  
 77 int main(int argc, char **argv)
 78 {
 79     InitLua("particle.lua");
 80     int        i;
 81     double     t0, t;
 82     
 83     core::VideoMode mode;
 84     mode.width = WIN_WIDTH;
 85     mode.height = WIN_HEIGHT; 
 86     
 87     device = core::InitDevice("蓋莫引擎粒子系統",false,mode); 
 88     table = device->GetTriTable();
 89  
 90     core::ParticleSystemDesc desc;
 91     
 92     GLuint texture_id;
 93     BuildTexture(texture_id);
 94     desc.texture_id = texture_id;    
 95     desc.init_fn = &InitParticle;
 96     desc.update_fn = &UpdateParticle;
 97     LoadData(desc);
 98     core::ParticleSystem* ps = device->GetParticleSystem(desc); 
 99  
100     t0 = device->GetTime();
101     BEGIN_LOOP(device)
102         t = device->GetTime() - t0;
103         RenderScene();
104         float dt = TransForm(t);
105         ps->Render(); 
106     END_LOOP(device)
107     
108     device->Close();
109     device->Drop();
110     
111     DeinitLua();
112     return 0;
113 }
114  
115 void BuildTexture(GLuint& texture_id)
116 {
117     glGenTextures( 1&texture_id );
118     glBindTexture( GL_TEXTURE_2D, texture_id);
119     glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
120     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
121     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
122     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
123     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
124     glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, P_TEX_WIDTH, P_TEX_HEIGHT,
125                  0, GL_LUMINANCE, GL_UNSIGNED_BYTE, particle_texture);  
126 }
127 
128 ////////////////////////////////////////////////////////////
129 /// 場景旋轉和偏移 
130 //////////////////////////////////////////////////////////// 
131 float TransForm(double t)
132 {
133     double xpos, ypos, zpos, angle_x, angle_y, angle_z;
134     static double t_old = 0.0;
135     float  dt = (float)(t-t_old);
136     t_old = t;
137  
138     angle_x = 90.0 - 10.0;
139     angle_y = 10.0 * sin( 0.3 * t );
140     angle_z = 10.0 * t;
141     glRotated( -angle_x, 1.00.00.0 );
142     glRotated( -angle_y, 0.01.00.0 );
143     glRotated( -angle_z, 0.00.01.0 );
144  
145     xpos =  15.0 * sin( (M_PI/180.0* angle_z ) +
146              2.0 * sin( (M_PI/180.0* 3.1 * t );
147     ypos = -15.0 * cos( (M_PI/180.0* angle_z ) +
148              2.0 * cos( (M_PI/180.0* 2.9 * t );
149     zpos = 4.0 + 2.0 * cos( (M_PI/180.0* 4.9 * t );
150     glTranslated( -xpos, -ypos, -zpos );
151     return dt; 
152 }
153 
154 void RenderScene()
155 {
156     glViewport( 00, WIN_WIDTH,WIN_HEIGHT);
157     glClearColor( 0.1f0.1f0.1f1.0f );
158     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
159     glMatrixMode( GL_PROJECTION );
160     glLoadIdentity();
161     gluPerspective(65.0640.0/480.01.060.0 );
162     glMatrixMode( GL_MODELVIEW );
163     glLoadIdentity();
164 }
165 
166 ////////////////////////////////////////////////////////////
167 /// 給出一個初始化粒子的方法(t為粒子系統啟動時間(單位:秒)) 
168 ////////////////////////////////////////////////////////////
169 void G_CALL InitParticle(core::Particle* p,float t)
170 {
171     //! 初始化粒子位置位置
172     float xpos = (*state)->GetGlobal("particle_pos_x").GetFloat(); 
173     float ypos = (*state)->GetGlobal("particle_pos_y").GetFloat(); 
174     float zpos = (*state)->GetGlobal("particle_pos_z").GetFloat();
175     p->position = Vector3f(xpos,ypos,zpos); 
176     
177     //! 初始化粒子顏色 
178     LuaPlus::LuaFunction<float> red(*state,"InitColorRed");
179     LuaPlus::LuaFunction<float> green(*state,"InitColorGreen");
180     LuaPlus::LuaFunction<float> blue(*state,"InitColorBlue");
181     p->color.red = red(t);
182     p->color.green = green(t);
183     p->color.blue = blue(t);
184     
185     //! 初始化粒子初始速度 
186     LuaPlus::LuaFunction<float> xvel(*state,"InitXVel");
187     LuaPlus::LuaFunction<float> yvel(*state,"InitYVel"); 
188     LuaPlus::LuaFunction<float> zvel(*state,"InitZVel");    
189     p->velocity = Vector3f(xvel(t),yvel(t),zvel(t));
190 }
191 
192 ////////////////////////////////////////////////////////////
193 /// 更新粒子函數 
194 ////////////////////////////////////////////////////////////
195 void G_CALL UpdateParticle(core::Particle* p,float time)
196 {
197     LuaPlus::LuaFunction<void> update_fn(*state,"UpdateParticles");  
198     float life = p->life;
199     float xpos = p->position.x;
200     float ypos = p->position.y;
201     float zpos = p->position.z;
202     float xvel = p->velocity.x;
203     float yvel = p->velocity.y;
204     float zvel = p->velocity.z;
205     update_fn(life,xpos,ypos,zpos,xvel,yvel,zvel,time); 
206     
207     //! 獲取粒子的更新后數據 
208     p->life = (*state)->GetGlobal("new_life").GetFloat();  
209     p->position.x = (*state)->GetGlobal("new_xpos").GetFloat(); 
210     p->position.y = (*state)->GetGlobal("new_ypos").GetFloat(); 
211     p->position.z = (*state)->GetGlobal("new_zpos").GetFloat(); 
212     p->velocity.x = xvel; 
213     p->velocity.y = yvel;  
214     p->velocity.z = (*state)->GetGlobal("new_zvel").GetFloat();  
215 
216 
217 ////////////////////////////////////////////////////////////
218 /// 從腳本載入粒子描述數據 
219 //////////////////////////////////////////////////////////// 
220 void LoadData(core::ParticleSystemDesc &desc)
221 {
222     desc.batch_particles = (*state)->GetGlobal("batch_particles").GetInteger();
223     desc.particle_size = (*state)->GetGlobal("particle_size").GetFloat(); 
224     desc.life_span = (*state)->GetGlobal("particle_life").GetFloat(); 
225     int max_particles = (*state)->GetGlobal("max_particles").GetInteger(); 
226     desc.particle_number = max_particles;     
227 }
228 
對應的貼圖如下:

不過剛開始做的時候寫lua的時候有點問題其結果變成了下圖,看來要熟悉Lua只有多多練習啊

那么下一步要做的就是把lua集成進引擎中了
posted on 2010-02-24 19:43 ccsdu2009 閱讀(2193) 評論(1)  編輯 收藏 引用 所屬分類: Game引擎
Comments
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久国内精品视频| 亚洲欧洲日韩在线| 欧美日本免费| 欧美激情免费观看| 韩国av一区| 亚洲国内高清视频| 久久国产精品久久久久久久久久 | 国产精品久久国产三级国电话系列| 欧美激情欧美狂野欧美精品| 精品91在线| 欧美综合77777色婷婷| 久久久国产成人精品| 国产精品夜色7777狼人| 亚洲视频axxx| 亚洲欧美激情四射在线日 | 久久福利一区| 国产欧美一区二区精品仙草咪 | 欧美aⅴ一区二区三区视频| 久久色在线观看| 狠狠狠色丁香婷婷综合激情| 欧美一区二区成人| 久久婷婷亚洲| 在线观看日韩| 欧美freesex8一10精品| 欧美国产日产韩国视频| 亚洲国产一二三| 欧美成人一区二区三区片免费| 免费观看不卡av| 亚洲电影一级黄| 欧美不卡一卡二卡免费版| 亚洲精品一区中文| 亚洲一区二区三区欧美| 国产乱子伦一区二区三区国色天香| 亚洲尤物影院| 久久中文在线| 亚洲精品一区在线观看| 欧美色欧美亚洲另类七区| 亚洲视频视频在线| 久久精彩免费视频| 亚洲国产日韩欧美综合久久| 欧美日韩大片一区二区三区| 亚洲一区国产| 久久一区精品| 一区二区av在线| 国产噜噜噜噜噜久久久久久久久| 久久国产精品久久久久久久久久 | 亚洲精品色图| 午夜欧美精品久久久久久久| 国产主播一区二区三区| 免费久久精品视频| 亚洲永久免费av| 亚洲电影av| 午夜精品久久久久久| 一区二区三区在线视频观看| 欧美二区在线| 性做久久久久久| 亚洲国产另类精品专区| 欧美国产日本高清在线| 亚洲一区二区三区午夜| 欧美激情国产日韩精品一区18| 亚洲一区二区精品在线观看| 在线免费观看成人网| 欧美午夜美女看片| 免费成人你懂的| 亚洲欧美在线高清| 亚洲美女毛片| 欧美91视频| 欧美一级二区| 中文一区二区在线观看| 伊人精品在线| 国产伦精品一区二区三区在线观看 | 欧美电影在线免费观看网站| 午夜天堂精品久久久久| 亚洲精品乱码久久久久久黑人| 国产日韩精品视频一区| 欧美日韩中文字幕精品| 猫咪成人在线观看| 久久精品官网| 午夜精品一区二区三区在线| 一本色道久久88综合亚洲精品ⅰ | 麻豆国产va免费精品高清在线| 亚洲欧美国产高清| 一区二区三区四区国产精品| 91久久久久| 欧美韩日一区二区| 免费视频一区| 久久蜜桃av一区精品变态类天堂| 亚洲影院在线观看| 中文亚洲免费| 亚洲小说春色综合另类电影| 亚洲精品日韩在线| 亚洲精品偷拍| 亚洲精品日日夜夜| 亚洲三级免费观看| 亚洲国产日韩精品| 亚洲精品国产欧美| 最新中文字幕一区二区三区| 亚洲国产精品日韩| 亚洲国产日韩欧美在线99| 精品成人免费| 亚洲国产高清一区| 亚洲国产天堂网精品网站| 在线精品国产欧美| 亚洲国产高清在线| 亚洲精品欧美专区| 亚洲精品在线视频| 夜夜嗨av一区二区三区网页| 亚洲美女黄网| 在线一区二区三区四区五区| 一区二区欧美国产| 亚洲综合另类| 久久精品论坛| 老巨人导航500精品| 欧美电影在线免费观看网站| 亚洲国产日韩欧美| 一本色道久久综合亚洲91| 亚洲天堂网在线观看| 亚洲一区二区三区高清不卡| 性久久久久久久久| 久久久亚洲精品一区二区三区 | 激情婷婷久久| 亚洲日本成人| 在线亚洲精品福利网址导航| 亚洲欧美久久久| 久久精品免费看| 亚洲第一区在线| 一区二区三区欧美| 欧美一区二区三区日韩| 久久综合给合久久狠狠色| 欧美日韩成人在线观看| 国产精品视频自拍| 亚洲国产精品久久久| 亚洲网站在线| 蜜月aⅴ免费一区二区三区 | 亚洲国产精品一区二区www在线 | 国产日韩欧美在线播放| 在线精品高清中文字幕| 一区二区三区黄色| 久久天天狠狠| 99亚洲一区二区| 久久av一区二区| 欧美日韩 国产精品| 国产午夜亚洲精品理论片色戒| 亚洲激情成人| 欧美影院在线| 亚洲级视频在线观看免费1级| 亚洲一区二区三区精品在线观看 | 国产无遮挡一区二区三区毛片日本| 亚洲成人资源| 久久av最新网址| 亚洲精品一级| 老司机一区二区三区| 国产精品草莓在线免费观看| 在线观看欧美激情| 亚洲欧美日韩爽爽影院| 亚洲东热激情| 欧美在线日韩精品| 国产精品国产精品国产专区不蜜| 1769国产精品| 久久国产精品亚洲77777| 亚洲欧洲在线视频| 开元免费观看欧美电视剧网站| 国产精品国产馆在线真实露脸| 亚洲三级电影全部在线观看高清| 欧美伊人久久| 亚洲少妇一区| 欧美精品一卡| 亚洲国产精品日韩| 久久久久久久一区二区三区| 99在线精品观看| 欧美乱人伦中文字幕在线| 亚洲第一精品影视| 久久综合影音| 久久se精品一区精品二区| 国产精品亚洲美女av网站| 亚洲小少妇裸体bbw| 亚洲精品一二三| 欧美激情国产精品| 91久久精品国产91性色| 免费永久网站黄欧美| 欧美在线亚洲一区| 国模吧视频一区| 久久久精品动漫| 欧美在线观看网址综合| 国产亚洲欧美中文| 久久本道综合色狠狠五月| 亚洲午夜精品久久| 国产精品久久久久毛片大屁完整版| 亚洲视频中文字幕| 日韩亚洲综合在线| 欧美婷婷六月丁香综合色| 亚洲网站视频| 亚洲视频中文| 国产欧美在线观看| 久久九九久精品国产免费直播| 欧美在线观看www| 亚洲大片免费看| 亚洲区中文字幕| 欧美午夜免费电影| 欧美一区二区三区四区高清|