2022年11月21日 星期一

TC*(˙Ⱉ˙ฅ)​-week12

網路連線的寫法

程式素描簿(Sketch)-->使用函式庫(Library)-->Network
這時候就會顯示出一行 import processing.net.*;  的程式碼



Sever端:week12_2_2_network_drawing_sever

import processing.net.*;

Server myServer;

void setup(){
  size(200,200);
  myServer = new Server(this,5204);
}
void draw(){
  //myServer.write("Hello");
}
void mouseDragged(){//拖動滑鼠時
  myServer.write(mouseX);
  myServer.write(mouseY);
}

Client端:week12_2_2_network_drawing_client

import processing.net.*;

Client myClient;

void setup(){
  size(200,200);
  myClient = new Client(this,"127.0.0.1",5204);
  background(#FFFFF2);
}

void draw(){
  if(myClient.available()>0){
    //String line = myClient.readString();
    //fill(0);
    //text(line,100,100);
    int x = myClient.read();
    int y = myClient.read();
    ellipse(x,y,3,3);
  }
}




射擊相關程式寫法
1.射擊方向的旋轉
2.碰撞的入射角等於反射角


//撞球:要使用貓狗大戰step01射擊方向的旋轉
void setup(){
  size(600,400);
}
float angle1=0,angle2=-PI;
void draw(){
  background(#218370);
  fill(255);//白色背景
  rect(50,50,500,300);//最外圍的框線
  fill(255,0,0);//紅色
  rect(60,60,160-20,280);//紅色長方形的框線
  ellipse(100,200,50,50);//畫出紅方中心的圓球
  line(100,200,100+40*cos(angle1),200+40*sin(angle1));//紅方發射線
  if(mousePressed && mouseButton == LEFT)angle1 += 0;//當點擊左鍵就不旋轉
  else angle1 += 0.05;//如果沒有點擊左鍵發射球,發射線旋轉角度
  if(bulletFly){//紅方發射的球
    fill(255,80,80);
    ellipse(bulletX,bulletY,10,10);//座標及球的大小
    bulletX+=bulletVX;
    bulletY+=bulletVY;
  }
  
  
  fill(0,255,0);//綠色背景
  rect(540-(160-20),60,160-20,280);//綠方的框線
  ellipse(500,200,50,50);//畫出綠方中心的球
  line(500,200,500+40*cos(angle2),200+40*sin(angle2));//綠方的發射線
  if(mousePressed && mouseButton == LEFT)angle2 += 0;//當點擊左鍵就不旋轉
  else angle2 += 0.05;//若沒有點擊左鍵,發射線的旋轉角度
  if(bulletFly2){//這邊概念跟紅球發射一樣
    fill(80,255,80);
    ellipse(bulletX2,bulletY2,10,10);
    bulletX2+=bulletVX2;
    bulletY2+=bulletVY2;
  }
}
float bulletX,bulletY,bulletVX,bulletVY;//設定紅方子彈的速度
boolean bulletFly=false;//預設子彈不是起飛的狀態
float bulletX2,bulletY2,bulletVX2,bulletVY2;//設定綠方子彈的速度
boolean bulletFly2=false;//預設子彈不是起飛的狀態
void mousePressed(){//設定按鍵
  if(mouseButton==LEFT){//滑鼠左鍵
    bulletX=100;//紅球x座標
    bulletY=200;//紅球y座標
    bulletVX = cos(angle1);//紅球x方向的速度
    bulletVY = sin(angle1);//紅球y方向的速度
    bulletFly=true;//子彈會飛
  }else if(mouseButton == RIGHT){//滑鼠右鍵
    bulletX2=500;//紅球x座標
    bulletY2=200;//紅球y座標
    bulletVX2 = cos(angle1);//綠球x方向的速度
    bulletVY2 = sin(angle1);//綠球y方向的速度
    bulletFly2=true;//子彈會飛
  }
}

對應程式整理:
背景顏色
background(#218370);是墨綠色底色

白色框
fill(255);//白色背景
rect(50,50,500,300);//最外圍的框線

紅色框與紅球
fill(255,0,0);//紅色
rect(60,60,160-20,280);//紅色長方形的框線
ellipse(100,200,50,50);//畫出紅方中心的圓球,(100,200)是座標位置,50,50是球的大小

綠色框與綠球,概念跟紅色球相同
fill(0,255,0);//綠色背景
rect(540-(160-20),60,160-20,280);//綠方的框線
ellipse(500,200,50,50);//畫出綠方中心的球

發射線與旋轉角度
line(100,200,100+40*cos(angle1),200+40*sin(angle1));//紅方發射線
line(500,200,500+40*cos(angle2),200+40*sin(angle2));//綠方發射線

點擊對應按鍵會讓球飛出去(以紅球舉例)
if(mousePressed && mouseButton == LEFT)angle1 += 0;//當點擊左鍵就不旋轉
else angle1 += 0.05;//如果沒有點擊左鍵發射球,發射線旋轉角度
void mousePressed(){//設定按鍵
  if(mouseButton==LEFT){//滑鼠左鍵
    bulletX=100;//紅球x座標
    bulletY=200;//紅球y座標
    bulletVX = cos(angle1);//紅球x方向的速度
    bulletVY = sin(angle1);//紅球y方向的速度
    bulletFly=true;//子彈會飛
  }
}

發射球(子彈)的射擊速度(以紅球舉例)
if(bulletFly){//紅方發射的球
    fill(255,80,80);
    ellipse(bulletX,bulletY,10,10);//座標及球的大小
    bulletX+=bulletVX;
    bulletY+=bulletVY;
  }

可以看見做出來的效果如圖:
當點擊左鍵,紅色方的砲管會停下來並發射紅色的砲彈
當點擊右鍵,綠色方的砲管會停下來並發射綠色的砲彈








沒有留言:

張貼留言