游戏实例——简单小地图制作

任何的学习,光看不练是学不好的。所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图。在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图。主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动。那怎么实现咧?

首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图。第二个就是主角的位置大贴图。在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来控制主角的移动。右上角小地图,中间的红色矩形代表着主角。通过小地图的宽,高,与真是地图的宽高计算出缩放比例,从而根据缩放比例来确定主角在小地图中的位置。

代码:

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Script_04_17 : MonoBehaviour   
  5. {  
  6.       
  7.     //大地图地形对象  
  8.     GameObject plane;  
  9.     //大地图主角对象  
  10.     GameObject cube;  
  11.       
  12.     //大地图的宽度  
  13.     float mapWidth;  
  14.     //大地图的高度  
  15.     float mapHeight;  
  16.     //地图边界的检测数值  
  17.     float widthCheck;  
  18.     float heightCheck;  
  19.       
  20.     //小地图主角的位置  
  21.     float mapcube_x =0;  
  22.     float mapcube_y = 0;  
  23.       
  24.       
  25.     //GUI按钮是否被按下  
  26.     bool keyUp;  
  27.     bool keyDown;  
  28.     bool keyLeft;  
  29.     bool keyRight;  
  30.       
  31.     //小地图的背景贴图  
  32.     public Texture map;  
  33.     //小地图的主角贴图  
  34.     public Texture map_cube;  
  35.       
  36.     void Start()  
  37.     {  
  38.         //得到大地图对象  
  39.         plane = GameObject.Find("Plane");  
  40.         //得到大地图主角对象  
  41.         cube = GameObject.Find("Cube");  
  42.         //得到大地图默认宽度  
  43.         float size_x = plane.GetComponent<MeshFilter>().mesh.bounds.size.x;  
  44.         //得到大地图宽度的缩放比例  
  45.         float scal_x = plane.transform.localScale.x;  
  46.         //得到大地图默认高度  
  47.         float size_z = plane.GetComponent<MeshFilter>().mesh.bounds.size.z;  
  48.         //得到大地图高度缩放地理  
  49.         float scal_z = plane.transform.localScale.z;  
  50.           
  51.         //原始宽度乘以缩放比例计算出真实宽度  
  52.         mapWidth = size_x * scal_x;  
  53.         mapHeight = size_z * scal_z;  
  54.           
  55.         //越界监测的宽度  
  56.         widthCheck = mapWidth / 2;  
  57.         heightCheck = mapHeight / 2;  
  58.           
  59.         check();  
  60.     }  
  61.       
  62.     void OnGUI()  
  63.     {  
  64.         keyUp = GUILayout.RepeatButton("向前移动");  
  65.   
  66.         keyDown = GUILayout.RepeatButton("向后移动");  
  67.           
  68.         keyLeft = GUILayout.RepeatButton("向左移动");  
  69.           
  70.         keyRight = GUILayout.RepeatButton("向右移动");  
  71.           
  72.         //绘制小地图背景  
  73.         GUI.DrawTexture(new Rect(Screen.width - map.width,0,map.width,map.height),map);  
  74.         //绘制小地图上的“主角”  
  75.         GUI.DrawTexture(new Rect(mapcube_x,mapcube_y,map_cube.width,map_cube.height),map_cube);  
  76.     }  
  77.       
  78.     void FixedUpdate()  
  79.     {  
  80.           
  81.   
  82.         if(keyUp)  
  83.         {  
  84.             //向前移动  
  85.             cube.transform.Translate(Vector3.forward * Time.deltaTime *5);   
  86.             check();  
  87.       
  88.         }  
  89.           
  90.         if(keyDown)  
  91.         {  
  92.             //向后移动  
  93.             cube.transform.Translate(-Vector3.forward * Time.deltaTime *5);   
  94.             check();  
  95.         }  
  96.           
  97.         if(keyLeft)  
  98.         {  
  99.             //向左移动  
  100.             cube.transform.Translate(-Vector3.right * Time.deltaTime *5);    
  101.             check();  
  102.         }  
  103.           
  104.         if(keyRight)  
  105.         {  
  106.             //向右移动  
  107.             cube.transform.Translate(Vector3.right * Time.deltaTime *5);   
  108.             check();  
  109.         }  
  110.        
  111.           
  112.           
  113.           
  114.     }  
  115.       
  116.     //越界检测  
  117.     void check()  
  118.     {  
  119.         //得到当前主角在地图中的坐标  
  120.         float x = cube.transform.position.x;  
  121.         float z = cube.transform.position.z;  
  122.           
  123.         //当控制主角超过地图范围时,重新计算主角坐标  
  124.         if(x >= widthCheck)  
  125.         {  
  126.             x = widthCheck;  
  127.         }  
  128.         if(x <= -widthCheck)  
  129.         {  
  130.             x = -widthCheck;  
  131.         }  
  132.         if(z >= heightCheck)  
  133.         {  
  134.             z = heightCheck;  
  135.         }  
  136.         if(z <= -heightCheck)  
  137.         {  
  138.             z = -heightCheck;  
  139.         }  
  140.           
  141.         cube.transform.position = new Vector3(x,cube.transform.position.y,z);  
  142.           
  143.         //根据比例计算小地图“主角”的坐标  
  144.         mapcube_x = (map.width/mapWidth * x) + ((map.width / 2) - (map_cube.width/2)) + (Screen.width - map.width);  
  145.         mapcube_y =map.height - ((map.height/mapHeight * z) + (map.height / 2));  
  146.     }  
  147. }  
运行:


点击按钮后:


这只是一个非常非常基本的例子,在后面,会慢慢学到使用unity制作的地图,而不是一个简单的平面。但基本的原理和思想是相同的,花两个贴图,根据两张图的比例来计算小地图主角位置。然后注意下主角的边界监测。就是这样。以后的unity学习笔记会接触到游戏元素这方面的知识了。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mapreduce实例-WordCount是一个经典的MapReduce程序,用于统计文本中每个单词出现的次数。它的工作原理是将输入的文本划分为多个片段,每个片段由多个键值对组成,其中键是单词,值是1。然后通过Map阶段将每个片段中的单词提取出来,并将每个单词映射为键值对,其中键是单词,值是1。接下来,通过Shuffle和Sort阶段将具有相同单词的键值对聚集在一起。最后,通过Reduce阶段将相同单词的计数值进行累加,得到每个单词的总次数。 以下是一个示例代码片段,展示了WordCount程序的基本结构和关键组件: ```java import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Job job = Job.getInstance(); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值