标题: 实现用JS移动图片遇到障碍物图片即绕路?
lyx789
准骑士
Rank: 18Rank: 18Rank: 18Rank: 18



UID 9809
精华 0
积分 314
帖子 25
威望 0
现金 2539 银币
金币 0 金币
阅读权限 40
注册 2006-12-22
状态 离线
发表于 2007-1-20 10:16  资料  个人空间  短消息 

江湖霸业
实现用JS移动图片遇到障碍物图片即绕路?


我想实现用JS移动图片时,在页面中设置障碍物,当遇到障碍物时图片即自动绕路移动,
请问障碍物该如何设置呢?
烦请各位指点一下!!谢谢咯...[在线急等中!!!]

<HTML><HEAD><TITLE>人物移动</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
</head>
<body>
<span id="debug" style="position:absolute;left=0;top=0;z-index:0"></span>
<span id="debug2" style="position:absolute;left=0;top=0;z-index:1"></span>
<table border=1>
<tr>
<td>
<span id="span_main" style="position:absolute;left=0;top=0;OVERFLOW:hidden;width:575px;height:384px;background-color:#efefef;">
<!--背景-->
<span id="bj" style="position:absolute;left=0;top=0;width:575px;height:384px;">
<table width="100%" height="100%" border="1" cellspacing="0" cellpadding="0"><tr><td></td></tr></table>
</span>
<!--角色-->
<SPAN id=spn1 style="position:absolute;left=0;top=0;OVERFLOW: hidden; WIDTH: 64px; HEIGHT: 64px;filter:Glow(strength=12,color=red);"><IMG src="images/play_move/1.gif"></SPAN>
<script>
i = 0;
function move_test(){
        i++;
        span_main.scrollLeft = i;
        //alert(span_main.scrollTop);
        
        setTimeout("move_test();",100);
}
//move_test();

//document.onmousemove=new Function("window.status=event.x+','+event.y;");
var target_posx=1,target_posy=1,theTimeout=0,theTimeout2=0;
document.onmousemove = view_pos;
function view_pos(){
    window.status = (parseInt(event.x)-64)+","+(parseInt(event.y)-64)+"|"+event.offsetX+","+event.offsetY;
}

if (document.all)
document.body.onmousedown = set_pos;
function set_pos(){
        if(parseInt(event.x) > 570 || parseInt(event.x) < 0 || parseInt(event.y) >384 || parseInt(event.y) < 0){
                return;
        }
        //目标坐标留出人物的高宽...不要走到屏幕外面
    target_posx = parseInt(event.offsetX-32);
    target_posy = parseInt(event.offsetY-48);
        
   
    clearTimeout(theTimeout);
    move();
        //move_screen();
debug2.innerHTML = "X:"+target_posx+"Y:"+target_posy+"[目的地]";
}

