游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2882|回复: 5

菜鸟向大虾们求助,欢迎大虾们指点,3Q......

[复制链接]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-4-5 04:59:00 | 显示全部楼层 |阅读模式
  我曾经在网上找到一个vb原代码,功能是鼠标在窗体任意地方点一下,窗体中的一个图标控件
就会渐渐移动到鼠标点过的地方停下,并且能根据移动方向更改图标,只是短短几行代码就实现了.以前我没在意,现在想在网上找这个代码却再也找不到了....... [em7] [em7] [em7]
  希望大侠们能帮写个给我,菜鸟在此先谢谢了.
                                                                                            [em13] [em13] [em13]
                                                                                            云雀儿
                                                                                            2005-4-5  

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-4-5 10:20:00 | 显示全部楼层

Re:菜鸟向大虾们求助,欢迎大虾们指点,3Q......

放一个定时器作定时刷新
放一个全局变量记录鼠标点过的位置!
在定时器里检查图标控件位置和鼠标点击位置,以限制的最大速度移动过去!
至于换图标,就是计算运动方向,再分到几个方向上!然后根据方向换图标!
这种建议自己实践一下,不难,且是不错的学习!

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2005-4-5 21:24:00 | 显示全部楼层

Re:菜鸟向大虾们求助,欢迎大虾们指点,3Q......

谢谢这位大哥的鼓励,我知道这个问题很不入道,可是我被这个“运动方向”困扰快半年了,都没信心了,希望这位大哥能简单的写几行实现的代码。。。。。。:):):)


浪费大哥宝贵的时间,不好意思。。。。。。


                                                                                             
                                                                                             
                                                                                            云雀儿
                                                                                            2005-4-5

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-4-5 22:06:00 | 显示全部楼层

Re:菜鸟向大虾们求助,欢迎大虾们指点,3Q......

.............对不起哦,本来回帖时就该写点代码的,失职失职!
无奈今天生物节律全部最低点,头都晕了,呵呵,不入流的借口!
现在马上补上代码!

还是先说说理论吧!要不我自己也晕了!那我就说一个任意角度的模型!
先努力回想一下屏幕坐标系!左上为0,向右下延展!显然是个90度的坐标系!
我们要考虑方向问题,就是360度的,根据原有坐标系平移,我们最容易得到一个
x轴正方向朝右,y轴正方向向下的二维坐标系!这显然和数学上不符,可是这种
只需要平移的坐标系是最不容易出错的,不习惯的话,将y轴乘 -1就好了!

我们要解决的就是一个方向问题!所有的向量都被简化成一个从坐标原点向坐标的射线!
但是向量表示的方向是2维化的,我们需要一个一维化的方向来和我们的图标序列对应起来!

这靠向量本身是无法作到的,我们需要一个对照向量A,以我们的方向向量和A的夹角来描述这个一维化方向!选某个轴作为对照向量吧!这样就能偷懒了,会简化掉很多计算!


再来总结一下,我们要解决一个方向问题,将移动方向转化成一个一维数据,然后将他和图标序列对应,只要用 目的坐标 - 现在坐标 = 预计偏移量
或者用 现在坐标 - 上次坐标 = 偏移量  ,这完全取决于你的移动细节处理方式!
这个偏移量,就是我们在新坐标系中的移动方向,我们的二维向量(如果你要乘-1换坐标系,就现在)
然后找个对应的向量,就(1,0)吧,这个最简单,可以偷很多懒!
然后就用偏移量的 y/x 好了,关键问题都解决了!

还是再解释一下,偏移量的y,就是偏移坐标到对照向量的投影长度,就是我们所求角度的对边,x是邻边,y/x是正切,用反正切函数求出角度!
如果x<0,就将角度结果+180,如果结果小于0,就将角度结果+360

我们会得到以x轴正方向(右)为零,顺时针增加的从0-360度的角度值,如果你只需要8方向,除以45!


140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-4-5 22:42:00 | 显示全部楼层

Re:菜鸟向大虾们求助,欢迎大虾们指点,3Q......

Dim mX As Single    '记录的上一次坐标
Dim mY As Single    '
Dim OnceMove As Single '一次移动最大值
Dim pi As Single       '数学中的pi值


Private Sub Form_Load()
mX = Label1.Left '对齐坐标,防止盲目移动
mY = Label1.Top  '
pi = 3.1415927   '给pi值
OnceMove = 5     '最大移动值
Timer1.Enabled = True  '设置时钟
Timer1.Interval = 100
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    mX = X      '存储坐标
    mY = Y
End Sub

Private Sub Timer1_Timer()
   
    Dim tx As Single '偏移量
    Dim ty As Single
   
    tx = mX - Label1.Left '计算偏移量
    ty = mY - Label1.Top
    If tx = 0 And ty = 0 Then Exit Sub '特殊情况中止
    If (tx * tx + ty * ty) > (OnceMove * OnceMove) Then '移动超范围,归一
        Dim si As Single '缩放系数 使得 (tx*tx+ty*ty)*si=(OnceMove * OnceMove)
        si = OnceMove / (tx * tx + ty * ty) '使得 (tx*tx+ty*ty)*si=(OnceMove * OnceMove)
        si = Sqr(si) '使得 (tx*si*tx*si+ty*si*ty*si)=(OnceMove * OnceMove)
        tx = tx * si '按系数缩放
        ty = ty * si
    End If
    Label1.Left = Label1.Left + tx '移动
    Label1.Top = Label1.Top + ty
   
    Dim np As Single '一维移动方向
    If tx = 0 Then  '两个正切无法计算的角度
       If ty > 0 Then np = 90
       If ty < 0 Then np = 270
    Else
       np = Atn(ty / tx) '反正切求角度,结果是弧度
       np = np * 180 / pi '弧度转角度
       If tx < 0 Then np = np + 180  '二、三象限结果一维化
       If np < 0 Then np = np + 360  '四象限结果一维化
    End If
    Label1.Caption = Int(np) '显示结果
   
   
End Sub

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-4-5 22:46:00 | 显示全部楼层

Re:菜鸟向大虾们求助,欢迎大虾们指点,3Q......

以上程序,需要主窗体以FORM_LOAD启动,需要名为TIMER1的定时器控件!
需要名为label1的标签控件,label1为可见,窗体的scalemode设置为以像素计算(3-pixel)
如果还需要更换图标,我再加!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 03:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表