2019-04-30 互动媒体技术作业2

一、题目要求

最近在听funk音乐,感觉真个人都舒服了,些这个作业的时候身体一直在抖,这次要完成的作业是参考《代码本色》教程,运用不少于3个章节的动画技术,实现一个交互应用,将动画技术充分运用于交互过程中;

做了一个小游戏,


整个游戏的玩法就是通过鼠标控制粉色小球移动,小的方块是食物,可以被吃掉,其他的的大球是怪物了,如果他们碰到你就会减分数并且会卡顿,分数显示在左上角

背景是声音的波动,加载了一首bgm,会根据节奏抖动,其实可以使怪物的移动也和音乐结合起来,但是奈何太懒了,暂时就这样了。

其实代码并没有多复杂了,比较复杂的地方是怪物的成长是根据基因模拟的,每个怪物一开始都会随机初始的基因,根据基因来绘制大小,有一定几率分裂和随机产生,然后个体生命会随着时间衰减,当他们碰到玩家控制的小球后就会重新变得满生命值


二、实践内容

通过processing对图像进行处理

homework——主要运行脚本,主要运行world和bgm的可视化

 

bloop——模拟怪物的存在,并且写移动,复制,变异和更新的函数,写吃食物和玩家后变大和长生命的函数


DNA——主要写怪物的基因函数,其实这整个就是一个遗传变异的模拟了,以01序列来模拟基因


player——写玩家控制的函数


WORLD——写玩家食物和怪物生成的函数


三、源代码

homework——主要运行脚本,主要运行world和bgm的可视化

import processing.sound.*;

// Declare the sound source and Waveform analyzer variables

SoundFile sample;

Waveform waveform;

// Define how many samples of the Waveform you want to be able to read at once

int samples = 100;

World world;

void setup() {

    size(640, 360);

  // Load and play a soundfile and loop it.

  sample = new SoundFile(this, "beat.aiff");

  sample.loop();

  // Create the Waveform analyzer and connect the playing soundfile to it.

  waveform = new Waveform(this, samples);

  waveform.input(sample);


  // World starts with 20 creatures

  // and 20 pieces of food

  world = new World(20);

  smooth();

}

void draw() {

  background(30, 30, 240);


    // Set background color, noFill and stroke style

  stroke(255);

  strokeWeight(2);

  noFill();

  // Perform the analysis

  waveform.analyze();


  beginShape();

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

    // Draw current data of the waveform

    // Each sample in the data array is between -1 and +1

    vertex(

      map(i, 0, samples, 0, width),

      map(waveform.data[i], -1, 1, 0, height)

    );

  }

  endShape();


  String time = "Sorce is " + millis()/100; 

  pushMatrix(); 

  translate(0, 0, 0); 

  textSize(32);

  stroke(255, 255, 0); 

  text(time, 40, 80); 

  noStroke(); 

  popMatrix();

  world.run();

}

bloop——模拟怪物的存在,并且写移动,复制,变异和更新的函数,写吃食物和玩家后变大和长生命的函数

class Bloop {

  PVector position; // position

  DNA dna;          // DNA

  float health;    // Life timer

  float xoff;      // For perlin noise

  float yoff;

  // DNA will determine size and maxspeed

  float r;

  float maxspeed;

  // Create a "bloop" creature

  Bloop(PVector l, DNA dna_) {

    position = l.get();

    health = 200;

    xoff = random(1000);

    yoff = random(1000);

    dna = dna_;

    // Gene 0 determines maxspeed and r

    // The bigger the bloop, the slower it is

    maxspeed = map(dna.genes[0], 0, 1, 15, 5);//对速度的映射

    r = map(dna.genes[0], 0, 1, 20, 50);//半径映射,都跟基因序列有关

  }

  void run() {

    update();

    borders();

    display();

  }

  // A bloop can find food and eat it

  void eat(Food f, Player player) {

    ArrayList<PVector> food = f.getFood();

    // Are we touching any food objects?

    for (int i = food.size()-1; i >= 0; i--) {

      PVector foodposition = food.get(i);

      float d = PVector.dist(position, foodposition);

      // If we are, juice up our strength!

      if (d < r/2) {

        health += 100;

        food.remove(i);

      }

    }

    PVector playerposition=player.get();

    float d = PVector.dist(position, playerposition);

    // If we are, juice up our strength!

    if (d < (r+player.getr())/2) {

      if (player.getr()<r) {

        health += 100;

        println("die");

        delay(100);

      } else {

        player.health+=100;

        health=0;

      }

    }

  }

  // At any moment there is a teeny, tiny chance a bloop will reproduce

  Bloop reproduce() {

    // asexual reproduction

    if (random(1) < 0.0005) {

      // Child is exact copy of single parent

      DNA childDNA = dna.copy();

      // Child DNA can mutate

      childDNA.mutate(0.01);

      return new Bloop(position, childDNA);

    } else {

      return null;

    }

  }

  // Method to update position

  void update() {

    // Simple movement based on perlin noise

    float vx = map(noise(xoff), 0, 1, -maxspeed, maxspeed);

    float vy = map(noise(yoff), 0, 1, -maxspeed, maxspeed);

    PVector velocity = new PVector(vx, vy);

    xoff += 0.01;

    yoff += 0.01;

    position.add(velocity);

    // Death always looming

    health -= 0.2;

  }

  // Wraparound

