3d坦克大战如何自由选择3d场景模型制作式

Posts - 119,
Articles - 20,
Comments - 1156
console.log( " Hi, I'm Barret, a Web Developer, try to be Excellent~ " );
23:55 by Barret Lee, ... 阅读,
昨天参加了hack day的一个比赛,赛制大致是:24小时,自由组队2~4人,任意发挥。运气比较好,拿了第三名和最佳创意奖。
建议先看看这个demo,bug是有的,chrome下玩玩,测试测试就行,O(&_&)O~
  DEMO:
&基本效果:
懒得去SAE上折腾,没把那另外一半的功能补上,不过我还是介绍下这几个没补上功能吧。
  1. 音效。开始音乐是比较古老的坦克大战开机音乐。
    ① 开始音效
    ② 发子弹 & &
    ③ 击中坦克&
    ④ 爆炸 & & &&
  ②和③是自己录制的,呵呵,DIY的东西才好玩。
  2. 登录验证
  采用的是解锁,这个创意应该是非常不错的,当登录的时候,A、B玩家下方会生成一个如上图的canvas解锁块,当然这个解锁卡也会通过socket传送到手机遥控端,手机解锁成功后方可登录。
  3. 坦克360&旋转
  由于键盘控制只能上下左右,所以360&是转不出来的..刚想截一张手机控制游戏的图,总是报错...囧(后台用的是php,socket控制信号传输,刚打开手机端网页的时候php socket报错)。
手机遥控端视图:
  这里主要利用的是手机多点触控,touchstart,touchmove,touchend这三个事件。
