foodszhu 发表于 2013-3-31 11:54:34

Go语言+SDL写小游戏----HelloWorld

本帖最后由 foodszhu 于 2013-3-31 11:54 编辑

大家好!看上一篇的回复我就知道golang这种东西还是没有人会看得。。虽然已经料到但还是好伤心。。。所以我就不废话了。。。$61$



一个简单的SDL的HelloWorld
(SDL方面是参照lazy foo的很出名的SDL入门教程,网址:http://www.lazyfoo.net/SDL_tutorials/github上有个中文翻译版但没翻译完全 http://tjumyk.github.com/sdl-tutorial-cn/。。。
希望不算是抄袭。。素材也是用他的了)
对于一个go语言程序,一开头必须是包名,而如果要需要这个包运行,则包名必须是main,之后是所引入的包名,用 import 关键词进行引入,这里我们只需要引入sdl包来进行图片的显示

package main

import (
    "github.com/banthar/Go-SDL/sdl"
)

在golang 中, 函数用func关键词进行定义,一般是 func [结构名(可选)] 函数名 (参数列表) 返回值列表
这里我们直接定义main作为程序入口,然后定义一下变量。我们声明了两个sdl.Surface类型的指针。在这个程序里,我们要处理两张图像。表面(Surface)"hello"是我们即将加载并显示的图片,表面“screen”是屏幕上可见的窗口。
func main() {
    var hello, screen *sdl.Surface
      
go语言中变量声明方式跟javascript很类似,是用var关键词声明, 结构是 var 变量名列表 (*)变量类型。。与往常大部分C系语言不同的就是他将类型放到最后来进行声明。
    sdl.Init(sdl.INIT_EVERYTHING)
      defer sdl.Quit()
sdl.Init(sdl.INIT_EVERYTHING)初始化sdl的所有子系统,使我们能够使用sdl的图形函数
defer关键词提供一个延迟代码的作用,在其后的语句,会在函数的返回前才运行,这样可以方便我们进行这样的需要退出或者释放内存什么的(虽然golang有垃圾回收的)的工作,以免写到函数末忘记了。sdl.Quit()退出sdl系统

        screen = sdl.SetVideoMode(640, 480, 32, sdl.SWSURFACE)
        sdl.WM_SetCaption("你好世界", "")       
调用sdl.SetVideoMode() 是用来建立一个640像素宽、480像素高的32位(位/像素)窗口。其中最后一个参数sdl.SWSURFACE指定将表面存放在软件内存中。
sdl.WM_SetCaption("你好世界", "")设立窗口标题,第一个参数是标题名称,第二个参数是标题图标(windows下可能中文输出会有问题)
        hello = sdl.Load("hello.jpg")
        defer hello.Free()
sdl.Load提供一个函数进行一系列的读取,这里我们拿来读取图像,(在C绑定中应该是SDL_LoadBMP函数,如果要读取其他图片还是得用gfx库的。。但是golang省了!)
同样我们用defer让函数最后释放hello。。。这里函数用法就类似与C++或者python的方法调用,其实golang里是没有类这种概念的。。只有结构体,但是函数又提供了一个让函数绑定在结构体上的方法,让方法调用成为现实
        screen.Blit(nil, hello, nil)
        screen.Flip()
        sdl.Delay(3000)
}
整个程序最重要可能就是这句screen.Blit(nil, hello, nil),它将一个表面贴到另一个表面上,三个参数,第一个与第三个是目标表面的裁剪区域与源表面的裁剪区域,第二个参数是源表面,
这里我们就不详细解释。。
screen.Flip()更新窗口
为了不使窗口更新完就消失,我们就使用Delay函数延迟时间,参数以毫米为单位。最后程序结束

完整代码
package main

import (
        "github.com/banthar/Go-SDL/sdl"
)

func main() {
        var hello, screen *sdl.Surface
        sdl.Init(sdl.INIT_EVERYTHING)
        defer sdl.Quit()
        screen = sdl.SetVideoMode(640, 480, 32, sdl.SWSURFACE)
        sdl.WM_SetCaption("你好世界", "")
        hello = sdl.Load("hello.jpg")
        defer hello.Free()
        screen.Blit(nil, hello, nil)
        screen.Flip()
        sdl.Delay(3000)
}

helloworld图片

最终效果图


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

看这种人气程度的话。。。我觉得还是不用讲太详细了吧。。。。反正估计会做很多期。。做到简单的横版过关类游戏就不会做吧。。也不会设计渲染什么的。毕竟骗钱还是需要长久发展的

_Nozomi 发表于 2013-3-31 15:33:27

我之前也学Go来着,现在差不多都忘光了……这是之前写的一个小东西:
https://www.gn00.com/t-167282-1-1.html

wis 发表于 2013-3-31 16:01:18

小游戏

<?php
echo 'Welcome to HelloWord Game, please refresh this page';
?>

南南 发表于 2013-3-31 16:18:00

go的话我还是会看一看的
可惜最近没时间仔细研究啊

foodszhu 发表于 2013-3-31 16:31:03

Whisper1166 发表于 2013-3-31 15:33 static/image/common/back.gif
我之前也学Go来着,现在差不多都忘光了……这是之前写的一个小东西:
https://www.gn00.com/t-167282-1 ...

看起来略碉堡啊。。。。

_Nozomi 发表于 2013-3-31 16:35:27

foodszhu 发表于 2013-3-31 16:31
看起来略碉堡啊。。。。

就是把文件里面的图片按二进制按位取出而已

moxiagy 发表于 2013-3-31 23:23:27

@@25!!w学霸果然厉害,有源码参看吗。。真心想学一下解包

moxiagy 发表于 2013-3-31 23:24:54

@@22!! 没事的,这些当成学习笔记就好了,关于会不会有人看这些并不重要~~

foodszhu 发表于 2013-4-1 00:44:56

moxiagy 发表于 2013-3-31 23:24 static/image/common/back.gif
没事的,这些当成学习笔记就好了,关于会不会有人看这些并不重要~~

汗。。。学习笔记和教程还是有很多不同的。。。教程还是说的更多一些。。。不过看这个情况。。。
以后多写点C++的?。。。。感觉无论是GTK或者是SDL或者OpenCV/OpenGL感觉版里的人看得不多啊。

scropioczn 发表于 2013-6-26 02:56:50

啦啦啦,我也是Lazy Foo那里学的SDL,不过是C++上的。目前在搞openGL~

zw蓝魔 发表于 2013-7-2 20:25:49

先收藏
页: [1]
查看完整版本: Go语言+SDL写小游戏----HelloWorld