精华内容
下载资源
问答
  • 2021-12-29 15:41:33

    开了一个项目坑,弹幕玩游戏,后续会不断优化

    哔哩哔哩直播,二次元弹幕直播平台

    优化日志

    • 实现俄罗斯方块游戏【12-27完成】
    • 实现第1版弹幕处理模块,只有爬取消息功能【12-27完成】
    • 优化俄罗斯方块游戏,使得可以同时处理多条移动指令【12-28完成】
    • 实现第2版弹幕处理模块,实现爬取和发送功能【12-28完成】
    • 整理代码模块,添加公共消息队列类,用来全局处理数据【12-29完成】
    • 代码模块化,分成游戏,弹幕,数据库文件夹【12-29完成】
    • 加一个日志文件夹,一个弹幕日志,一个其他日志,代码注意单例模式 【12-29完成】

    • 加一个配置全局变量代码文件,把需要经常修改的配置放里面。比如数据库文件名,roomId,cookie等,然后其他代码来引用它【12-29完成】

    • 新建一个博客专栏,记录自己的项目【12-29完成】
    • 修改游戏mainwindow,与新弹幕处理模块融合【12-29完成】
    • 修改文本显示,BGM字体太大【12-29完成】
    • 加数据库,记录弹幕

    ##git命令
    git add .
    git commit -m "添加readme"
    git push origin master

    更多相关内容
  • B站弹幕源码

    2015-07-07 07:50:27
    当下最火的弹幕源码...有兴趣的可以下载来看看
  • android 源码学习
  • 导出游戏 导出报错解决 学校老师给了个主题是Ten Seconds,所以就写了一个弹幕游戏。 主题就是生存十秒,第一次写了一个完整的小游戏,之前的游戏都没有封面UI什么的,基本只实现了逻辑。 效果预览 选关界面: ...


    学校老师给了个主题是Ten Seconds,所以就写了一个弹幕游戏。
    主题就是生存十秒,第一次写了一个完整的小游戏,之前的游戏都没有封面UI什么的,基本只实现了逻辑。

    效果预览

    在这里插入图片描述
    选关界面:
    (总共搞了14个关卡,每章内容是一个主题,到下一章主题会改变,主题是在每一个关卡生存十秒,生存成功即可进入下一关)
    在这里插入图片描述
    选择不敢就会退出游戏

    关卡:
    第一章:
    在这里插入图片描述
    第二章:

    disanz在这里插入图片描述
    第三章:
    从这里开始物体会跟随在这里插入图片描述

    第四章:物体会追踪玩家的球
    在这里插入图片描述

    搭建场景和贴图很简单就不说了

    物体移动

    给物体添加角色控制器,然后挂接脚本
    PlayerMove.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerMove : MonoBehaviour
    {
        public float speed = 10;
        private CharacterController controller;
        // Start is called before the first frame update
        void Start()
        {
            controller = GetComponent<CharacterController>();
        }
    
        // Update is called once per frame
        void Update()
        {
            float x, z;
            x = Input.GetAxis("Horizontal");
            z = Input.GetAxis("Vertical");
            Vector3 move;
            move = transform.right * x * Time.deltaTime * speed + transform.forward * z * Time.deltaTime * speed;
            controller.Move(move);
        }
    }
    
    

    弹幕发射

    挂接在中心的cube身上
    在这里插入图片描述

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CubeRotate : MonoBehaviour
    {
        private float rotation = 0;
        public float rotateSpeed = 2;
        public float Timer = 0.5f;
        public GameObject bullet;
        public float rotaAngle = 0;
        public float shootTime = 1f;
        public float shootnum=36;
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            Timer += Time.deltaTime;
    
            rotation += Timer * rotateSpeed;
            transform.Rotate(new Vector3(0, rotation, 0));//让中心的物体旋转
            if (Timer >= shootTime)
            {
                rotaAngle += 25;//每次发射的球都会发生些许偏移的角度
                Timer -= shootTime;
                for (int i = 0; i < shootnum; i++)
                {
                    Quaternion rotateAngle = Quaternion.Euler(0, i * (360/shootnum) + rotaAngle, 0);
                    Instantiate(bullet, transform.position, rotateAngle);
                }
    
            }
    
        }
    }
    
    

    (这里需要注意一点,由于界面是俯视界面,但是在球发射的时候可能和人不在一个高度上导致无法射中,所以可以从低空的平视来看看是不是在一个平面上)

    子弹预制件

    在这里插入图片描述

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class BulletMove : MonoBehaviour
    {
        public float BulletSpeed = 5;
        private float Timer = 0;
        public GameObject Bullet;
    
        // Start is called before the first frame update
        void Start()
        {
            GameObject.Destroy(Bullet, 6.0f);//六秒后自动销毁
        }
        private void FixedUpdate()
        {
            transform.position = transform.position + transform.forward * Time.fixedDeltaTime * BulletSpeed;
        }
    
        // Update is called once per frame
        private void OnTriggerEnter(Collider other)
        {
            if (other.tag == "Bullet")//防止子弹碰到子弹然后导致子弹消失
            {
                return;
            }
            else
            {
                if (other.gameObject.tag == "Player")
                {
                    Destroy(other.gameObject);
                    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);//重新加载当前场景
                }
                Destroy(this.gameObject);
            }
    
    
        }
    }
    
    

    倒计时

    添加一个text在合适的位置,然后挂接以下脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class ChangeText : MonoBehaviour
    {
        public Text daojishitext;
        public float Timer=0;
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        // Update is called once per frame
        void Update()
        {
            Timer += Time.deltaTime;
            float NowTime = 10.4f - Timer;
            daojishitext.text = NowTime.ToString(); 
        }
    }
    
    

    在这里插入图片描述

    到这里就可以实现一个最简单的弹幕游戏了,接下来为游戏添加一些功能来完善

    场景切换

    首先需要在File-Build Settings将场景导入,并且场景具有下标
    在这里插入图片描述

    手动换关

    在选关界面,设置好了背景之后,需要通过一个画布来实现:
    在这里插入图片描述
    创建一个Panel,(在UI中)
    然后添加一个Grid Layout布局
    在这里插入图片描述
    然后其子组件由多个按钮组成:
    在这里插入图片描述
    然后想要使得按下按钮实现关卡切换,需要这样:
    首先书写一个脚本里的函数实现关卡切换:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class LL1 : MonoBehaviour
    {
        public void LL()
        {
            SceneManager.LoadScene("Level1-1");//直接加载对应名字的关卡,这里也可以直接用数字代表关卡的下标
        }
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    }
    
    

    不要忘了引入头文件:

    using UnityEngine.SceneManagement;
    

    然后我们可以将这个脚本拖拽给按钮的“on click”:
    在这里插入图片描述

    但是直接拖拽就会发现无法成功,没有对应函数

    我们只能先将脚本挂接在一个空物体上,然后将空物体拖拽给onclick,然后选择按下onclick时会发生的函数,也就是我们上面写好的脚本
    在这里插入图片描述
    同理 其他的关卡选择也是一样的,只是重复的机械操作,这里不再赘述。

    自动进入下一关

    并且由于主题是ten seconds,意味着只要当时间超过十秒时,就会自动进入下一个场景,因此在每个场景中创建一个空物体然后挂接以下类似的脚本跳转到下一关:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class TenSecondsEnd1 : MonoBehaviour
    {
        private float Timer;
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            Timer += Time.deltaTime;
            if (Timer > 10)
            {
                SceneManager.LoadScene("Level1-2");
            }
        }
    }
    
    

    退出游戏

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    public class QuitGame : MonoBehaviour
    {
        public void Quit()
        {
            //UnityEditor.EditorApplication.isPlaying = false;
            Application.Quit();
        }
    
    }
    
    

    然后按下退出按钮时调用脚本中的函数即可

    音乐播放

    在场景中的音乐只需要创建空物体然后挂接组件即可:
    在这里插入图片描述

    全局音乐

    除此之外,还需要一个自游戏开始时贯穿整个游戏的背景音乐:
    参考这篇文章实现:
    http://www.voidcn.com/article/p-xaletxkq-bdc.html
    需要实现的有两点:

    1. 在主界面时播放音乐
    2. 跨场景继续播放音乐
    3. 再次回到主界面时不会重复播放一样的音乐(防止出现禁忌の二重存在
    4. 循环播放

    下面我们使用较为规范的方式来实现,也就是尽可能通过代码直接实现而不是在unity中挂接组件拖拽音乐的方式实现。
    需要四个脚本:

    1. 存放音乐名的类
    2. 音乐控制/播放器(专门用来播放特定音乐的)
    3. 音乐管理器(创建一个实例,让管理器这个实例添加音乐控制器的脚本,这样就可以实现一个管理器包含多个音乐播放器)
    4. 用一个脚本来创建音乐管理器的实例

    音乐名的存放

    首先将背景音乐放到文件夹下:
    在这里插入图片描述
    虽然可以通过拖入音乐的方式来实现,不过这里想通过脚本的方式自动装载音乐(事实上,在以后公司里这样的代码应该更加规范吧(?),所以需要这样:
    我们可以将音乐的名字存放在类中,方便在代码中直接调用:

    using UnityEngine;
    using System.Collections;
    
    public class Global
    {
        public static string musicName="bgMusic";
    }
    

    音乐控制/播放器

    创建一个空物体,挂接Audio Source组件,然后将音乐拖入至Audio Clip即可播放音乐
    在这里插入图片描述

    这是在unity中的方式,下面使用代码来实现:

    using UnityEngine;
    using System.Collections;
    
    [RequireComponent(typeof(AudioSource))]
    public class MusicController : MonoBehaviour
    {
        private AudioClip music;
        private AudioSource musicPlayer;
        void Awake()
        {
            //  获取 AudioSource
            musicPlayer = this.GetComponent<AudioSource>();
            //  打开单曲循环
            musicPlayer.loop = true;
            //  关闭开始时就播放的属性
            musicPlayer.playOnAwake = false;
    
        }
        void UpdateMusicSetting()
        {
            //  读取音乐
            music = (AudioClip)Resources.Load(Global.musicName);
            //  将读取到的音乐赋值给 audioClip
            musicPlayer.clip = music;
            //  播放
            musicPlayer.Play();
        }
        void Start()
        {
            UpdateMusicSetting();
        }
    }
    

    上面这段代码如何使用? 我们只需要创建一个实例,然后让这个实例添加这个脚本即可。

    音乐管理器

    一个音乐管理器可以添加多个音乐播放器,通过这个来实现

    AddComponent<MusicController>();
    

    通过这条语句来跨场景保留实例:

          DontDestroyOnLoad(instance);
    

    用这个判断防止重复创建:

    if (instance == null)
    
    using UnityEngine;
    using System.Collections;
    
    public class MusicManager : MonoBehaviour
    {
        private static MusicManager instance;
        private MusicManager() { }
        public static MusicManager GetInstance()
        {
            if (instance == null)
            {
                //  创建一个游戏对象,命名为 MusicPlayer
                GameObject musicPlayer = new GameObject("MusicPlayer");
                //  给 MusicPlayer 附上单例脚本
                instance = musicPlayer.AddComponent<MusicManager>();
                //  给 MusicPlayer 游戏对象添加音乐播放器脚本
                musicPlayer.AddComponent<MusicController>();
                //  跨场景不删除这个单例
                DontDestroyOnLoad(instance);
            }
            return instance;
        }
    }
    

    创建音乐管理器实例

    创建一个空物体,然后挂接这个脚本。这样的话就可以实现了全局音乐了,并且还有音乐管理器,播放器,分工合作而不是全部放在一个脚本里,方便代码复用。

    using UnityEngine;
    using System.Collections;
    
    public class Test : MonoBehaviour
    {
    
        void Start()
        {
            MusicManager.GetInstance();
        }
    }
    

    按照路线走的发射弹幕机

    在这里插入图片描述
    在这里插入图片描述

    首先需要设定好需要走的路,用目标路径点空物体来承接,然后这些物体挂接在父物体空物体上:
    在这里插入图片描述
    然后对plane烘焙导航在这里插入图片描述
    给发射弹幕机cube挂接组件:
    在这里插入图片描述
    巡逻脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    public class Patrol : MonoBehaviour
    {
        // Start is called before the first frame update
        public float patrolSpeed = 2f;
        public float patrolWaitTime = 0f;
        public Transform patrolWayPoints;
        private NavMeshAgent agent;
        private float patrolTimer;//这个用来记录当敌人达到路径点的时候 停留时间是多久
        private int wayPointIndex;//记录当前目标点是哪个路径点
        void Start()
        {
            agent = GetComponent<NavMeshAgent>();
        }
    
        // Update is called once per frame
        void Update()
        {
            Patrolling();
        }
        void Patrolling()
        {
            agent.isStopped = false;
            agent.speed = patrolSpeed;
            if (agent.remainingDistance <= agent.stoppingDistance)//由于可能这个物体并不是一分不差的到目的点的,我们可以用用一个范围表示冗余
            //当到达目的点时开始计算时间
            {
                patrolTimer += Time.deltaTime;
                if (patrolTimer >= patrolWaitTime)//如果等待时间已满,则进入下一个点
                {
                    if (wayPointIndex == patrolWayPoints.childCount - 1)
                    {
                        wayPointIndex = 0;
                    }
                    else
                    {
                        wayPointIndex++;
                    }
                    patrolTimer = 0;//由于切换完成 所以我们将这个time归零计算
                }
                //这里没有else 是因为如果没=等待时间没满则什么都不会做 只是单单的增加事件
            }
            else
            {
                patrolTimer = 0;
            }
            agent.destination = patrolWayPoints.GetChild(wayPointIndex).position;//Getchild方法可以获得这个东西的子物体
            //括号里面跟的是下标
        }
    
    }
    
    
    

    接下来把上面设定好的路径点传入:
    在这里插入图片描述

    会追踪的弹幕发射机

    在这里插入图片描述
    其实很简单 ,同样需要烘培导航平面和给物体挂接导航体,然后挂接以下脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    public class Chase : MonoBehaviour
    {
        private NavMeshAgent agent;
        public float chaseSpeed = 3f;//追踪的速度
        private bool PlayerInSight=false;
        public GameObject Player;
        // Start is called before the first frame update
        void Start()
        {
            agent = GetComponent<NavMeshAgent>();
        }
    
        // Update is called once per frame
        void Update()
        {
            Chasing();
        }
        private void Chasing()
        {
            double distance = Mathf.Sqrt(Mathf.Pow((transform.position.x - Player.transform.position.x), 2) + Mathf.Pow((transform.position.y - Player.transform.position.y), 2));
            agent.speed = chaseSpeed;
            if (distance > 3)
            {
                agent.destination = Player.transform.position;
            }
        }
    
    }
    
    

    在这里插入图片描述
    然后将玩家传入即可

    导出游戏

    在这里插入图片描述

    导出报错解决

    导出游戏时记得当初遇到了一个问题,报错提示:
    error CS0234: The type or namespace name ‘EditorApplication’ does not exist

    暂时不知道为什么,百度后解决方案:
    File→Build Settings→Player Settings→Player→OtherSettings中的
    在这里插入图片描述

    改成和原来不一样的那个,ctrl+s保存即可

    展开全文
  • 类库创建项目 使用NuGet导入Google.Protobuf库 生成项目
    • Protobuf Github地址:https://github.com/protocolbuffers/protobuf

    • 类库创建项目
      使用vs2019
      在这里插入图片描述
      在这里插入图片描述

    • 使用NuGet导入Google.Protobuf库
      在这里插入图片描述
      在这里插入图片描述
      在这里可以看到已经添加成功了
      在这里可以看到已经添加成功了

    • 生成项目
      在这里插入图片描述

    • 将生成的中的DLL文件复制进Unity项目中
      在按文件项目的 *\bin\Debug 文件夹中可以找到生成的6个DLL文件
      在这里插入图片描述
      将这四个DLL文件放入Unity项目中就可以使用Protobuf了

    展开全文
  • unity弹幕制作源码

    2016-10-11 11:38:49
    Unity模拟开发弹幕效果
  • 3.一键启动获取弹幕 4.打开里面的冲马桶 5.下载直播伴侣,点击获取窗口,点击开始直播 6.输入你的地址 7.完美运行 需要更多好的软件请私信我,或者查看我的频道,更多原创精品制作中。 下个预告是原创作品:云猜数字...
  • java弹幕游戏1.0版本

    2021-03-16 20:59:56
    java 弹幕游戏的最初版本,供大家参考,具体内容如下最近在学习javaSE,根据b站视频老师的讲解,也参考了他的代码,做了一个弹幕游戏,也增添了一些自己的代码进去,因为只是最简单的游戏体,以后会慢慢做完整,...

    java 弹幕小游戏的最初版本,供大家参考,具体内容如下

    最近在学习javaSE,根据b站视频老师的讲解,也参考了他的代码,做了一个弹幕小游戏,也增添了一些自己的代码进去,因为只是最简单的游戏体,以后会慢慢做完整,所以如果有错误,或者代码不够整洁的话,可以帮我改正,谢谢啦。

    父类

    import java.awt.*;

    public class GameObject {

    //游戏物体的父类

    Image img;

    double x,y;

    int speed = 3;

    int width,height;

    public void drawSelf(Graphics g){

    g.drawImage(img,(int)x,(int)y,null);

    }

    public GameObject(Image img, double x, double y, int X_speed,int Y_speed, int width, int height) {

    this.img = img;

    this.x = x;

    this.y = y;

    this.speed = speed;

    this.width = width;

    this.height = height;

    }

    public GameObject(Image img, double x, double y) {

    this.img = img;

    this.x = x;

    this.y = y;

    }

    public GameObject(){ }

    //返回物体所在的矩形,便于后续的碰撞检测

    public Rectangle getRect(){

    return new Rectangle((int)x,(int)y,width,height);

    }

    }

    弹幕类

    import com.sun.xml.internal.ws.model.wsdl.WSDLPortProperties;

    import java.awt.*;

    public class Shell extends GameObject {

    double degree;

    public Shell() {

    x = 200;

    y = 200;

    width = 10;

    height = 10;

    speed = 2;

    speed = 2;

    //弧度

    degree = Math.random()*Math.PI*2;

    }

    public void draw(Graphics g){

    Color c = g.getColor();

    g.setColor(Color.YELLOW);

    g.fillOval((int)x,(int)y,width,height);

    //炮弹沿着任意角度去飞

    x+=speed*Math.cos(degree);

    y+=speed*Math.sin(degree);

    if(x<0 || x> Constant.GAME_WIDTH-width){

    degree = Math.PI - degree;

    }

    if(y<40 || y> Constant.GAME_HEIGHT-height){

    degree = -degree;

    }

    g.setColor(c);

    }

    }

    飞机类

    import java.awt.*;

    import java.awt.event.KeyAdapter;

    import java.awt.event.KeyEvent;

    public class Plane extends GameObject{

    boolean left,right,up,down;

    boolean live = true; //飞机是否活着

    boolean leftflag,rightflag,upflag,downflag;//这些布尔值判断当碰到上下左右的边框时的状态

    //如果活着画出来

    public void drawSelf(Graphics g){

    if(live) {

    g.drawImage(img, (int) x, (int) y, null);

    //根据方向进行不同的移动

    if (left) {

    x -= speed;

    }

    if (right) {

    x += speed;

    }

    if (up) {

    y -= speed;

    }

    if (down) {

    y += speed;

    }

    }

    }

    public Plane(Image img,double x,double y) {

    this.img = img;

    this.x = x;

    this.y = y;

    this.speed = 3;

    this.width = img.getWidth(null);

    this.height = img.getHeight(null);

    }

    //按下某个键,增加相应的方向

    public void addDirection(KeyEvent e) {

    switch (e.getKeyCode()) {

    case KeyEvent.VK_LEFT:

    left = true;

    break;

    case KeyEvent.VK_UP:

    up = true;

    break;

    case KeyEvent.VK_RIGHT:

    right = true;

    break;

    case KeyEvent.VK_DOWN:

    down = true;

    break;

    }

    }

    //按下某个键,取消相应的方向

    public void minusDirection(KeyEvent e) {

    switch (e.getKeyCode()) {

    case KeyEvent.VK_LEFT:

    left = false;

    break;

    case KeyEvent.VK_UP:

    up = false;

    break;

    case KeyEvent.VK_RIGHT:

    right = false;

    break;

    case KeyEvent.VK_DOWN:

    down = false;

    break;

    }

    }

    }

    爆炸类

    import java.awt.*;

    //爆炸类

    public class Explode {

    double x,y; //爆炸的位置

    static Image[] imgs = new Image[16];

    static {

    for(int i=0;i<16;i++){

    imgs[i] = PlayGameFrame.GameUtil.getImage("image/explode/e"+(i+1)+".gif");

    imgs[i].getWidth(null);

    }

    }

    int count;

    public void draw(Graphics g){

    if(count <= 15){

    g.drawImage(imgs[count],(int)x,(int)y,null);

    count++;

    }

    }

    public Explode(double x,double y){

    this.x = x;

    this.y = y;

    }

    }

    常量类

    public class Constant {

    public static final int GAME_WIDTH = 500;

    public static final int GAME_HEIGHT = 500;

    }

    主类

    import jdk.internal.cmm.SystemResourcePressureImpl;

    import javax.imageio.ImageIO;

    import javax.swing.*;

    import java.awt.*;

    import java.awt.event.KeyAdapter;

    import java.awt.event.KeyEvent;

    import java.awt.event.WindowAdapter;

    import java.awt.event.WindowEvent;

    import java.awt.image.BufferedImage;

    import java.io.IOException;

    import java.net.URL;

    import java.awt.Rectangle;

    import java.util.Date;

    /**

    *飞机游戏的主窗口

    */

    class PlayGameFrame extends Frame {

    Image planeImg= GameUtil.getImage("image/plane.png");

    Image nightsky = GameUtil.getImage("image/nightsky.jpg");

    //定义飞机的坐标

    Plane plane = new Plane(planeImg,250,250);

    //定义炮弹

    Shell[] shells = new Shell[50];

    Explode boom;

    Date startTime = new Date();

    Date endTime;

    int period;//游戏持续的时间

    /**

    *画图

    */

    @Override

    public void paint(Graphics g) { //自动被调用,g这个变量相当于一个画笔

    Color c = g.getColor();

    super.paint(g);//防止黑屏

    g.drawImage(nightsky,0,0,null);

    plane.drawSelf(g);//画飞机

    if(plane.x <= Constant.GAME_WIDTH-plane.width && plane.x >= 30 && plane.y <= Constant.GAME_HEIGHT-30 && plane.y >= 0) plane.speed = 10;

    else plane.speed = -plane.speed;

    //画出所有的炮弹

    for(int i=0;i

    shells[i].draw(g);

    //检测炮弹是否和飞机相撞

    boolean peng = shells[i].getRect().intersects(plane.getRect());

    if(peng){

    plane.live = false;

    if(boom == null) { //如果不加这个if,飞机在碰到炮弹的时候会不停地生成爆炸类

    boom = new Explode(plane.x, plane.y);

    endTime = new Date();

    period = (int)((endTime.getTime() - startTime.getTime())/1000);

    }

    boom.draw(g);

    }

    //计时功能

    if(!plane.live) {

    g.setColor(Color.red);

    Font f = new Font("宋体",Font.BOLD,50);

    g.setFont(f);

    g.drawString("时间:" + period + "秒", (int) plane.x, (int) plane.y);

    }

    }

    g.setColor(c);

    /*Color c=g.getColor(); //保存先颜色,等使用完之后要复原为最初的颜色

    g.setColor(Color.BLUE);

    g.drawLine(100,100,300,300);//直线

    g.drawRect(100 ,100 ,300 ,300);//矩形

    g.drawOval(100,100,300,300);//椭圆

    g.fillRect(100,100,40,40);//填充矩形

    g.drawString("Ning",100 ,200);//写字符串

    g.drawImage(ball,250,250,null);

    g.setColor(c);

    随堂练习用,建立图片!!

    */

    }

    //多线程,帮助我们反复的重画窗口

    class PaintThread extends Thread{

    @Override

    public void run() {

    while(true){

    repaint(); //重画窗口

    try {

    Thread.sleep(40);//重画次数

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    //定义键盘监听的内部类

    class KeyMonitor extends KeyAdapter{

    @Override

    public void keyPressed(KeyEvent e) { plane.addDirection(e); }

    @Override

    public void keyReleased(KeyEvent e) {

    plane.minusDirection(e);

    }

    }

    /**

    *初始化窗口

    */

    public void launchFrame() {

    this.setTitle("拉 拉 人");/*给自己的窗口起个标题*/

    this.setVisible(true);/*默认窗口可见*/

    this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);/*给窗口设定大小*/

    this.setLocation(300,300);/*定义窗口的位置*/

    /**

    *关闭动作

    */

    this.addWindowListener(new WindowAdapter() {

    @Override

    public void windowClosing(WindowEvent e) {

    System.exit(0);/*表示正常结束*/

    }

    });

    //启动重画窗口的线程

    new PaintThread().start();

    //给窗口增加键盘的监听

    addKeyListener(new KeyMonitor());

    //初始化50个炮弹

    for(int i=0;i

    shells[i] = new Shell();

    }

    }

    public static class GameUtil {

    // 工具类最好将构造器私有化。

    private GameUtil() { }

    public static Image getImage(String path) {

    BufferedImage bi = null;

    try {

    URL u = GameUtil.class.getClassLoader().getResource(path);

    bi = ImageIO.read(u);

    } catch (IOException e) {

    e.printStackTrace();

    }

    return bi;

    }

    }

    public static void main(String[] args){

    PlayGameFrame f = new PlayGameFrame();

    f.launchFrame();

    }

    //添加双缓冲技术

    private Image offScreenImage = null;

    public void update(Graphics g) {

    if (offScreenImage == null)

    offScreenImage = this.createImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//这是游戏窗口的宽度和高度

    Graphics gOff = offScreenImage.getGraphics();

    paint(gOff);

    g.drawImage(offScreenImage, 0, 0, null);

    }

    }

    因为是初学,还有很多地方都不会,代码也写得不到位,我会慢慢学习并改正。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    展开全文
  • 今天我们制作一款类似银河战机的游戏导入素材并给它设置一下背景,把素材做成预设体等等 首先先上网找到我们需要的素材 Unity Asset Store - The Best Assets for Game MakingDiscover the best assets ...
  • 3.一键启动获取弹幕 4.打开里面的冲马桶 5.下载直播伴侣,点击获取窗口,点击开始直播 6.输入你的地址 7.完美运行 需要更多好的软件请私信我,或者查看我的频道,更多原创精品制作中。 下个预告是原创作品:云猜数字...
  • 背景滚动制作: 为了让游戏更具真实性的就是让玩家从视觉上感受飞机在前进,我们只需要将屏幕滚动达到视觉效果即可 首先我们把之前的background撤掉然后创建一个3D Object -> Quad改名叫backg 别忘了需要...
  • } } 顺带凑个字数提一嘴就是要设置Player,Enemy以及它们的子弹分别为不同层,防止出现“友军误伤”的事情, 分别挂载在它们的Prefab下即可 学习产出: 可见两边都开始发射子弹了 ,游戏就已经成功了一半了
  • Unity制作弹幕

    千次阅读 2020-01-06 19:17:22
    弹幕:ugui制作。 1.获取屏幕高度,然后看字号的大小进行均分n份。将text做成prefab用到的时候实例出来即可,如果弹幕太多可以使用资源池。 2.建一个数组长度为n,目的是:来一条弹幕,随机产生一个数来确定弹幕的...
  • 用 construct 2 制作简易弹幕游戏

    千次阅读 2017-11-20 06:05:55
    用 construct 2 制作简易弹幕游戏1 打开construct2 加入背景 3 建立新的图层4 在新的图层里加入素材超人 弹幕4 加入鼠标5 给超人和弹幕设置动作 超人的 弹幕的 6 加入文字框 7 编写代码完成啦!!!
  • } } 这个脚本使挂载到子弹Laser的游戏对象上的,下一期再讲 然后最后是Enemy脚本 内容如下 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour ...
  • } } 正题: ok我们现在开始制作敌人按指定路径以及敌人生成点脚本 首先你先创建一个空对象Path再给它几个子空对象,这是敌机需要移动的方向,然后用空物体的不同位置比如斜角的移动,只需要设置几个点就行,然后再...
  • 游戏中显示弹幕 创建节点 编写脚本 给游戏添加弹幕应该算是一种比较新鲜的想法。开发人员可以在弹幕中添加一些游戏玩法提示,这样可以一定程度上简化新手引导步骤。当然,弹幕也可以增加游戏的趣味性。现在让...
  • 制作弹幕游戏的时候,使用了Playable自定义的TimeLine。 小熊的上一篇完全理解笔记:https://blog.csdn.net/qq_34013247/article/details/120472131 本篇教程是上一篇的补充(感谢读者的私信,让我们一起变得更好?...
  • 重写弹幕射击游戏的记录

    千次阅读 2018-11-09 15:18:45
    上大学之后我一直在学习游戏开发,最开始是直接使用Easyx这个绘图库做Dos下的游戏,当时学习了C++和数据结构之后正巧有个数据结构课程设计,就心生了要做这个游戏的想法。我算是那种有想法就想着去做的人(有时候也...
  • 前言就在最近这几年,弹幕这个东西慢慢地流行了起来。我们在网上看视频或者看直播都能见到弹幕的身影,有时候弹幕的内容甚至比视频本身内容还要精彩。本人也是很喜欢弹幕这个东西,看到精彩处刷个弹幕都是常事。正好...
  • 学校举办民谣比赛、主持人大赛、元旦晚会、迎新晚会、毕业晚会之类的校园活动时候,参与的学生人数那叫一...弹幕功能大家都认识,逛过B站的都见识过这个好玩的弹幕设置,大屏幕上的弹幕功能其实和这个差不多,也是来...
  • gmk弹幕游戏测试

    2014-04-29 21:43:33
    gmk制作的一个弹幕测试类游戏,里面实现了基本的直线弹幕,长期存在的光线弹幕,和跟踪弹幕,和自动锁定弹幕
  • 整个教程大概有80个学时,同时也引入图像识别基础、算法基础、小游戏、爬虫、API设计基础、Excel文档操作、Numpy、Pandas、Matplotlib画图、数据库基础、网页WEB编程和Flask框架基础等,完成后将达到初级Python...
  • 这个游戏打算是用C#+GDI做~所以渲染效率上还是要进行一些考虑的public interface IRenderHandler{void Clear(Color backgroundColor);void DrawLine(int x1, int y1, int x2, int y2, Color color);void DrawBox(int...
  • 弹幕的功能在一些,需要滚动显示文字信息的场景下,还是很有需要。这里就模拟实现一下类似于B站弹幕的效果。 效果 如图的效果: 实现过程 实现的思路是一个管理脚本,加上一个移动文本的脚本,管理脚本随机颜色、...
  • C++实现弹幕

    2021-08-24 15:16:39
    #define WINVER 0x0501 #define _WIN32_WINNT 0x0501 #include <windows.h> #include <tchar.h> //全局变量 HINSTANCE hInst; UINT nDesktopWidth; UINT nDesktopHeight;... TCHA..
  • 布置场景: 我们先按Crtl+D复制一个之前创建好的Enemy Prefab,然后更改它的... } } 然后我们要给它们的路径以及数据记录创建好 首先是Path,新建一个让它按这种路径 其次是Wave 别忘了放在EnemySpawner上 游戏效果:
  • 只需要丢进模组文件夹、启动游戏、设定房间号即可连接直播弹幕服务器,实现在游戏内输出直播弹幕功能。具体效果如下图所示:目前支持 Bilibili,斗鱼和触手三个直播平台,均可通过配置进行调节;能够显示玩家发送...
  • 我最近开坑了一个类似东方project的弹幕游戏制作,由于之前没有经验(也就是说我是个小白),遇到弹幕碰撞时产生如下问题: 我有敌人的ArrayList<Enemy> 也有玩家的弹幕...
  • C++弹幕游戏自制分享

    2022-02-06 09:04:14
    一个弹幕射击游戏,有两种模式,第一种模式是类似飞机大战,第二种模式是boss挑战,boss的弹幕后续可以追加多种类型,用的是easyx图形库 #include<iostream> #include<conio.h> #include"easyx.h...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,183
精华内容 873
关键字:

弹幕游戏制作

友情链接: 运输调度问题.rar