xxxxxxxxxx
let balls;
let ball;
//シーン・場面設定用
let bamenn = 0;
let ikkai = 0;
let siinn = 0;
//基礎配色
let mainLight;
let mainShadow;
let thirdPartyLight;
let playerCharacterCollar;
//操作系
//WASDでの移動用
let wasdX, wasdY;
let isMovingLeft, isMovingRight, isMovingUp, isMovingDown;
let idouX, idouY;
let defaultMoveSpeed, moveSpeed, pma;
let TP = [];
//マウス操作
let mouseAngle, mouseAngleTracking
//カメラ操作
let ts=0.1;
//頂点確認
let verticesCheck = false;
//ライト制御用
let FPLColor = mainLight;
let FPLSP;
let TPLSP = [];
let lightStatus = true;
let triangleVertices = [];
let rectVertices = [];
let shadowVertices = [];
let FPLVertices = [];
let playerCharacterVertices = [];
let rectReady = false;
let objsReady = false;
let shadowsReady = false;
/////////////////////////////////
//p5.play系仮実装
//////////////////////////////////
let playerVisuar, playerCollider; //自機の見た目,当たり判定
let playerLight;
let PP;
let playerAngle;
let pmouseAngle;
let angleTracking;
let obj1, obj2;
let shadows;
let objDate = [];
////////////////////////////////
//削除予定
////////////////////////////////
let sprDx0, sprDy0;
let bx0, bx1, bx2, bx3, by0, by1, by2, by3;
let trect;
function preload() {}
function setup() {
new Canvas(windowWidth, windowHeight);
// translate(-width/2,-height/2)
//初期背景は動作不良確認用
background(100);
colorMode(HSB, 360, 100, 100, 100);
//角度をradianからdegreeに
angleMode(DEGREES);
print(bamenn);
//色
mainLight = "#FFFFFF";
mainShadow = "#000000";
playerCharacterCollar = mainLight;
// balls = new Group();
// balls.color = 'yellow';
// balls.y = 200;
// balls.x = 200;
// balls.diameter = 100;
// // 画面の真ん中にスプライトを一つ作る
// ball = new balls.Sprite();
// ball.x = -300;
// ball.y = -300;
let pll = 20
playerLight = new Sprite(800, 500, [
[100 * pll, 30 * pll],
[0 * pll, -60 * pll],
[-100 * pll, 30 * pll]
]);
//playerLight.mass = 0;
//playerLight.collider = 'none';
playerLight.layer = 0;
playerLight.color = mainLight;
playerVisuar = new Sprite(250, 100, [
[20, 6],
[-20, 6],
[2, -6],
[-2, -6]
]);
playerVisuar.color = playerCharacterCollar;
allSprites.overlaps(playerVisuar);
playerCollider = new Sprite(500, 500, [
[20, 6],
[-20, 6],
[0, -12]
]);
allSprites.overlaps(playerLight);
playerCollider.layer = 2;
playerCollider.color = "#00000000"
playerCollider.stroke = "#FFFFFF00"
playerCollider.overlaps(playerLight);
allSprites.overlaps(playerLight);
//playerMaruCollider = new Sprite();
objs = new Group();
objs.layer = 3;
objs.color = "#000000";
objs.collider = 'static';
// obj1 = new objs.Sprite();
// obj1.x = 100;
// obj1.y = 500;
// obj1.width = 100;
// obj1.height = 100;
// obj1.collider = 'none';
// obj1.color = 'pink'
//obj1.position.x = 300;
obj2 = new objs.Sprite();
obj2.x = 400;
obj2.y = 100;
obj2.width = 50;
obj2.height = 50;
obj2.color = 'pink'
obj2.collider = 'd'
shadows = new Group();
shadows.layer = 1;
shadows.overlaps(obj2);
shadows.color = mainShadow;
shadows.stroke = mainShadow;
playerSetup();
}
function draw() {
background(mainShadow);
if (mouse.presses('right')) {
shadows.removeAll();
}
handleKeys();
playerRend();
updateTriangleVertices(playerCollider);
//updateRectVertices(obj1);
//print(playerCollider.layer);
//影をスプライトで描画するようにしておく
//正確には陰でブロックなどが隠れているか の判断にオーバーラップを使いたいから
//何かほかに方法があればそれでいい
// playerCollider.alpha = 100;
//print(playerCollider.position.x);
testScene();
//gotyaTest();
cameraTracking(playerCollider);
print(bamenn);
}
//スプライトの頂点計算 (元々四角形専用、たぶん多角形全般に使えるように調整できてる)
//セットで影も書いてる
function updateRectVertices(sprite) {
//基礎情報
let centerX = sprite.position.x;
let centerY = sprite.position.y;
let spriteWidth = sprite.width;
let spriteHeight = sprite.height;
let angle = sprite.rotation;
//各頂点の位置
//回転なし
let sv = []; //spriteVertex
for (let i = 0; i < sprite.vertices.length - 1; i++) {
sv[i] = createVector(
sprite.vertices[i].x - centerX,
sprite.vertices[i].y - centerY
);
}
//回転あり
let rv = []; //rotatedVertex
for (let i = 0; i < sprite.vertices.length - 1; i++) {
rv[i] = createVector(
cos(angle) * sv[i].x - sin(angle) * sv[i].x,
sin(angle) * sv[i].y + cos(angle) * sv[i].y
);
if (i == 1 || i == 3) {
rv[i] = createVector(
cos(-angle) * sv[i].x - sin(-angle) * sv[i].x,
sin(-angle) * sv[i].y + cos(-angle) * sv[i].y
);
}
}
//値を使えるように保存
let sprDate = [];
for (let i = 0; i < sprite.vertices.length - 1; i++) {
sprDate[i] = createVector(
centerX + rv[i].x,
centerY + rv[i].y
);
}
//頂点確認
if (verticesCheck) {
//各頂点確認
for (let i = 0; i < sprDate.length; i++) {
fill(0, 0, 0)
if (i == 3) {
fill(255, 0, 0)
}
circle(sprDate[i].x, sprDate[i].y, 10);
}
}
//drawShadow(sprDate);
shadowSprite(sprDate);
}
//三角形スプライトの頂点計算 (仮でキャラクター専用)(後で四角形と統合?)
function updateTriangleVertices(sprite) {
//基礎情報
let centerX = sprite.position.x;
let centerY = sprite.position.y;
let angle = sprite.rotation;
//各頂点の位置
//回転なし
let vertex0X = sprite.vertices[0].x - centerX;
let vertex0Y = sprite.vertices[0].y - centerY;
let vertex1X = sprite.vertices[1].x - centerX;
let vertex1Y = sprite.vertices[1].y - centerY;
let vertex2X = sprite.vertices[2].x - centerX;
let vertex2Y = sprite.vertices[2].y - centerY;
//回転あり
let rotatedVertex0X = cos(angle) * vertex0X - sin(angle) * vertex0Y;
let rotatedVertex0Y = sin(angle) * vertex0X + cos(angle) * vertex0Y;
let rotatedVertex1X = cos(angle) * vertex1X - sin(angle) * vertex1Y;
let rotatedVertex1Y = sin(angle) * vertex1X + cos(angle) * vertex1Y;
let rotatedVertex2X = cos(angle) * vertex2X - sin(angle) * vertex2Y;
let rotatedVertex2Y = sin(angle) * vertex2X + cos(angle) * vertex2Y;
//値を使えるように保存
playerCharacterVertices[0] =
createVector(centerX + rotatedVertex0X, centerY + rotatedVertex0Y);
playerCharacterVertices[1] =
createVector(centerX + rotatedVertex1X, centerY + rotatedVertex1Y);
playerCharacterVertices[2] =
createVector(centerX + rotatedVertex2X, centerY + rotatedVertex2Y);
FPLSP = createVector(
playerCharacterVertices[1].x, playerCharacterVertices[1].y);
//頂点確認
if (verticesCheck) {
//中心確認
circle(playerCollider.position.x, playerCollider.position.y, 10);
//各頂点確認
circle(playerCharacterVertices[0].x, playerCharacterVertices[0].y, 10);
circle(playerCharacterVertices[1].x, playerCharacterVertices[1].y, 15);
circle(playerCharacterVertices[2].x, playerCharacterVertices[2].y, 10);
}
}
//影の描画 (とりあえず四角用)
function drawShadow(vertices) {
//基礎ステ
let shadowLenght = 1000;
fill(mainShadow);
strokeWeight(1);
stroke(mainShadow);
//影の落ちる先を設定
let sdp = []; //shadowDorpPoint
for (let i = 0; i < vertices.length; i++) {
sdp[i] = createVector(
vertices[i].x + (vertices[i].x - FPLSP.x) * shadowLenght,
vertices[i].y + (vertices[i].y - FPLSP.y) * shadowLenght);
}
//影を描写
for (let i = 0; i < vertices.length; i++) {
//最後の1面だけ分けて描写
if (i == vertices.length - 1) {
beginShape()
vertex(vertices[i].x, vertices[i].y)
vertex(sdp[i].x, sdp[i].y)
vertex(sdp[0].x, sdp[0].y)
vertex(vertices[0].x, vertices[0].y)
vertex(vertices[i].x, vertices[i].y)
endShape();
} else {
beginShape()
vertex(vertices[i].x, vertices[i].y)
vertex(sdp[i].x, sdp[i].y)
vertex(sdp[i + 1].x, sdp[i + 1].y)
vertex(vertices[i + 1].x, vertices[i + 1].y)
vertex(vertices[i].x, vertices[i].y)
endShape();
}
}
// let ss;
// ss = new Sprite([
// [sdp[1].x-sdp[0].x,sdp[1].y-sdp[0].y],
// [vertices[1].x-sdp[1].x,vertices[1].y-sdp[1].y],
// [vertices[0].x-vertices[1].x,vertices[0].y-vertices[1].y,],
// [sdp[0].x-vertices[0].x,sdp[0].y-vertices[0].y]
// ]);
}
//対象が陰に重なっているかチェック
//完全に隠れている or not
//p5.playの.overlapsを使ってチェック予定
//https://p5play.org/lang/ja/learn/sprite.html?page=6
//その場合スプライトの自由変形ができないので、判定処理用のスプライトを毎フレーム作って処理する?
//影の長さは固定にしたほうがいいかも?(あんまり離れるとスプライトが消えるっっぽい)
function shadowSprite(vertices) {
//基礎ステ
let shadowLenght = 20;
fill(mainShadow);
strokeWeight(1);
stroke(mainShadow);
//影の落ちる先を設定
let sdp = []; //shadowDorpPoint
for (let i = 0; i < vertices.length; i++) {
sdp[i] = createVector(
vertices[i].x + (vertices[i].x - FPLSP.x) * shadowLenght,
vertices[i].y + (vertices[i].y - FPLSP.y) * shadowLenght);
}
//影を描写、各辺から延びる台形の影を二つの三角形に分割して計算
for (let i = 0; i < vertices.length; i++) {
//最後の1面だけ分けて描写
if (i == vertices.length - 1) {
new shadows.Sprite([
[vertices[i].x, vertices[i].y],
[sdp[i].x, sdp[i].y],
[sdp[0].x, sdp[0].y],
[vertices[i].x, vertices[i].y]
]);
new shadows.Sprite([
[sdp[0].x, sdp[0].y],
[vertices[0].x, vertices[0].y],
[vertices[i].x, vertices[i].y],
[sdp[0].x, sdp[0].y]
]);
} else {
new shadows.Sprite([
[vertices[i].x, vertices[i].y],
[sdp[i].x, sdp[i].y],
[sdp[i + 1].x, sdp[i + 1].y],
[vertices[i].x, vertices[i].y]
]);
new shadows.Sprite([
[sdp[i + 1].x, sdp[i + 1].y],
[vertices[i + 1].x, vertices[i + 1].y],
[vertices[i].x, vertices[i].y],
[sdp[i + 1].x, sdp[i + 1].y]
]);
}
}
}
function shadowRapingCheck() {}
function playerRend(){
mouseAngle = -atan2(mouseX - wasdX, mouseY - wasdY) + 90;
playerAngle = playerAngle + (mouseAngle - playerAngle) * mouseAngleTracking;
playerCollider.rotateTowards(mouse, mouseAngleTracking, 0);
//playerLightをキャラの支店先に移動させる
let PLmoveTo = [];
PLmoveTo[0] = createVector(
//playerColliderの中心から「回転してない」FPLSPまでの距離
(-playerCollider.position.x + playerCollider.vertices[1].x) +
//playerLightの中心から「回転してない」FPLSPまでの距離
(playerLight.position.x - playerLight.vertices[0].x),
//playerColliderの中心から「回転してない」FPLSPまでの距離
(-playerCollider.position.y + playerCollider.vertices[1].y) +
//playerLightの中心から「回転してない」FPLSPまでの距離
(playerLight.position.y - playerLight.vertices[0].y)
);
//cos(angle) * vertex0X - sin(angle) * vertex0Y;
//sin(angle) * vertex0X + cos(angle) * vertex0Y;
//print(cos(playerCollider.rotation) * PLmoveTo[0].x - sin(playerCollider.rotation) * PLmoveTo[0].y);
//print(sin(playerCollider.rotation) * PLmoveTo[0].x + cos(playerCollider.rotation) * PLmoveTo[0].y);
circle(
playerCollider.position.x + cos(playerCollider.rotation) * PLmoveTo[0].x - sin(playerCollider.rotation) * PLmoveTo[0].y,
playerCollider.position.y + sin(playerCollider.rotation) * PLmoveTo[0].x + cos(playerCollider.rotation) * PLmoveTo[0].y,
30
);
playerLight.rotation = playerCollider.rotation;
playerLight.x = playerCollider.position.x + cos(playerCollider.rotation) * PLmoveTo[0].x - sin(playerCollider.rotation) * PLmoveTo[0].y;
playerLight.y = playerCollider.position.y + sin(playerCollider.rotation) * PLmoveTo[0].x + cos(playerCollider.rotation) * PLmoveTo[0].y;
playerVisuar.x =playerCollider.position.x
playerVisuar.y =playerCollider.position.y
playerVisuar.rotation = playerCollider.rotation;
}
function cameraTracking(sprite){
//いい感じにカメラがついていくようにしたい(作業
// let plus = 0.01;
// if(40<dist(camera.x,camera.y,sprite.x,sprite.x)){
// if(ts>0.089){
// plus = 0;
// }
// ts += plus;
// }else{
// ts =0.1
// }
// // print(camera.y)
// // print(sprite.y)
// print(dist(camera.x,camera.y,sprite.x,sprite.y));
camera.x = camera.x+(sprite.x - camera.x)*ts;
camera.y = camera.y+(sprite.y - camera.y)*ts;
}
//プレイヤーの初期値設定用
function playerSetup() {
//移動用
wasdX = 0;
wasdY = 0;
isMovingLeft = false;
isMovingRight = false;
isMovingUp = false;
isMovingDown = false;
defaultMoveSpeed = 5;
//情報
FPLSP = createVector(
playerCollider.vertices[1].x, playerCollider.vertices[1].y);
//操作
mouseAngle = 180;
mouseAngleTracking = 0.2;
pma = 0;
}
function handleKeys() {
moveSpeed = defaultMoveSpeed;
if (keyCode === SHIFT) {
moveSpeed = 2*defaultMoveSpeed;
}
if (keyCode === CONTROL) {
moveSpeed = 0.5*defaultMoveSpeed;
}
TP[0] = createVector(0, 0);
//WASD移動用
if (isMovingUp) {
wasdY -= moveSpeed;
TP[0].y -= 1;
}
if (isMovingDown) {
wasdY += moveSpeed;
TP[0].y += 1;
}
if (isMovingLeft) {
wasdX -= moveSpeed;
TP[0].x -= 1;
}
if (isMovingRight) {
wasdX += moveSpeed;
TP[0].x += 1;
}
pma = atan2(TP[0].x, TP[0].y);
if (isMovingLeft || isMovingRight) {
playerCollider.vel.x = moveSpeed * sin(pma);
} else {
playerCollider.vel.x = 0;
}
if (isMovingUp || isMovingDown) {
playerCollider.vel.y = moveSpeed * cos(pma);
} else {
playerCollider.vel.y = 0;
}
}
function keyPressed() {
//WASD移動用
if (key === 'w') {
isMovingUp = true;
}
if (key === 's') {
isMovingDown = true;
}
if (key === 'a') {
isMovingLeft = true;
}
if (key === 'd') {
isMovingRight = true;
}
//ライトONOFF切り替え
if (key === 'l') {
if (lightStatus) {
FPLColor = mainShadow;
lightStatus = false;
} else {
FPLColor = mainLight;
lightStatus = true;
}
}
//ライトONOFF切り替え
if (key === 'v') {
if (verticesCheck) {
verticesCheck = false;
} else {
verticesCheck = true;
}
}
//scene操作用
if (key === 'p') {
bamenn++;
print(bamenn);
}
if (key === 'o') {
bamenn = 0;
print(bamenn);
}
//
if (key === 'r') {}
//拡大縮小リセット用
if (key === 'z') {
ZM = 0;
}
}
function keyReleased() {
//WASD移動用
if (key === 'w') {
isMovingUp = false;
}
if (key === 's') {
isMovingDown = false;
}
if (key === 'a') {
isMovingLeft = false;
}
if (key === 'd') {
isMovingRight = false;
}
}
// function removeSprite(sprite) {
// sprite.remove();
// }
function mousePressed() {
rectReady = false;
//noLoop();
}