代码本色应用demo,互动媒体课程作业
这个游戏是一个变种的贪吃蛇一类游戏,是一群围绕鼠标旋转的粒子,需要控制鼠标让他们获取跟多同类和躲避敌人,使用到了代码本色的0,1,2,3章的随机,向量,力和三角函数。
开发过程
简单的就不赘述了,主要讲开发中特别的地方,首先没有使用background,而是使用
fill(2,2,2,15);
rect(0,0,width,height);
这样就实现了轨迹的效果。
开始菜单中
if(mouseX>100 && mouseX<width-200 && mouseY>height/2+20 && mouseY<height/2+75){
textSize(45);
text("START",width/2-10,height/2+20);
}
else{
textSize(40);
text("START",width/2-10,height/2+20);
}
这段代码的作用是当鼠标移动到start上面的时候,字母会变大,提示这个是可以点击的
还有开始菜单的背景
void lizivertical(){
pushMatrix();
for(int i = 0;i<width;i=i+2){
moriangle[i] += doriangle[i];
v[i].lerp(i, sin(moriangle[i]*0.1)*(suijir[i]+height),0,easing[i]);
fill(c[i]);
ellipse(v[i].x, v[i].y, pointr[i],pointr[i]);
}
popMatrix();
}
接下来进入游戏之后,主要分为三种粒子。第一种是一开始就出现,围绕鼠标运动的,点击鼠标会聚集起来的部分,鼠标按下判断和显示
void mousePressed(){
mv = false;
}
void mouseReleased(){
mv = true;
}
if(mv){
fill(#33CCFF);
text("Spread",200,0);没有按下显示分散
}
if(!mv){
fill(#FF6699);
text("Gather",200,0);如果按下则显示聚集
}
粒子系统
void lizixuanzhuan(float locationx,float locationy){
pushMatrix();
if(mv){
eatr = r;
for(int i = 0;i<num-1;i++){
moriangle[i] += doriangle[i];
v[i].lerp(locationx+cos(suijix[i]*moriangle[i])*(suijir[i]+r*suijix[i]), locationy+sin(suijix[i]*moriangle[i])*(suijir[i]+r*suijix[i]),0,easing[i]);
fill(c[i]);
ellipse(v[i].x, v[i].y, pointr[i],pointr[i]);
}
}
if(!mv){
eatr = ranger;
for(int i = 0;i<num-1;i++){
moriangle[i] += doriangle[i];
v[i].lerp(locationx+cos(moriangle[i])*suijir[i], locationy+sin(moriangle[i])*suijir[i],0,easing[i]);
fill(c[i]);
ellipse(v[i].x, v[i].y, pointr[i],pointr[i]);
}
}
popMatrix();
}
这段使用三角函数让粒子随时间做圆周旋转,填色采用随机填色,当鼠标按下的时候,旋转的半径被限制到5以内。
第二部分是同类单元
void friendchuxian(){
pushMatrix();
friendnum = 10;
friendr = 10;
if(distance(chuxianx[k],chuxiany[k],mouseX,mouseY) > eatr+friendr){
for(int i = 0;i<friendnum+19;i++){
moriangle[i] += doriangle[i];
vv[i].lerp(chuxianx[k]+cos(moriangle[i])*(suijir[i]+friendr), chuxiany[k]+sin(moriangle[i])*(suijir[i]+friendr),0,easing[i]);
fill(c[i+k*friendnum]);
ellipse(vv[i].x, vv[i].y, pointr[i],pointr[i]);
}
}
if(distance(chuxianx[k],chuxiany[k],mouseX,mouseY) <= eatr+friendr){
k++;
r+=2;
num+=50;
}
popMatrix();
}
基本结构和主体一样,当和主体碰撞的时候,主体半径增加,计数增加
最后一种是敌人
class Mover {
PVector position;
PVector velocity;
PVector acceleration;
float mass;
Mover(float m, float x, float y) {
mass = m;
position = new PVector(x, y);
velocity = new PVector(1, 0);
acceleration = new PVector(0, 0);
}
void applyForce(PVector force) {
PVector f = PVector.div(force, mass);
acceleration.add(f);
}
void update() {
velocity.add(acceleration);
position.add(velocity);
acceleration.mult(0);
}
void display() {
fill(255,255,255);
rect(position.x, position.y, mass*3+2, mass*3+2);
if(num>50){
if(distance(position.x,position.y,mouseX,mouseY) <= eatr+5){
r-=0.1;
num-=2.5;
}
}
}
}
敌人跟随控制
class Attractor {
float mass;
float G;
PVector position;
PVector dragOffset;
Attractor() {
position = new PVector(width/2,height/2);
mass = 20;
G = 1;
dragOffset = new PVector(0.0,0.0);
}
PVector attract(Mover m) {
PVector force = PVector.sub(position,m.position);
float d = force.mag();
d = constrain(d,5.0,25.0);
force.normalize();
float strength = (G * mass * m.mass) / (d * d);
force.mult(strength);
return force;
}
void drag() {
position.x = mouseX + dragOffset.x;
position.y = mouseY + dragOffset.y;
}
}