123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- package main
- import (
- "container/list"
- "image"
- "os"
- "time"
- "math"
- _ "image/png"
- "github.com/faiface/pixel"
- "github.com/faiface/pixel/pixelgl"
- "golang.org/x/image/colornames"
- //"fmt"
- )
- type Transform struct {
- P, S pixel.Vec
- R float64
- }
- type Behaviorer interface {
- Start()
- Update()
- GetOD() *Object
- }
- type Object struct {
- T Transform
- S *pixel.Sprite
- }
- type GopherPlayer struct {
- O Object
- MoveSpeed float64
- }
- var(
- dt float64
- lasttime time.Time
- win *pixelgl.Window
- goph_sprite *pixel.Sprite
- objects *list.List
- err error
- )
- func
- setDT(){
- dt = time.Since(lasttime).Seconds()
- lasttime = time.Now()
- }
- func loadPicture(path string) (pixel.Picture, error) {
- file, err := os.Open(path)
- if err != nil {
- return nil, err
- }
- defer file.Close()
- img, _, err := image.Decode(file)
- if err != nil {
- return nil, err
- }
- return pixel.PictureDataFromImage(img), nil
- }
- func
- AddObject(o Behaviorer) {
- objects.PushBack(o)
- o.Start()
- }
- func
- (g *GopherPlayer)Start() {
- }
- func
- (g *GopherPlayer)Update() {
- pos := &(g.O.T.P)
- angle := &(g.O.T.R)
- movSpeed := g.MoveSpeed
- if win.Pressed(pixelgl.MouseButtonLeft){
- click := win.MousePosition()
- direction := click.Sub(*pos)
- *angle = math.Atan(direction.Y/direction.X)
- if direction.X < 0 { *angle += math.Pi }
- }
- if win.Pressed(pixelgl.KeyUp){
- pos.Y += movSpeed*dt
- }
- if win.Pressed(pixelgl.KeyDown){
- pos.Y -= movSpeed*dt
- }
- if win.Pressed(pixelgl.KeyRight){
- pos.X += movSpeed*dt
- }
- if win.Pressed(pixelgl.KeyLeft){
- pos.X -= movSpeed*dt
- }
- }
- func
- (g *GopherPlayer)GetOD() *Object {
- return &g.O
- }
- func run() {
- cfg := pixelgl.WindowConfig{
- Title: "Pixel Rocks!",
- Bounds: pixel.R(0, 0, 1024, 768),
- VSync: true,
- }
- win, err = pixelgl.NewWindow(cfg)
- if err != nil {
- panic(err)
- }
- win.SetSmooth(true)
- pic, err := loadPicture("../hiking.png")
- if err != nil {
- panic(err)
- }
- goph_sprite = pixel.NewSprite(pic, pic.Bounds())
- objects = list.New()
- goph_player := GopherPlayer{
- O: Object {
- T: Transform {
- P: win.Bounds().Center(),
- S: pixel.Vec{3, 1},
- },
- S: goph_sprite,
- },
- MoveSpeed: 200.0,
- }
- AddObject(&goph_player)
-
- goph_player1 := GopherPlayer{
- O: Object {
- T: Transform {
- P: pixel.ZV,
- S: pixel.Vec{1, 1},
- },
- S: goph_sprite,
- },
- MoveSpeed: 100.0,
- }
- AddObject(&goph_player1)
- lasttime = time.Now()
- for !win.Closed() {
- setDT()
- win.Clear(colornames.Whitesmoke)
- for e:= objects.Front() ; e != nil ; e = e.Next() {
- o := e.Value.(Behaviorer)
- o.Update()
- od := o.GetOD()
- finmat := pixel.IM.ScaledXY(pixel.ZV, od.T.S).Rotated(pixel.ZV, od.T.R).Moved(od.T.P)
- od.S.Draw(win, finmat)
- }
- win.Update()
- }
- }
- func main() {
- pixelgl.Run(run)
- }
|