function move(){
    var bc = 8;
    var a_bc = 0;
    var b_bc = 0;
    var a = 0;
    var b = 0;
    var c = 0;
   
    now_posx = parseInt(spn1.style.left);
    now_posy = parseInt(spn1.style.top);
    a = Math.abs(target_posx-now_posx);
    b = Math.abs(target_posy-now_posy);
   
    c = Math.ceil(Math.sqrt(a*a+b*b))
    //document.write("a is"+a+"<br>b is"+b+"<br>c is "+c);
    a_bc = (a/c)*bc;
    b_bc = (b/c)*bc;
   
   
   
    if(isNaN(a_bc) && isNaN(b_bc)){
                spn1.scrollLeft = 0;
        clearTimeout(theTimeout2);
        clearTimeout(theTimeout);
        theTimeout2 = 0;
        return;
               
                /***自动走***/
        //target_posx= Math.round(Math.random()*800);
        //target_posy = Math.round(Math.random()*500);
        //theTimeout = setTimeout("move();",100);
   
        }else{
                //document.write(a_bc+"<br>"+b_bc);
                //调定角色方向
                var dir = set_dir(now_posx,now_posy,target_posx,target_posy);
                spn1.scrollTop = (dir-1) * 64;

                debug.innerHTML = "topx="+target_posx+"/lefty="+target_posy+"<br>x边长:"+a+"<br>y边长"+b+"<br>斜边长:"+c+"<br>X步长 is"+a_bc+"<br>Y步长 is"+b_bc+"<br>方向:"+dir+"<br>now_posx:"+now_posx+"<br>now_posy"+now_posy+"<br>target_posx"+target_posx+"<br>target_posy"+target_posy;
               
                if(now_posx != target_posx){
                        
                        if(now_posx > target_posx){
                                now_posx -= a_bc;
                                if(now_posx <= target_posx){
                                        now_posx = target_posx;
                                }
                                spn1.style.left = now_posx;
                                //span_main.scrollLeft -= a_bc;
                                //span_main.scrollLeft = now_posx;
                                
                        }else{
                                now_posx += a_bc;
                                if(now_posx >= target_posx){
                                        now_posx = target_posx;
                                }
                                spn1.style.left = now_posx;
                                //span_main.scrollLeft += a_bc;
                                //span_main.scrollLeft = now_posx;
                        }
                }
                if(now_posy != target_posy){
                        if(now_posy > target_posy){
                                now_posy -= b_bc;
                                if(now_posy <= target_posy){
                                        now_posy = target_posy;
                                }
                                spn1.style.top = now_posy;
                                //span_main.scrollTop -= b_bc;
                                //span_main.scrollLeft = now_posy;
                        }else{
                                now_posy += b_bc;
                                if(now_posy >= target_posy){
                                        now_posy = target_posy;
                                }
                                spn1.style.top = now_posy;
                                //span_main.scrollTop += b_bc;
                                //span_main.scrollLeft = now_posy;
                        }
                }

                //alert(span_main.scrollHeight);
                //alert(span_main.scrollWidth);
                span_main.scrollLeft = parseInt(now_posx) - (parseInt(span_main.style.width)/2);
                span_main.scrollTop  = parseInt(now_posy) - ((parseInt(span_main.style.height)/2) - 64);

                //这里设定镜头的位置,使角色在正中央
                /*
                while(parseInt(now_posx) != parseInt((parseInt(span_main.style.width)/2-16))){
                        if(parseInt(now_posx) > parseInt((parseInt(span_main.style.width)/2-16))){
                                span_main.scrollLeft ++;
                                next_scroll = span_main.scrollLeft ++;
                                if(parseInt(span_main.scrollLeft) == next_scroll){
                                        break;
                                }
                        }else{
                                span_main.scrollLeft --;
                                if(parseInt(span_main.scrollLeft) == 0){
                                        break;
                                }
                        }
                }
                //这里设定镜头的位置,使角色在正中央
                while(parseInt(now_posy) != parseInt((parseInt(span_main.style.height)/2-32))){
                        if(parseInt(now_posy) > parseInt((parseInt(span_main.style.height)/2-64))){
                                span_main.scrollTop ++;
                                next_scroll = span_main.scrollTop ++;
                                if(parseInt(span_main.scrollTop) == next_scroll){
                                        break;
                                }
                        }else{
                                span_main.scrollTop --;
                                if(parseInt(span_main.scrollTop) == 0){
                                        break;
                                }
                        }
                }
*/

        if(theTimeout2 == 0){
            theTimeout2 = setTimeout("show_a();",150);
        }
               
        theTimeout = setTimeout("move();",100);
    }
    return;
}

//调定角色方向
function set_dir(now_posx,now_posy,target_posx,target_posy){
   
    var dir;
    if(target_posx > now_posx){
        
        if(target_posy > now_posy){
            dir = 6;
        }
        if(target_posy == now_posy){
            dir = 3;
        }
        if(target_posy < now_posy){
            dir = 8;
        }
    }
    if(target_posx < now_posx){
        
        if(target_posy > now_posy){
            dir = 5;
        }
        if(target_posy == now_posy){
            dir = 2;
        }
        if(target_posy < now_posy){
            dir = 7;
        }
    }
    if(target_posx == now_posx){
        
        if(target_posy > now_posy){
            dir = 1;
        }
        if(target_posy < now_posy){
            dir = 4;
        }
    }
    return dir;
}
i = 0;
function show_a(){
i += 64;
//alert(i);
    if(i<=128){
        spn1.scrollLeft = i;
    }else{
        i = 64;
        spn1.scrollLeft = i;
    }
    theTimeout2 = setTimeout("show_a();",150);
}
/**自动走第一步**/
//move();
//定义角色初始位置;
spn1.style.left = parseInt(span_main.style.width) / 2 - 135;
spn1.style.top  = parseInt(span_main.style.height) / 2 - 70;
</script>
</body>
</html>



顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
灰色世界 (灰灰)
超级版主
rebel 核心
Rank: 81Rank: 81Rank: 81Rank: 81


