⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysphere.cpp

📁 一款3d台球游戏,包含引擎代码和资源,非常精致
💻 CPP
字号:
// Billiard ball simulator
// Created by Nelis Franken
// -----------------------------------------------------------
// Sphere (billiard ball) implementation file
// -----------------------------------------------------------

#include <iostream>
#include <math.h>
#include "mySphere.h"

mySphere::mySphere() {
	resetValuesToZero();
}

mySphere::mySphere(float posX, float posY, float posZ) {
	resetValuesToZero();
	position = vector3(posX, posY, posZ);
}

void mySphere::resetValuesToZero() {
	weight = 0.0;
	mass = 0.0;
	radius = 0.0;
	fC = 0.0;
	accellSize = 0.0;
	forceSize = 0.0;
	speedSize = 0.0;
	speedDif = 0.0;
	rotation = 0.0;
	speed = vector3(0.0,0.0,0.0);
	position = vector3(0.0,24.9,0.0);
	accell = vector3(0.0,0.0,0.0);
	force = vector3(0.0,0.0,0.0);
	reflected = vector3(0.0,0.0,0.0);
	collided = false;
	inPlay = true;
}

void mySphere::setDefaults() {

	speedSize = 0.0;
	mass = 0.0001;
	weight = mass * 9.81;
	fC = 0.00004;
	speedDif = 10000.0;
	radius = 1.5;

	collided = false;
	inPlay = true;
	force = speed;
	forceSize = sqrt((force.x)*(force.x) + (force.y)*(force.y) + (force.z)*(force.z));

	if (forceSize != 0) {
		force = force * ((1.0 / forceSize) * (fC * weight));
  	}

	accell = (force * (1.0/mass)) * (-1.0);
	accellSize = fC * 170.0;
	accell = accell * accellSize;
}

void mySphere::setPos(float posX, float posY, float posZ) {
	position = vector3(posX, posY, posZ);
}

void mySphere::setSpeed(float speedX, float speedY, float speedZ) {
	speed = vector3(speedX, speedY, speedZ);
}

bool mySphere::roll() {

	updateSpeedSize();
	speed = speed + accell;
	speedDif = speedSize - sqrt((speed.x)*(speed.x) + (speed.y)*(speed.y) + (speed.z)*(speed.z));

	if (speedDif >= 0.0000001) {
		position = position + speed;
		return true;
	} else {
		accell = accell*0.0;
		speedSize = 0.0;
		return false;
	}
}

void mySphere::updateSpeedSize() {
	speedSize = sqrt((speed.x)*(speed.x) + (speed.y)*(speed.y) + (speed.z)*(speed.z));
}

float mySphere::getSpeedSize() {
	speedSize = (sqrt((speed.x)*(speed.x) + (speed.y)*(speed.y) + (speed.z)*(speed.z)));
	return speedSize;
}

float mySphere::determineDistance(mySphere testBall) {
	return (sqrt((position.x - testBall.position.x)*(position.x - testBall.position.x) + (position.y - testBall.position.y)*(position.y - testBall.position.y) + (position.z - testBall.position.z)*(position.z - testBall.position.z) ));
}

bool mySphere::collides(mySphere testBall) {

	float distance = determineDistance(testBall);

	if (distance >= (2.0*radius)) {
		return false;
	} else {
		//position = position + (position - testBall.position)*0.1;
		position = position - (testBall.position - position)*(2.0*radius - distance);
		//position = position - speed*1.4;

		return true;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -