Welcome to Gravity Falls——融入动画技术的交互应用

一、制作背景

最近沉迷于迪士尼的系列动画《怪诞小镇》,这是一部一看就上瘾,看完就空虚的不同寻常的佳作。旋律简单但是引人入胜的背景音乐,艳丽色彩可爱画风下的诡异童话,看似平凡渺小却让人难以忘怀的角色,还会到来的暑假和再也不会有的续集,让人赞叹之余又不免有些惋惜。

或许有一天,你也会迷失森林,夜晚踏入Uncle Stan的神秘小屋,遇到MabelDipper,一起发现这个小镇里不为人知的秘密······

二、功能操作

程序有四个模块,是四个不同的场景。

场景一是动态的Gravity Falls标题,以及可以交互控制播放/暂停的音乐——动画op《Made Me Realize》。按键“M”控制音乐。

场景二是Bill也想变可爱,在这个场景Bill姥爷会跟随鼠标,点击左键会落下五颜六色的三角,拖曳鼠标也会有对应效果。

场景三是随机游走产生的图案。

场景四是Bill姥爷标志性的三角符号。

场景切换对应按键:

A—场景一;

S—场景二;

D—场景三;

F—场景四

演示视频:


融入动画技术的交互应用

三、模块代码

场景一的音乐插件:

import

ddf.minim.*;

Minim minim;

AudioPlayer player;

场景一动态字体的绘制:

  PFont font = createFont("Phetsarath_OT.ttf",32);

  textFont(font, 200);

  text("Gravity", 80, 180);

  text("Falls", 190, 340);

  float step = 10;

  for (float x = 0; x < width; x+= step) {

    for (float y = 0; y < height; y += step) {

      if (brightness(get((int)x, (int)y)) > 100) {

        sprites.add(new Sprite(new PVector(x, y)));

      }

    }

  }

······

场景二Bill的绘制:

  fill(255,255,0);

  strokeWeight(2);

  triangle(mouseX,-1.732*50+mouseY,-50+mouseX,mouseY,50+mouseX,mouseY);

  fill(0);

  rect(mouseX-5,-1.732*50+mouseY-40,10,40);

  rect(mouseX-4,mouseY-50*0.27*1.732-2,8,4);

  triangle(mouseX,mouseY-50*0.27*1.732,mouseX-50*0.3,mouseY-50*0.27*1.732-6,

  mouseX-50*0.3,mouseY-50*0.27*1.732+6);

  triangle(mouseX,mouseY-50*0.27*1.732,mouseX+50*0.3,mouseY-50*0.27*1.732-6,

  mouseX+50*0.3,mouseY-50*0.27*1.732+6);

  noFill();

  strokeWeight(2);

  //translate(mouseX,(-1.732*50+mouseY)/3);

  arc(mouseX,mouseY-48,32,32,PI*7/6,PI*11/6);

  arc(mouseX,mouseY-64,32,32,PI/6,PI*5/6);

  arc(mouseX,mouseY-55.5,6,10,PI/2,PI*3/2);

  arc(mouseX,mouseY-55.5,6,10,PI*3/2,PI*5/2);

  strokeWeight(1);

  line(mouseX,mouseY-66,mouseX,mouseY-69);

  line(mouseX-6,mouseY-63,mouseX-7,mouseY-69);

  line(mouseX+6,mouseY-63,mouseX+7,mouseY-69);


  line(mouseX,mouseY-48,mouseX,mouseY-45);

  line(mouseX-8,mouseY-50,mouseX-12,mouseY-45);

  line(mouseX+8,mouseY-50,mouseX+12,mouseY-45);


  line(mouseX-18,-1.732*50+mouseY,mouseX+18,-1.732*50+mouseY);

  //1

  line(mouseX-50*0.6,mouseY-50*0.4*1.732,mouseX+50*0.6,mouseY-50*0.4*1.732);

  //2

  line(mouseX-50*0.73,mouseY-50*0.27*1.732,mouseX+50*0.73,mouseY-50*0.27*1.732);

  //3

  line(mouseX-50*0.88,mouseY-50*0.12*1.732,mouseX+50*0.88,mouseY-50*0.12*1.732);


  line(mouseX-50*0.4,mouseY-50*0.4*1.732,mouseX-50*0.4,mouseY-50*0.27*1.732);

  line(mouseX+50*0.4,mouseY-50*0.4*1.732,mouseX+50*0.4,mouseY-50*0.27*1.732);


  line(mouseX-50*0.5,mouseY-50*0.27*1.732,mouseX-50*0.5,mouseY-50*0.12*1.732);

  line(mouseX+50*0.5,mouseY-50*0.27*1.732,mouseX+50*0.5,mouseY-50*0.12*1.732);

  line(mouseX,mouseY-50*0.27*1.732,mouseX,mouseY-50*0.12*1.732);


  line(mouseX-50*0.3,mouseY-50*0.12*1.732,mouseX-50*0.3,mouseY);

  line(mouseX+50*0.3,mouseY-50*0.12*1.732,mouseX+50*0.3,mouseY);


  strokeWeight(3);

  //zuo shou

  arc(mouseX-46,mouseY-33,32,18,PI/6,PI*5/6);

  arc(mouseX-65,mouseY-33,16,12,PI/6,PI*5/6);

  arc(mouseX-64,mouseY-34,12,14,PI*11/6,PI*13/6);

  arc(mouseX-69,mouseY-33,24,26,PI/6,PI/2);

  arc(mouseX-63,mouseY-25,8,20,0,PI/2);

  //you shou

  arc(mouseX+46,mouseY-33,32,18,PI/6,PI*5/6);

  arc(mouseX+65,mouseY-33,16,12,PI/6,PI*5/6);

  arc(mouseX+64,mouseY-34,12,14,PI*5/6,PI*7/6);

  arc(mouseX+69,mouseY-33,24,26,PI/2,PI*5/6);

  arc(mouseX+63,mouseY-25,8,20,PI/2,PI);


  line(mouseX-50*0.4,mouseY,mouseX-50*0.4,mouseY+25);

  arc(mouseX-10,mouseY+25,20,30,PI/2,PI);

  line(mouseX-10,mouseY+42,mouseX-12,mouseY+53);

  line(mouseX+50*0.4,mouseY,mouseX+50*0.4,mouseY+25);

  arc(mouseX+10,mouseY+25,20,30,PI*2,PI*5/2);

  line(mouseX+10,mouseY+42,mouseX+12,mouseY+53);

