2020年6月19日 星期五

Hello World_Week17

20200619 虎克定律&讀寫檔案


老師今天教的東西是從這個會動的背景發想出來的



一開始要先畫出一組點跟線



void setup()
{
  size(300,300);
}
void draw()
{
  background(#002966);//背景設為藍色
  stroke(#b7efff);//線&邊框設為淺藍色
  line(100,150,200,150);//從(100,150)畫線到(200,150)
  fill(#b7efff);//把圓形填滿淺藍色
  ellipse(100,150,13,13);//畫圓形
  ellipse(200,150,13,13);//畫圓形
}

--------------------------------------------------------------------------------------------------------------------------

再來要讓線可以移動



void setup()
{
  size(300,300);
}
float x=100,y=150;
void draw()
{
  background(#002966);//背景設為藍色
  stroke(#b7efff);//線&邊框設為淺藍色
  line(x,y,200,150);//從(100,150)畫線到(200,150)
  fill(#b7efff);//把圓形填滿淺藍色
  ellipse(x,y,13,13);//畫圓形
  ellipse(200,150,13,13);//畫圓形
}
void mouseDragged()//滑鼠拖曳時
{
  x=mouseX;//x坐標=滑鼠的x坐標
  y=mouseY;//y坐標=滑鼠的y坐標
}

--------------------------------------------------------------------------------------------------------------------------

再來要讓線能在滑鼠放開後回到原本的長度



void setup()
{
  size(300,300);
}
float x=100,y=150;
void draw()
{
  background(#002966);//背景設為藍色
  stroke(#b7efff);//線&邊框設為淺藍色
  line(x,y,200,150);//從(100,150)畫線到(200,150)
  fill(#b7efff);//把圓形填滿淺藍色
  ellipse(x,y,13,13);//畫圓形
  ellipse(200,150,13,13);//畫圓形
  if(!mousePressed)//滑鼠放開時
  {
    float dx=x-200;//x的變化量
    float dy=y-150;//y的變化量
    float len=sqrt(dx*dx+dy*dy);//sqrt()開根號
    x-=dx*(len-100)/len;//讓線回到原本的長度
    y-=dy*(len-100)/len;//讓線回到原本的長度
  }
}
void mouseDragged()//滑鼠拖曳時
{
  x=mouseX;//x坐標=滑鼠的x坐標
  y=mouseY;//y坐標=滑鼠的y坐標
}

--------------------------------------------------------------------------------------------------------------------------

因為線回去的速度太快了 所以要讓速度變慢(0.1倍)



void setup()
{
  size(300,300);
}
float x=100,y=150;
void draw()
{
  background(#002966);//背景設為藍色
  stroke(#b7efff);//線&邊框設為淺藍色
  line(x,y,200,150);//從(100,150)畫線到(200,150)
  fill(#b7efff);//把圓形填滿淺藍色
  ellipse(x,y,13,13);//畫圓形
  ellipse(200,150,13,13);//畫圓形
  if(!mousePressed)//滑鼠放開時
  {
    float dx=x-200;//x的變化量
    float dy=y-150;//y的變化量
    float len=sqrt(dx*dx+dy*dy);//sqrt()開根號
    x-=dx*(len-100)/len*0.1;//讓線慢慢回到原本的長度
    y-=dy*(len-100)/len*0.1;//讓線慢慢回到原本的長度
  }
}
void mouseDragged()//滑鼠拖曳時
{
  x=mouseX;//x坐標=滑鼠的x坐標
  y=mouseY;//y坐標=滑鼠的y坐標
}

--------------------------------------------------------------------------------------------------------------------------

最後要讓球跟線可以在固定的距離內反覆跳動



void setup()
{
  size(300,300);
}
float x=100,y=150;
float vx=0,vy=0;

void draw()
{
  background(#002966);//背景設為藍色
  stroke(#b7efff);//線&邊框設為淺藍色
  line(x,y,200,150);//從(100,150)畫線到(200,150)
  fill(#b7efff);//把圓形填滿淺藍色
  ellipse(x,y,13,13);//畫圓形
  ellipse(200,150,13,13);//畫圓形
  if(!mousePressed)//滑鼠放開時
  {
    float dx=x-200;//x的變化量
    float dy=y-150;//y的變化量
    float len=sqrt(dx*dx+dy*dy);//sqrt()開根號
    float f=(len-100);//拉力的大小
    dx/=len;//單位長度
    dy/=len;//單位長度
    vx-=f*dx*0.01;//x坐標的速度 彈性係數(0.01)愈大,速度愈快
    vy-=f*dy*0.01;//y坐標的速度 彈性係數(0.01)愈大,速度愈快
    x+=vx;//x坐標以vx的速度移動
    y+=vy;//y坐標以vy的速度移動
  }
}
void mouseDragged()//滑鼠拖曳時
{
  x=mouseX;//x坐標=滑鼠的x坐標
  y=mouseY;//y坐標=滑鼠的y坐標
}

--------------------------------------------------------------------------------------------------------------------------

我們用另一個遊戲的概念再來看一下線移動的觀念



void setup()
{
  size(400,300);
}
float x=100,y=150;
void draw()
{
  background(#002966);//背景設為藍色
  ellipse(x,y,50,50);//畫圓形
  float dx=x-mouseX;//x的變化量
  float dy=y-mouseY;//y的變化量
  float len=sqrt(dx*dx+dy*dy);//sqrt()開根號
  x-=dx*0.1;//x坐標接近
  y-=dy*0.1;//y坐標接近
}

--------------------------------------------------------------------------------------------------------------------------

距離太遠會靠近 但距離太近就會退後



void setup()
{
  size(400,300);
}
float x=100,y=150;
void draw()
{
  background(#002966);//背景設為藍色
  ellipse(x,y,50,50);//畫圓形
  float dx=x-mouseX;//x的變化量
  float dy=y-mouseY;//y的變化量
  float len=sqrt(dx*dx+dy*dy);//sqrt()開根號
  x-=dx*(len-100)/len*0.1;//如果太接近會退後
  y-=dy*(len-100)/len*0.1;//如果太接近會退後
}

--------------------------------------------------------------------------------------------------------------------------

再來老師教了讀取檔案和寫入檔案

我們要把Hello World寫進檔案裡



#include <stdio.h>
int main()
{
    FILE*fout=fopen("my_first_file.txt","w+");
    printf("Hello World");
    fprintf(fout,"Hello World");
}

--------------------------------------------------------------------------------------------------------------------------

執行之後就會多出一個叫做my_first_file的txt檔了



檔案裡面的內容就是我們剛剛寫入的Hello World



再來改成用陣列試試看

我們先輸入一段句子 然後印出來



#include <stdio.h>
char line[1000];
int main()
{
    //FILE*fout=fopen("my_first_file.txt","w+");
    //printf("Hello World");
    //fprintf(fout,"Hello World");
    scanf("%s",line);
    printf("=%s=",line);
}

--------------------------------------------------------------------------------------------------------------------------

再來改成讀取剛剛寫好的檔案 並印出來



#include <stdio.h>
char line[1000];
int main()
{
    //FILE*fout=fopen("my_first_file.txt","w+");
    //printf("Hello World");
    //fprintf(fout,"Hello World");
    FILE*fin=fopen("my_first_file.txt","r");
    fscanf(fin,"%s",line);
    printf("=%s=",line);
}

--------------------------------------------------------------------------------------------------------------------------

心得


終於考完程設會考了!接下來的課就不用一直花時間複習和考試,可以學更多不一樣的東西,老師今天回顧了這學期學過的所有東西,有會飛的氣球、會掉落的石頭、人物彈跳、Different Color、Pacman、Angry Bird、Sprite,還有今天的虎克定律,不知不覺中也做了很多簡易的遊戲,希望之後如果有機會還能學其他的遊戲!

沒有留言:

張貼留言