#include "SnakeSeven.h"
float distSnakeSeven(ofPoint aPosA, ofPoint aPosB) {
return ofDist(aPosA.x, aPosA.y, aPosB.x, aPosB.y);
}
void SnakeSeven::setup() {
nDia = 20;
nVel = 4;
nStep = 2;
float nAngle = ofRandom(0, TWO_PI);
ofPoint pStartDir = ofPoint(cos(nAngle),sin(nAngle));
ofPoint pStartPos = ofPoint(ofRandom(0, ofGetWidth()), ofRandom(0, ofGetHeight()));
pBodyPosArr.push_back(pStartPos);
float nStartAngle = atan2(pStartDir.y, pStartDir.x) * RAD_TO_DEG;
nBodyAngleArr.push_back(nStartAngle);
for (int i = 0; i < nDia / nStep; i++) {
ofPoint pPosTemp = pStartPos - pStartDir * nStep * i;
pPathPosArr.push_back(pPosTemp);
nPathAngleArr.push_back(nStartAngle);
}
ofPoint pEndBodyPos = pPathPosArr[pPathPosArr.size() - 1];
pBodyPosArr.push_back(pEndBodyPos);
float nEndBodyAngle = nPathAngleArr[nPathAngleArr.size() - 1];
nBodyAngleArr.push_back(nEndBodyAngle);
}
void SnakeSeven::update() {
ofPoint pMouseXY = ofPoint(ofGetMouseX(), ofGetMouseY());
ofPoint pNewDir = pMouseXY - pBodyPosArr[0];
pNewDir.normalize();
ofPoint pNewPos = pPathPosArr[0] + pNewDir * nVel;
float nDist = distSnakeSeven(pNewPos, pPathPosArr[0]);
int nNums = nDist / nStep;
float nNewAngle = atan2(pNewDir.y, pNewDir.x) * RAD_TO_DEG;
ofPoint pNewPathPos;
for (int i = 0; i < nNums;i++) {
pNewPathPos = pPathPosArr[0] + pNewDir * nStep;
pPathPosArr.insert(pPathPosArr.begin(), pNewPathPos);
nPathAngleArr.insert(nPathAngleArr.begin(), nNewAngle);
}
int nIndex = 0;
pBodyPosArr[0] = pPathPosArr[0];
nBodyAngleArr[0] = nPathAngleArr[0];
for (int i = 1; i < pBodyPosArr.size(); i++) {
nIndex = i * nDia / nStep - 1;
if (nIndex < pPathPosArr.size())
{
pBodyPosArr[i] = pPathPosArr[nIndex];
nBodyAngleArr[i] = nPathAngleArr[nIndex];
}
}
for (int i = 0; i < nNums; i++) {
pPathPosArr.pop_back();
nPathAngleArr.pop_back();
}
}
void SnakeSeven::draw() {
ofPushStyle();
ofSetColor(255, 0, 0);
ofPushMatrix();
ofTranslate(pBodyPosArr[0]);
ofRotate(nBodyAngleArr[0]);
ofRect(- ofPoint(nDia, nDia)/2, nDia, nDia);
ofPopMatrix();
for (int i = 1; i < pBodyPosArr.size(); i++) {
if (i % 2)
ofSetColor(120, 60, 80);
else
ofSetColor(220, 60, 80);
ofPushMatrix();
ofTranslate(pBodyPosArr[i]);
ofRotate(nBodyAngleArr[i]);
ofRect(- ofPoint(nDia, nDia) / 2, nDia, nDia);
ofPopMatrix();
}
ofPopStyle();
ofDrawBitmapStringHighlight("Ve: "+ofToString(nVel), ofPoint(50, 100));
ofDrawBitmapStringHighlight("Dia: " + ofToString(nDia),ofPoint(50, 120));
ofDrawBitmapStringHighlight("length: " + ofToString(pPathPosArr.size()/ (nDia / nStep)), ofPoint(50, 140));
ofDrawBitmapStringHighlight("Press 1 to lengthen.", ofPoint(50, 200));
ofDrawBitmapStringHighlight("Press 3 to accelerate.", ofPoint(50, 220));
ofDrawBitmapStringHighlight("Press 4 to slow down.", ofPoint(50, 240));
}
void SnakeSeven::keyPressed(int key) {
if ('1' == key) {
addBody();
}
else if ('3' == key) {
nVel++;
}
else if ('4' == key) {
nVel--;
}
}
void SnakeSeven::addBody() {
ofPoint pNewBodyDir = pBodyPosArr[pBodyPosArr.size() - 2] - pBodyPosArr[pBodyPosArr.size() - 1];
pNewBodyDir.normalize();
ofPoint pEndBodyPos = pBodyPosArr[pBodyPosArr.size() - 1];
float nNewAngle = atan2(pNewBodyDir.y, pNewBodyDir.x) * RAD_TO_DEG;
ofPoint pPosTemp;
for (int i = 0; i < nDia / nStep; i++) {
pPosTemp = pEndBodyPos - pNewBodyDir * nStep * i;
pPathPosArr.push_back(pPosTemp);
nPathAngleArr.push_back(nNewAngle);
}
pBodyPosArr.push_back(pPathPosArr[pPathPosArr.size() - 1]);
nBodyAngleArr.push_back(nPathAngleArr[nPathAngleArr.size() - 1]);
}
没有合适的资源?快使用搜索试试~ 我知道了~
openFrameworks实现的简单版可360度移动的贪吃蛇游戏-Snake
共13个文件
cpp:3个
filters:2个
h:2个
需积分: 14 2 下载量 2 浏览量
2022-03-05
15:58:26
上传
评论
收藏 1.35MB RAR 举报
温馨提示
基于of_v0.11.2_vs2017_release实现的贪吃蛇游戏,可360度方向移动,可加减速。
资源详情
资源评论
资源推荐
收起资源包目录
SnakeDemo.rar (13个子文件)
SnakeDemo
SnakeDemo.sln 2KB
SnakeDemo.vcxproj 11KB
SnakeDemo.vcxproj.user 1KB
addons.make 0B
SnakeDemo.vcxproj.filters 876B
src
main.cpp 341B
ofApp.cpp 2KB
SnakeSeven.cpp 4KB
SnakeSeven.h 403B
ofApp.h 594B
icon.rc 230B
snake2022351543711.gif 1.7MB
SnakeDemo.filters 614B
共 13 条
- 1
nianziyishi
- 粉丝: 2
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0