function canvasAddListener() {
canvas.addEventListener('touchstart', onTouchStart, false);
canvas.addEventListener('touchmove', onTouchMove, false);
canvas.addEventListener('touchend', onTouchEnd, false);
  4. 重新开始游戏和打死坦克添加效果等
以上都是没有公开显示出来的效果,下次弄好了再上传吧,嘻嘻。
先说说前台
前台主要采用的是css3和js(这是废话)。
1. css3构建一个3D游戏场地
width:<span style="color: #px;
height:<span style="color: #px;
position:relative;
-webkit-transform-style: preserve-3d;
/*-webkit-transform: rotateY(40deg);*/
-webkit-transition:all 1s ease-in-out;
width:<span style="color: #px;
height:<span style="color: #px;
overflow: hidden;
text-align: center;
box-shadow: 0px 0px 2px white;
background:rgba(255,255,255,.2);
/*background:#779443;*/
position:absolute;
top:<span style="color: #px;
left:<span style="color: #px;
color:white;
.box-forward {
-webkit-transform: rotateY(0deg) translateZ(150px);
.box-back {
-webkit-transform: rotateY(180deg) translateZ(150px);
.box-left {
-webkit-transform: rotateY(270deg) translateZ(150px);
.box-right {
-webkit-transform: rotateY(90deg) translateZ(150px);
.box-top {
-webkit-transform:rotateX(90deg) translateZ(150px);
.box-bottom {
-webkit-transform:rotateX(-90deg) translateZ(150px);
上面是css部分,比赛过程中,参看了下张鑫旭大哥的文章(之前这块还不是很了解的),。就不细说了。
下面是HTML部分:
&div class="w"&
&div class="box"&
&div class="inBox box-forward" data-num="upF rightF downF leftF" data-v="1"&&div&&/div&&/div&
&div class="inBox box-back" data-num="upF leftF downF rightF" data-v="2"&&div&&/div&&/div&
&div class="inBox box-left" data-num="upF forwardF downF backF" data-v="3"&&div&&/div&&/div&
&div class="inBox box-right" data-num="upF backF downF forwardF" data-v="4"&&div&&/div&&/div&
&div class="inBox box-top" data-num="backF rightF forwardF leftF" data-v="5"&&div&&/div&&/div&
&div class="inBox box-bottom" data-num="backF leftF forwardF rightF" data-v="6"&&div&&/div&&/div&
2. JS这块,写了比较多。
var $ = document.querySelectorAll.bind(document);
* @description core part
* @author hustskyking
var faces = $(".inBox"),
bloodA = $(".bloodA div")[0],
bloodB = $(".bloodB div")[0],
box = $(".box")[0],
upF = $(".box-top")[0],
downF = $(".box-bottom")[0],
leftF = $(".box-left")[0],
rightF = $(".box-right")[0],
forwardF = $(".box-forward")[0],
backF = $(".box-back")[0],
cSize = upF.clientWidth,
"upF": upF,
"downF": downF,
"leftF": leftF,
"rightF": rightF,
"forwardF": forwardF,
"backF": backF
stopN = 0,
tanks = {},
randomTank = 2,
debug_keySet = [[65, 87, 68, 83, 74], [37, 38, 39, 40, 80]];
* @Class Tank
* @attrs width, height, currentX, currentY, speedX, speedY, angleX, angleY, plusy, plusx
container, dataset, stopN, tank, tankId, life, bulletBox, color, timerLimit, timer, gap,
var Tank = function(setting){
var opts = setting || {};
this.container = opts.container || forwardF;
this.dataset
= this.container.getAttribute('data-num').split(" ");
this.belong = 0;
this.grade
this.debug
this.width
= opts.width || 14;
this.height = opts.height || 18;
this.stopN
= "keyup" + (window.stopN++);
= opts.gap || 30;
this.speed
= opts.speed || 3;
= opts.cx || (cSize - this.width) / 2;
= opts.cy || (cSize - this.height) / 2;
this.tankId = "";
this.color
= opts.color || "#0047B3";
this.bulletBox = [];
this.bColor = opts.bColor || "#0047B3";
this.timerLimit= 400;
this.gunAngle
this.timer
this.sTime
Tank.prototype = {
init: function(tankId, debug){
if(tankId){
this.tankId = tankId;
this.belong = (Number(tankId) & 2 ? 2 :Number(tankId));
throw new Error("必须设置tank ID");
var this_ = this;
//绘制坦克
this.paintTank();
if(debug){
this.debug = true;
this.keySet = debug.keyS
window.addEventListener("keydown", function(){
this_.move_debug();
}, false);
window.addEventListener(this.stopN, function(){
clearInterval(this_.timer);
}, false);
paintTank: function(){
var tank = document.createElement("span");
var circle = document.createElement("span");
var gun = document.createElement("span");
gun.setAttribute("class", "gun");
tank.setAttribute("class", "tank");
circle.setAttribute("class", "circle");
tank.setAttribute("id", "tank" + this.tankId);
gun.style.borderColor = this.
circle.style.borderColor = this.
tank.style.cssText = "width:" + this.width + "height:" + this.height +
"top:" + this.cy + "left:" + this.cx + "border-color:"
tank.appendChild(gun);
tank.appendChild(circle);
this.container.getElementsByTagName("div")[0].appendChild(tank);
this.tank =
switchPainter: function(N){
1-&up 2-&right 3-&down 4-&down
this.ay %= 360;
var r = false,
if (this.ay & 180) {
this.ay -= 360;
if (this.ay & -180) this.ay += 360;
this.container = datas[this.dataset[N]];
this.dataset
= this.container.getAttribute('data-num').split(" ");
this.container.getElementsByTagName("div")[0].appendChild(this.tank);
if(this.belong &= 2) return;
box.style.cssText = "-webkit-transform: rotateY(" + (this.ay + (r ? -a : a)) + "deg);";
setAngle: function(x, y, ang){
this.gunAngle = 90 - ang / Math.PI * 180;
$("#tank" + this.tankId)[0].style.cssText += "-webkit-transform: rotate(" + this.gunAngle + "deg);";
move: function(ang){
this.setAngle(Math.cos(ang), -Math.sin(ang), ang);
this.stopAni();
this.ani();
direction_debug: function(){
switch(event.keyCode) {
case this.keySet[0]:
return "left";
case this.keySet[1]:
return "up";
case this.keySet[2]:
return "right";
case this.keySet[3]:
return "down";
case this.keySet[4]:
return "shooter";
move_debug: function(){
this.stopAni();
switch(this.direction_debug()) {
case "up":
console.log("up");
this.setAngle(0, -1, Math.PI / 2);
this.gunAngle_debug = 0;
case "down":
console.log("down");
this.setAngle(0, 1, Math.PI / 2 * 3);
this.gunAngle_debug = 180;
case "left":
console.log("left");
this.setAngle(-1, 0, Math.PI);
this.gunAngle_debug = 90;
case "right":
console.log("right");
this.setAngle(1, 0, Math.PI * 2);
this.gunAngle_debug = -90;
case "shooter":
console.log("shooter");
this.shooter();
this.ani();
ani: function(){
var this_ = this;
this.timer = setInterval(function(){
this_.detective();
// this_.detectiveTank();
this_.cx += this_.sx * this_.
this_.cy += this_.sy * this_.
this_.detective();
this_.tank.style.top = this_.cy + "px";
this_.tank.style.left = this_.cx + "px";
}, this.gap);
stopAni: function(){
var event = document.createEvent('HTMLEvents');
event.initEvent(this.stopN, true, true);
  event.eventName = this.stopN;
window.dispatchEvent(event);
detective: function(){
if(this.cx - this.width &= cSize){
this.ay += -90;
this.ax += 0;
this.switchPainter(1);
this.cx = 1;
if(this.cx + this.width &= 0){
this.ay += 90;
this.ax += 0;
this.switchPainter(3);
this.cx = cSize + this.width - 1;
if(this.cy &= 0){
this.sy = 0;
this.cy = 4;
if(this.cy + this.width &= cSize){
this.sy = 0;
this.cy = cSize - this.width - 8;
detectiveTank: function(){
if(this.cx - this.width &= cSize){
this.ay += -90;
this.ax += 0;
this.switchPainter(1);
this.cx = 1;
if(this.cx + this.width &= 0){
this.ay += 90;
this.ax += 0;
this.switchPainter(3);
this.cx = cSize + this.width - 1;
if(this.cy &= 0){
this.sy = 0;
this.cy = 4;
if(this.cy + this.width &= cSize){
this.sy = 0;
this.cy = cSize - this.width - 8;
shooter: function(){
if((new Date()).getTime() - this.sTime & this.timerLimit) return;
var bullet = new Bullet(this.gunAngle, this.cx, this.cy, this.tankId);
this.container.getElementsByTagName("div")[0].appendChild(bullet.bullet);
bullet.move();
this.sTime = (new Date()).getTime();
destroy: function(){
this.stopAni();
this.shooterTimer && clearInterval(this.shooterTimer);
this.moveTimer && clearInterval(this.moveTimer);
if(this.tankId &= 2 && randomTank &= tankLimit) createRandomTank();
delete tanks[this.tankId];
this.tank.parentNode && this.tank.parentNode.removeChild(this.tank);
delete this;
* @Bullet Tank
* @attrs bullet, timer, gap, x, yadsjsw
var Bullet = function(gA, x, y, tankId){
this.bullet = document.createElement("span");
this.timer
this.passed = 0;
var a = Math.cos(gA / 180 * Math.PI - Math.PI / 2),
b = Math.sin(gA / 180 * Math.PI - Math.PI / 2);
if(Math.abs(a) & 1) a = a & 0 ? Math.floor(a) : Math.ceil(a);
if(Math.abs(b) & 1) b = b & 0 ? Math.floor(b) : Math.ceil(b);
this.x = x + 6;
this.y = y + 7;
this.bullet.setAttribute("class", "bullet");
this.bullet.style.top = -10 + "px";
this.bullet.style.left = -10 + "px";
this.bullet.style.borderColor = tanks[tankId].bC
this.tankId = tankId;
this.container = $("#tank" + this.tankId)[0].parentNode.parentN
this.belong = tanks[this.tankId].
Bullet.prototype = {
bSwitchPainter: function(N){
this.container = this.bullet.parentNode.parentN
this.dataset
= this.container.getAttribute('data-num').split(" ");
this.container = datas[this.dataset[N]];
this.dataset
= this.container.getAttribute('data-num').split(" ");
this.container.getElementsByTagName("div")[0].appendChild(this.bullet);
this.passed++;
if(this.passed == 4){
this.destroy();
detective: function(){
if(this.x - 2 &= cSize){
this.bSwitchPainter(1);
this.x = 1;
if(this.y - 2 &= cSize){
this.destroy();
if(this.x + 2 &= 0){
this.bSwitchPainter(3);
this.x = cSize + 3;
if(this.y + 2 &= 0){
this.destroy();
move: function(){
var this_ = this;
this.timer = setInterval(function(){
this_.detective();
this_.x += this_.a * 5;
this_.y += this_.b * 5;
this_.checkHit();
this_.bullet.style.top = this_.y + "px";
this_.bullet.style.left = this_.x + "px";
}, this.gap);
checkHit: function(){
for (var i in tanks) {
if (i == this.tankId) continue;
if (tanks[i].belong == this.belong) continue;
var tx = tanks[i].cx,
ty = tanks[i].cy,
bc = this.container.getAttribute("data-v"),
tc = tanks[i].container.getAttribute("data-v"),
if ((bc == tc) && (this.x & tx + w) && (this.x & tx - w) && (this.y & ty + w) && (this.y & ty - w) ) {
console.log(i, tanks[i].life);
this.hit(tanks[i]);
this.destroy();
hit: function(tTank){
tTank.life -= 20;
if(tTank.belong == 0){
console.log("1掉血");
bloodA.style.bottom = 300 * tTank.life / 100 + "px";
if(tTank.life == 0){
setTimeout(function(){
$(".pujieL")[0].style.display = "block";
}else if(tTank.belong == 1){
console.log("2掉血");
bloodB.style.bottom = 300 * tTank.life / 100 + "px";
if(tTank.life == 0){
setTimeout(function(){
$(".pujieR")[0].style.display = "block";
var add = 5;
if(tanks[this.tankId].belong == 0){
if(tTank.life == 0){
//window.addTankGrade(0);
tanks[this.tankId].grade +=
$("#gradeA")[0].innerHTML = tanks[this.tankId].
if(tTank.life == 0){
//window.addTankGrade(1);
tanks[this.tankId].grade +=
$("#gradeB")[0].innerHTML = tanks[this.tankId].
if(tTank.life &= 0){
tTank.destroy();
console.log("destroyed");
destroy: function(){
clearInterval(this.timer);
if (typeof tanks[this.tankId] != 'undefined') {
var tankArr = tanks[this.tankId].bulletB
tankArr.splice(tankArr.indexOf(this),1);
this.bullet.parentNode && this.bullet.parentNode.removeChild(this.bullet);
function createTank(color){
var tank = document.createElement("span");
var circle = document.createElement("span");
var gun = document.createElement("span");
gun.setAttribute("class", "gun");
tank.setAttribute("class", "tank");
circle.setAttribute("class", "circle");
gun.style.borderColor =
circle.style.borderColor =
tank.style.cssText = "width:14height:18position:border-color:" +
tank.appendChild(gun);
tank.appendChild(circle);
function addTankGrade(N){
var box, color,
if(N == 0) {
box = $("#tankBoxA")[0];
color = "#8500FF";
box = $("#tankBoxB")[0];
color = "#6D6D27";
tank = createTank(color);
box.appendChild(tank);
function createRandomTank(obj) {
var obj = obj || {cx: 150, cy: 150, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF};
var rTank = new Tank(obj);
rTank.init(String(randomTank));
rTank.shooterTimer = null;
rTank.shooterTimer = setInterval(function(){
if(Math.random() & 0.8){
rTank.shooter();
rTank.moveTimer = null;
rTank.moveTimer = setInterval(function(){
if(Math.random() & 0.4){
var ang = Math.PI * 2 * Math.random();
rTank.move.call(rTank, ang);
tanks[randomTank] = rT
randomTank++;
function run_debug(){
tanks[0] = new Tank({cx: 50, cy: 220, color:"red", bColor:"red"});
tanks[0].init('0', {
keySet:debug_keySet[0]
tanks[1] = new Tank();
tanks[1].init('1', {
keySet:debug_keySet[1]
createRandomTank({cx: 250, cy: 220, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF});
createRandomTank({cx: 220, cy: 220, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF});
createRandomTank({cx: 190, cy: 220, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF});
createRandomTank({cx: 160, cy: 220, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF});
createRandomTank({cx: 130, cy: 220, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF});
createRandomTank({cx: 100, cy: 220, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF});
window.onload = function(){
var layer = document.createElement("div");
layer.setAttribute("id", "layer");
var stripe = document.createElement("div");
stripe.setAttribute("id", "stripe");
stripe.style.top = (document.clientHeight - 250) / 2 + "px";
document.body.appendChild(layer);
document.body.appendChild(stripe);
$("#gradeA")[0].innerHTML = $("#gradeB")[0].innerHTML = 0;
//run_debug();
function showMsg(msgContent){
var box = document.createElement("div");
var msg = document.createElement("div");
box.setAttribute("id", "showMsgBox");
msg.setAttribute("id", "msgBox");
with(box.style){
position = "absolute";
bottom = 0;
right = 0;
with(msg.style){
margin = "0 auto";
width = "500px";
height = "400px";
marginTop = "100px";
padding = "55px";
fontSize = "30px";
fontFamily = "微软雅黑";
lineHeight = "40px";
msg.innerHTML = msgContent || "空";
box.appendChild(msg);
document.body.appendChild(box);
showMsg("&b style='color:white'&[测试版本]&/b&本版本只实现了一半的功能,最终版本是手机控制,并且有音效、登录验证、坦克可以360&旋转,因为需要配置环境,没有公开。左右边界可以穿过,为3D效果。5枪可以搞定一个坦克。" +
"&p style='color:text-align:center'&按键 ctrl+alt+J 开始&/p&&p&①:WSAD 控制上下左右,J发子弹&/p&&p&②:&&&& 控制上下左右,p发子弹&/p&")
window.onkeydown = function(){
if(event.ctrlKey && event.altKey && event.keyCode == 74){
$("#showMsgBox")[0].style.display = "none";
$("#msgBox")[0].style.display = "none";
run_debug();
3D Tank JavaScript
拆开分析下:
  ① Tank对象
DIY坦克(还行,哈哈哈~):
var Tank = function(setting){
var opts = setting || {};
this.container = opts.container || forwardF;
this.dataset
= this.container.getAttribute('data-num').split(" ");
Tank.prototype = {
init: function(tankId, debug){
if(debug){
this.debug = true;
this.keySet = debug.keyS
window.addEventListener("keydown", function(){
this_.move_debug();
}, false);
window.addEventListener(this.stopN, function(){
clearInterval(this_.timer);
}, false);
paintTank: function(){
switchPainter: function(N){
direction_debug: function(){
move_debug: function(){
ani: function(){
stopAni: function(){
var event = document.createEvent('HTMLEvents');
event.initEvent(this.stopN, true, true);
  event.eventName = this.stopN;
window.dispatchEvent(event);
detective: function(){
detectiveTank: function(){
shooter: function(){
destroy: function(){
  难点在于一些边界的判断,但是好好考虑下也不算什么难点咯~这些代码中应该看到了很多debug之类的变量和函数,因为我写了两种模式,一种是手机端玩,一中是电脑键盘控制(debug模式)。
  ②子弹对象
* @Bullet Tank
* @attrs bullet, timer, gap, x, yadsjsw
var Bullet = function(gA, x, y, tankId){
};Bullet.prototype = {
move: function(){
checkHit: function(){
hit: function(tTank){
destroy: function(){
clearInterval(this.timer);
if (typeof tanks[this.tankId] != 'undefined') {
var tankArr = tanks[this.tankId].bulletB
tankArr.splice(tankArr.indexOf(this),1);
this.bullet.parentNode && this.bullet.parentNode.removeChild(this.bullet);
&  和坦克一样,都有一个destroy函数,销毁对象。
  ③ 构建AI对象
function createRandomTank(obj) {
var obj = obj || {cx: 150, cy: 150, color:"#ECFF0B", bColor:"#ECFF0B", speed: 1, container: backF};
var rTank = new Tank(obj);
rTank.init(String(randomTank));
rTank.shooterTimer = null;
rTank.shooterTimer = setInterval(function(){
if(Math.random() & 0.8){
rTank.shooter();
rTank.moveTimer = null;
rTank.moveTimer = setInterval(function(){
if(Math.random() & 0.4){
var ang = Math.PI * 2 * Math.random();
rTank.move.call(rTank, ang);
tanks[randomTank] = rT
randomTank++;
  机器人是个麻烦的东西,这块虽然不难,销毁他们的时候费了不少力气~~~主要是那么timer要跟着一起销毁。
  ④ 构建对象说明
tanks[0] = new Tank({cx: 50, cy: 220, color:"red", bColor:"red"});
tanks[0].init('0', {
keySet:debug_keySet[0]
  这里需要说明一下,只要init后面加了第二个参数,就是调试模式,也就是说键盘是可以控制运行的。
  设置了一个全局变量
debug_keySet = [[65, 87, 68, 83, 74], [37, 38, 39, 40, 80]];
3. socket这块
  整个平台信息的交互就是以他为核心,socket这个东西还算比较新,所以学习的时候也没找到太多的资料,只能对着w3c的一些文档边试边做。
function ws_init() {
var host = "ws://192.168.86.1:1111/";
// var host = "ws://202.114.20.79:1111/";
socket = new WebSocket(host);
logMsg('WebSocket - status '+socket.readyState);
socket.onopen
= function(msg) { logMsg("Welcome - status "+this.readyState); send('display'); };
socket.onclose
= function(msg) { logMsg("Disconnected - status "+this.readyState); };
socket.onmessage = function(msg) { //.... };
} catch(ex) {
logMsg(ex);
function send(msg) {
socket.send(msg + '=');
} catch(ex) {
logMsg(ex);
  socket在前端部分是非常简单的,就是三个事件onopen, onclose, onmessage来驱动,重点还是后台操作,真心麻烦!
后台用的是php,本来打算使用nodeJS,不是十分熟练,24个小时的赛制花太长时间去学习也不现实,所以就用了比较熟悉的php来建立socket连接,还算成功吧。
这个部分以后有时间说。先碎觉~~
最后,别忘了这个DEMO哦,&播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
视频:3D坦克大战-重型坦克大战多边形-[&游戏...
发送到手机 / 微信 / 朋友圈
请扫描下列二维码
嵌入代码:
*通用代码支持手机播放哦
方式一:扫一扫
支持各类二维码扫描软件
方式二:发一发
免费发送App到手机
请输入正确的手机号码
看不清验证码不正确
该短信不收取任何费用
方式三:下一下
下载App观看
还有更多攻略和游戏礼包等着你
游戏新鲜报
&&坦克世界
第三人称射击
测试状态:(公测)
坦克世界本周上升视频
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
播放: 评论:
畅游视频网页游戏YOYO手游
完美游戏台
网络视听许可证新手如何玩转3D坦克大战?
18:47:33 本文行家:
新手指引想要从坦克新兵变成一名强大的坦克勇士吗?阅读本新手指南可让你在最短时间内上手本游戏,更快地成为有经验的坦克手!一.游戏运行运行3Dtank游戏无需下载和安装任何程序,只要有Flash Player即可。如果您可以观看像优酷(youku)这样的视频网站,就说明您有Flash Player。如果您的Flash Player是旧版本,系统会提示您安装新的版本。二.游戏注册点击游戏主页右上方的“进入游戏”,经过一段时间的页面载入(第一次运行本游戏时页面加载速度会比较慢,请耐心等待)您将进入注册页面,填写信息,然后点击“开始游戏”即可完成注册。三.第一场战斗注册完成后您将会进入到一个专门的战场中,其中的玩家和您的经验等同,也是新兵等级。在这里新手玩家能够熟悉环境,了解游戏界面操作,以及领会进行游戏的方法。四.操作指南3D坦克通过键盘进行操作(上、下、左、右箭头),按空格键开炮,炮塔转向 – Z、X键。新手指引 &上、下、左、右箭头或W、A、S、D键 – 坦克移动和转向。Z、X 或 &、& – 坦克炮塔转向左/右。C – 炮塔归位。空格键 – 开炮。1-5 – 使用道具(急救包,双倍护甲,双倍伤害,引擎加速,地雷)。Enter – 进行聊天,再次点击Enter – 发送消息。Ctrl + Enter 或 Т – 团队聊天。F – 丢下旗帜(在互夺军旗的模式下可用)。Tab – 查看分数,在表格中显示加入的人员及其作战效能。Del – 在没有输赢的情况下坦克自毁,例如坦克翻车后点击键盘上的删除键Delete自杀,可重新开始游戏。P 或 Pause – 暂停。+ / – - 扩大缩小游戏窗口大小。窗口越小,游戏运行速度越快。PageUp / PageDown – 视角调整。需要注意的是,同时按许多键可能导致电脑程序问题,特别是当使用上、下、左、右箭头移动坦克的时候。如果出现坦克无法开炮,或炮塔无法转动的情况时,可以刷新页面。
参考资料:
[1] 新手指引
百科的文章(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于。
有一定了解!希望更多人认识!

我要回帖

更多关于 unity3d场景模型下载 的文章

 

随机推荐