UID 2958
精华 4
积分 17914
帖子 3630
威望 9
现金 24818 银币
金币 0 金币
阅读权限 150
注册 2006-10-6
状态 离线
发表于 2007-1-22 18:40  资料  个人空间  短消息 

帮忙顶一下……可惜我不会JS






加勒比海盗2
顶部
tonger
版主
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68


UID 2435
精华 0
积分 4168
帖子 86
威望 0
现金 17912 银币
金币 0 金币
阅读权限 120
注册 2006-9-21
状态 离线
发表于 2007-1-23 09:58  资料  个人空间  短消息 

楼主参考下这个游戏吧

http://sword.jsuper.com/

顶部
[广告] 玩游戏已经不算什么啦,来自己做游戏喽!你来他来我也来!
magnil (Erynnyes)
大贵族
rebel 核心
rebel 船员
Rank: 72Rank: 72
Harmonious One


帝国元帅(OGame勋章)   特殊贡献者(全局勋章)  
UID 9
精华 6
积分 29988
帖子 8200
威望 10
现金 62 银币
金币 0 金币
阅读权限 120
注册 2006-4-2
状态 离线
发表于 2007-1-23 12:52  资料  个人空间  短消息 

这个游戏太强了……居然用JS做ARPG……

不过他不是简单的设置障碍物……很显然地图分了层……



 附件: 您所在的用户组无法下载或查看附件




爱,所以离开。
==============================
To live on no evil is to live a lone life.
生活无恶不辜负独行人生   
                                              ——by Google
顶部
[广告] 那啥,不回老家结婚的就来DOTA吧!
tonger
版主
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68


UID 2435
精华 0
积分 4168
帖子 86
威望 0
现金 17912 银币
金币 0 金币
阅读权限 120
注册 2006-9-21
状态 离线
发表于 2007-1-23 14:24  资料  个人空间  短消息 

呵呵,确实很强!

顶部
[广告] 绿豆蛙四格漫画填字活动
lyx789
准骑士
Rank: 18Rank: 18Rank: 18Rank: 18



UID 9809
精华 0
积分 314
帖子 25
威望 0
现金 2539 银币
金币 0 金币
阅读权限 40
注册 2006-12-22
状态 离线
发表于 2007-1-24 14:23  资料  个人空间  短消息 

这个问题我已经等了N天了。。。
难道真没有人可以帮我。。。那个WEB剑侠的游戏我看过了

可是自己一个人没法把代码分离出来

顶部
lein
老兵
Rank: 9Rank: 9



UID 13537
精华 0
积分 200
帖子 16
威望 0
现金 2502 银币
金币 0 金币
阅读权限 30
注册 2007-2-1
状态 离线
发表于 2007-2-5 11:47  资料  个人空间  短消息 

你的问题听起来像一个寻道问题。这方面有很多现成的算法。比较常用的是A*算法,可以去查一下相关的文章。
至于设置障碍只要引入地图的概念就可以了。
当然,系统地学一下游戏开发技术会很非常有帮助。

[ 本帖最后由 lein 于 2007-2-5 11:49 编辑 ]

顶部
蜡笔小黑
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40
XE的怪蜀黍


UID 12951
精华 0
积分 3728
帖子 895
威望 0
现金 6881 银币
金币 0 金币
阅读权限 60
注册 2007-1-24
来自 utopia
状态 离线
发表于 2007-2-5 18:11  资料  个人空间  主页 短消息  添加 蜡笔小黑 为MSN好友 通过MSN和 蜡笔小黑 交谈 QQ

从IE缓存里找得到一些源代码,快过年了,整天喝得昏天暗地的,没空分析.

谁有空找来分析下吧,整套的代码和图片好象都在缓存里.虽然不可能拿到XML文件,但动画引擎应该拿得到的.代码好长...又米注释,懒得看鸟

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
lyx789
准骑士
Rank: 18Rank: 18Rank: 18Rank: 18



UID 9809
精华 0
积分 314
帖子 25
威望 0
现金 2539 银币
金币 0 金币
阅读权限 40
注册 2006-12-22
状态 离线
发表于 2007-2-18 01:38  资料  个人空间  短消息 

期待春节后有高手大发慈悲,给偶指点一下

顶部
 



当前时区 GMT+8, 现在时间是 2008-10-16 06:53
沪ICP备06036464号

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 Licensed  © 2001-2007 Comsenz Inc.
Processed in 0.062861 second(s), 11 queries , Gzip enabled

清除 Cookies - 联系我们 - Chinese Webgame BBS 中国网页游戏论坛 - Archiver - WAP