场景三随机游走:

class Phasor {

  float inc;

  float phase;

  Phasor(float inc) {

    this.inc = inc;

  }

  void update() {

    phase += inc;

    while (phase >= 1.0) {

      phase -= 1.0;

    }

    while (phase < 0) {

      phase += 1.0;

    }

  }

}

class Walker {

  PVector v;

  Walker(float x, float y) {

    v = new PVector(x, y);

  }

  void update() {

    float gauss = p2.phase * random(2);

    v = getVCoordinates(v, gauss, angles[int(random(angles.length))]);

    float offset = width / 4;

    if (v.x >= width + offset) {

      v.x -= width + offset;

    }

    if (v.x < -offset) {

      v.x += width + offset;

    }

    if (v.y >= height + offset) {

      v.y -= height + offset;

    }

    if (v.y < 0) {

      v.y += height + offset;

    }

    float a = getAngleFromCenter(v);

    float d = dist(v.x, v.y, width / 2, height / 2);

    PVector center = new PVector(width / 2, height / 2);

    float rAngle = PI / (float) nReflections;

    noStroke();

    fill(palette.getNorm(p.phase), map(d, 0, width, 64, 12));

    gauss = max(0.5, gauss / 2);

    for (int i = 0; i < nReflections; i++) {

      float thisAngle = a + (TWO_PI / (float) nReflections) * i;

      PVector thisV = getVCoordinates(center, d, thisAngle);

      ellipse(thisV.x, thisV.y, gauss, gauss);

      thisV = getVCoordinates(center, d, PI - thisAngle);

      ellipse(thisV.x, thisV.y, gauss, gauss);

    }

  }

}

······

场景四的噪点:

void noise() {

  noStroke();

  strokeWeight(1);

  for (int i = 0; i < width - 1; i += 5) {

    for (int j = 0; j < height - 1; j += 5) {

      fill(random(0, 255), random(30, 50));

      rect(random(i - 5, i), random(j - 5, j), 1, 1);

    }

  }

  for (int i = 0; i < 5; i++) {

    fill(random(0, 255), 255);

    rect(random(0, width), random(0, height), 2, 2);

  }

}

四、参考资料

1、《代码本色》

2、https://www.openprocessing.org/

五、作业评价

推荐作业一:https://blog.csdn.net/wangyouxu24/article/details/89554177

评价:小球的交互很有创意,很美观,而且和游戏机制结合,游戏过程中还有说明、按钮、文字提示,很完整很成熟,非常有趣。

推荐作业二:https://zhuanlan.zhihu.com/p/64726213

评价:创意非常新颖,界面的简笔画画风很可爱,是一个简单的生态模拟游戏,看到食草动物吃草,食肉动物吃食草动物,非常有趣,可是食草动物的死亡概率太高了OVO,应该给它们一个从食肉动物嘴里逃脱的概率。

推荐作业三:https://zhuanlan.zhihu.com/p/64726213

评价:审美太好了,创意又新颖又可爱又贴近实际,画面很温馨很治愈,很有设计感。拔头发模拟的效果特别好,眼球跟随的细节也好评,我可以玩一年!!!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容