RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 97|回复: 5

[教程] 在galgame中加入弹幕系统(不是东方的弹幕哦~)

[复制链接]
发表于 2020-10-11 22:03:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 13390163901 于 2020-10-12 09:27 编辑

直接上链接


[RenPy] 纯文本查看 复制代码
    class DPClass(renpy.Displayable):
        def __init__(self, child, pos, longs, **kwargs):
            # 向renpy.Displayable构造器传入额外的特性(property)。
            super(DPClass, self).__init__(**kwargs)
            # 子组件。
            self.child = renpy.displayable(child)
            # 子组件的位置。
            self.xpos = pos[0]
            self.ypos = pos[1]
            self.longs = 35 * len(longs)

            #子组件速度
            self.redrawtime = 0.01   # 多久刷新一次位置,越大刷新得越快
            self.redrawdistance = 2      # 每次刷新的默认偏移量,越大默认误差越大

            # 子组件是否运动
            self.move = False
            self.Move()

        def render(self, width, height, st, at):
            render = renpy.Render(self.longs, 35)
            render.place(self.child, self.xpos, self.ypos)
            return render

        def event(self, ev, x, y, st):
            return self.child.event(ev, x, y, st)

        def Move(self):
            if self.move == False:
                self.move = True
                Timer(0, self.Linear).start()

        def Linear(self):
            while(self.move and self.xpos > -self.longs):
                self.xpos -= self.redrawdistance
                renpy.redraw(self, 0)
                time.sleep(self.redrawtime)
            self.move = False

弹幕代码
[RenPy] 纯文本查看 复制代码
    class DanmuClass(object):
        def __init__(self):
            self.dp = [[], [], []]
            self.danmuBase = {}
            #{"0": ["你好", "z真不错"], "1": ["草", "哈哈哈哈", "z真不错"], "2": ["2333"], "3": ["2333", "真不戳", "早上好"], "4": ["2333", "6666"], "5": ["2333"]}

        def History(self):
            try:
                x = renpy.filter_text_tags(_history_list[len(_history_list)-1].what, allow=gui.history_allow_tags)
            except:
                x = ""
            return x

        def AddDanmu(self, j):
            danmuPos = [1280, 1280, 1280]
            test = 0
            try:
                for i in self.dp:
                    if i:
                        pos = i[len(i) - 1]
                        danmuPos[test] = max(pos.xpos + pos.longs, 1280)
                    test += 1
                if danmuPos[0] - 100 > danmuPos[1]:
                    if danmuPos[1] - 100 > danmuPos[2]:
                        channel = 2
                    else:
                        channel = 1
                else:
                    if danmuPos[0] - 100 > danmuPos[2]:
                        channel = 2
                    else:
                        channel = 0
                self.dp[channel].append(DPClass(Text(j, style="danmu_text"), [danmuPos[channel], 35 * channel], j))
            except:
                pass

        def Show(self):
            # return
            texts = self.History()
            if texts:
                try:
                    for j in self.danmuBase[texts]:
                        self.AddDanmu(j)
                except:
                    pass

        def Clear(self):
            for j in self.dp:
                for i in j:
                    i.move = False
                    del i

弹幕滚动
[RenPy] 纯文本查看 复制代码
class NodeClass(object):
        def __init__(self):
            self.header={'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 75.0.3770.100Safari / 537.36', 'Content-Type': "utf8"}
            self.hostname = socket.gethostname()
            self.ipaddr = socket.gethostbyname(self.hostname)
            self.comurl = "url"
        def get(self):
            self.url = self.comurl + "danmu/get"#
            self.result = requests.get(url=self.url, headers=self.header, timeout=5).text
            danmu.danmuBase = json.loads(self.result)
            # danmu.danmuBase = self.result
        def push(self, values):
            self.url = self.comurl + "danmu/push"#
            obj = danmu.History()
            self.result = requests.get(url=self.url, headers=self.header, params={"place": obj.encode('utf8'), "texts": values.encode('utf8')}, timeout=5).text
            danmu.AddDanmu(json.loads(self.result))

与后端交互
[RenPy] 纯文本查看 复制代码
var mysql = require('mysql');

exports.save = (pushin, callback) => {
  var connection = mysql.createConnection({
    host: 'localhost',
    user : 'root',
    password : '******',
    database : 'new'
  });
  connection.connect();
  console.log();
  connection.query('INSERT INTO danmu(place, texts) VALUES("' + pushin.place + '", "' + pushin.texts + '")', function (error, results, fields) {
    if (error) throw error;
    callback(null, pushin.texts)
  });
  connection.end();
}

exports.find = (callback) => {
  var connection = mysql.createConnection({
    host: 'localhost',
    user : 'root',
    password : '******',
    database : 'new'
  });

  connection.connect();
  connection.query('SELECT * FROM `danmu`', function (error, results, fields) {
    if (error) throw error;
    var danmus = {}
    for (var i of results) {
      if (danmus[i.place]){
        danmus[i.place].push(i.texts)
      } else {
        danmus[i.place] = [i.texts]
      }
    }
    console.log(danmus);
    callback(null, danmus);
  });
  connection.end();
}

与数据库交互

评分

参与人数 3干货 +8 收起 理由
BuErShen + 3 鼓励原创!
立笔犊 + 2 是自己做得吗?很牛
龙氏 + 3 作者本人?

查看全部评分

发表于 2020-10-12 00:14:49 | 显示全部楼层
脚本代码呢?还有这是转载吧。
回复 支持 反对

使用道具 举报

发表于 2020-10-12 00:17:00 | 显示全部楼层
龙氏 发表于 2020-10-12 00:14
脚本代码呢?还有这是转载吧。

不过挺期待这功能:

  • 添加个快捷菜单用于输入弹幕。
  • 记录玩家输入弹幕在那段剧情文本,其他玩家玩到哪里就显示对应弹幕。
  • 上传弹幕内容到服务器(估计要有屏蔽过滤功能)。
  • 玩家可以自由开启或关闭弹幕功能,开启功能,就链接服务器下载对应弹幕内容。


从此玩视觉小说游戏,有了不一样的(互动)体验,不再孤单.....

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-12 09:28:17 | 显示全部楼层
龙氏 发表于 2020-10-12 00:14
脚本代码呢?还有这是转载吧。

加了
回复 支持 反对

使用道具 举报

发表于 2020-10-15 10:43:18 | 显示全部楼层
虽然有些地方实现的有点怪,不过本来弹幕也算很高级的功能了,能做出来挺棒的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-15 12:41:28 | 显示全部楼层
立笔犊 发表于 2020-10-15 10:43
虽然有些地方实现的有点怪,不过本来弹幕也算很高级的功能了,能做出来挺棒的 ...

哪些地方比较奇怪呢?还望大神指点!我好再改改~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号 | 苏公网安备 32092302000068号 )

GMT+8, 2020-10-23 14:37 , Processed in 0.051049 second(s), 24 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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