main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package main
  2. import (
  3. "container/list"
  4. "image"
  5. "os"
  6. "time"
  7. "math"
  8. _ "image/png"
  9. "github.com/faiface/pixel"
  10. "github.com/faiface/pixel/pixelgl"
  11. "golang.org/x/image/colornames"
  12. //"fmt"
  13. )
  14. type Transform struct {
  15. P, S pixel.Vec
  16. R float64
  17. }
  18. type Behaviorer interface {
  19. Start()
  20. Update()
  21. GetOD() *Object
  22. }
  23. type Object struct {
  24. T Transform
  25. S *pixel.Sprite
  26. }
  27. type GopherPlayer struct {
  28. O Object
  29. MoveSpeed float64
  30. }
  31. var(
  32. dt float64
  33. lasttime time.Time
  34. win *pixelgl.Window
  35. goph_sprite *pixel.Sprite
  36. objects *list.List
  37. err error
  38. )
  39. func
  40. setDT(){
  41. dt = time.Since(lasttime).Seconds()
  42. lasttime = time.Now()
  43. }
  44. func loadPicture(path string) (pixel.Picture, error) {
  45. file, err := os.Open(path)
  46. if err != nil {
  47. return nil, err
  48. }
  49. defer file.Close()
  50. img, _, err := image.Decode(file)
  51. if err != nil {
  52. return nil, err
  53. }
  54. return pixel.PictureDataFromImage(img), nil
  55. }
  56. func
  57. AddObject(o Behaviorer) {
  58. objects.PushBack(o)
  59. o.Start()
  60. }
  61. func
  62. (g *GopherPlayer)Start() {
  63. }
  64. func
  65. (g *GopherPlayer)Update() {
  66. pos := &(g.O.T.P)
  67. angle := &(g.O.T.R)
  68. movSpeed := g.MoveSpeed
  69. if win.Pressed(pixelgl.MouseButtonLeft){
  70. click := win.MousePosition()
  71. direction := click.Sub(*pos)
  72. *angle = math.Atan(direction.Y/direction.X)
  73. if direction.X < 0 { *angle += math.Pi }
  74. }
  75. if win.Pressed(pixelgl.KeyUp){
  76. pos.Y += movSpeed*dt
  77. }
  78. if win.Pressed(pixelgl.KeyDown){
  79. pos.Y -= movSpeed*dt
  80. }
  81. if win.Pressed(pixelgl.KeyRight){
  82. pos.X += movSpeed*dt
  83. }
  84. if win.Pressed(pixelgl.KeyLeft){
  85. pos.X -= movSpeed*dt
  86. }
  87. }
  88. func
  89. (g *GopherPlayer)GetOD() *Object {
  90. return &g.O
  91. }
  92. func run() {
  93. cfg := pixelgl.WindowConfig{
  94. Title: "Pixel Rocks!",
  95. Bounds: pixel.R(0, 0, 1024, 768),
  96. VSync: true,
  97. }
  98. win, err = pixelgl.NewWindow(cfg)
  99. if err != nil {
  100. panic(err)
  101. }
  102. win.SetSmooth(true)
  103. pic, err := loadPicture("../hiking.png")
  104. if err != nil {
  105. panic(err)
  106. }
  107. goph_sprite = pixel.NewSprite(pic, pic.Bounds())
  108. objects = list.New()
  109. goph_player := GopherPlayer{
  110. O: Object {
  111. T: Transform {
  112. P: win.Bounds().Center(),
  113. S: pixel.Vec{3, 1},
  114. },
  115. S: goph_sprite,
  116. },
  117. MoveSpeed: 200.0,
  118. }
  119. AddObject(&goph_player)
  120. goph_player1 := GopherPlayer{
  121. O: Object {
  122. T: Transform {
  123. P: pixel.ZV,
  124. S: pixel.Vec{1, 1},
  125. },
  126. S: goph_sprite,
  127. },
  128. MoveSpeed: 100.0,
  129. }
  130. AddObject(&goph_player1)
  131. lasttime = time.Now()
  132. for !win.Closed() {
  133. setDT()
  134. win.Clear(colornames.Whitesmoke)
  135. for e:= objects.Front() ; e != nil ; e = e.Next() {
  136. o := e.Value.(Behaviorer)
  137. o.Update()
  138. od := o.GetOD()
  139. finmat := pixel.IM.ScaledXY(pixel.ZV, od.T.S).Rotated(pixel.ZV, od.T.R).Moved(od.T.P)
  140. od.S.Draw(win, finmat)
  141. }
  142. win.Update()
  143. }
  144. }
  145. func main() {
  146. pixelgl.Run(run)
  147. }