  void borders() {

    if (position.x < -r) position.x = width+r;

    if (position.y < -r) position.y = height+r;

    if (position.x > width+r) position.x = -r;

    if (position.y > height+r) position.y = -r;

  }

  // Method to display

  void display() {

    ellipseMode(CENTER);

    stroke(0, health);

    fill(0,240,250, health);

    ellipse(position.x, position.y, r, r);

  }

  // Death

  boolean dead() {

    if (health < 0.0) {

      return true;

    } else {

      return false;

    }

  }

}

DNA——主要写怪物的基因函数,其实这整个就是一个遗传变异的模拟了,以01序列来模拟基因

class DNA {

  // The genetic sequence

  float[] genes;


  // Constructor (makes a random DNA)

  DNA() {

    // DNA is random floating point values between 0 and 1 (!!)

    genes = new float[1];

    for (int i = 0; i < genes.length; i++) {

      genes[i] = random(0,1);

    }

  }


  DNA(float[] newgenes) {

    genes = newgenes;

  }


  DNA copy() {

    float[] newgenes = new float[genes.length];

    //arraycopy(genes,newgenes);

    // JS mode not supporting arraycopy

    for (int i = 0; i < newgenes.length; i++) {

      newgenes[i] = genes[i];

    }


    return new DNA(newgenes);

  }


  // Based on a mutation probability, picks a new random character in array spots

  void mutate(float m) {

    for (int i = 0; i < genes.length; i++) {

      if (random(1) < m) {

        genes[i] = random(0,1);

      }

    }

  }

}

food——写食物生成和被吃掉的函数

class Food {

  ArrayList<PVector> food;

  Food(int num) {

    // Start with some food

    food = new ArrayList();

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

      food.add(new PVector(random(width),random(height)));

    }

  }


  // Add some food at a position

  void add(PVector l) {

    food.add(l.get());

  }


  // Display the food

  void run() {

    for (PVector f : food) {

      rectMode(CENTER);

      stroke(0);

      fill(175);

      rect(f.x,f.y,8,8);

    }


    // There's a small chance food will appear randomly

    if (random(1) < 0.01) {

      food.add(new PVector(random(width),random(height)));

    }

  }


  // Return the list of food

  ArrayList getFood() {

    return food;

  }

}

player——写玩家控制的函数

class Player {

  float r=10;

  public PVector pos;

  float maxspeed=1;

  float health=200;

  Player(float xpos_, float ypos_) {

    pos= new PVector(xpos_, ypos_);

  }

  void run() {

    update();

    display();

  }


  PVector get(){

    return pos;

  }


  float getr(){

    return  r+health/100;

  }

  void update() {

    // Simple movement based on perlin noise

    float vx=0,vy=0;

    if (keyPressed && (key == CODED)) { // If it’s a coded key

      if (keyCode == LEFT) { // If it’s the left arrow

        vx=-maxspeed;

      } else if (keyCode == RIGHT) { // If it’s the right arrow

        vx=maxspeed;

      }

      if (keyCode == UP) { // If it’s the left arrow

        vy=-maxspeed;

      } else if (keyCode == DOWN) { // If it’s the right arrow

        vy=maxspeed;

      }

    }

    PVector velocity = new PVector(vx, vy);

    pos.add(velocity);

    pos.x=mouseX;

    pos.y=mouseY;

    // Death always looming

    health -= 0.2;

  }

  void eat(Food f) {

    ArrayList<PVector> food = f.getFood();

    // Are we touching any food objects?

    for (int i = food.size()-1; i >= 0; i--) {

      PVector foodposition = food.get(i);

      float d = PVector.dist(pos, foodposition);

      // If we are, juice up our strength!

      if (d < getr()/2) {

        health += 200;

        food.remove(i);

      }

    }


  }

  void display() {

    ellipseMode(CENTER);

    stroke(2);

    fill(250, 0, 250);

    ellipse(mouseX, mouseY, r+health/100, r+health/100);

  }

}

WORLD——写玩家食物和怪物生成的函数

// Has bloops and food

class World {

  ArrayList<Bloop> bloops;    // An arraylist for all the creatures

  Food food;              //食物

  Player player;

  // Constructor

  World(int num) {

    // Start with initial food and creatures

    player =new Player(width/2,height/2);

    food = new Food(num);

    bloops = new ArrayList<Bloop>();              // Initialize the arraylist

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

      PVector l = new PVector(random(width),random(height));

      DNA dna = new DNA();

      bloops.add(new Bloop(l,dna));

    }

  }

  // Make a new creature

  void born(float x, float y) {

    PVector l = new PVector(x,y);

    DNA dna = new DNA();

    bloops.add(new Bloop(l,dna));

  }

  // Run the world

  void run() {

    // Deal with food

    food.run();

    player.run();

    player.eat(food);

    // Cycle through the ArrayList backwards b/c we are deleting

    for (int i = bloops.size()-1; i >= 0; i--) {

      // All bloops run and eat

      Bloop b = bloops.get(i);

      b.run();

      b.eat(food,player);

      // If it's dead, kill it and make food

      if (b.dead()) {

        bloops.remove(i);

        food.add(b.position);

      }

      // Perhaps this bloop would like to make a baby?

      Bloop child = b.reproduce();

      if (child != null) bloops.add(child);

    }

  }

}

我把文件分享在了https://github.com/YonYuan/Homework2这里,需要的请自取!!!

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

推荐阅读更多精彩内容