func (ui *UIText) Draw() { if ui.text == "" { return } v := ui.align.Vector() v.X = (v.X * ui.width) v.Y = (v.Y * ui.height) mat := engine.TextureMaterial if ui.Font.IsSDF() { mat = engine.SDFMaterial } mat.Begin(ui.GameObject()) mp := mat.ProjMatrix mv := mat.ViewMatrix mm := mat.ModelMatrix tx := mat.Texture ti := mat.Tiling of := mat.Offset color := mat.AddColor _ = color ui.buffer.Bind(gl.ARRAY_BUFFER) mat.Verts.EnableArray() mat.Verts.AttribPointer(3, gl.FLOAT, false, 0, uintptr(0)) mat.UV.EnableArray() mat.UV.AttribPointer(2, gl.FLOAT, false, 0, uintptr(ui.texcoordsIndex)) camera := engine.GetScene().SceneBase().Camera view := camera.InvertedMatrix() model := engine.Identity() model.Translate(v.X, v.Y, 0) model.Mul(ui.GameObject().Transform().Matrix()) model.Translate(0.75, 0.75, 0) /* view := camera.Transform().Matrix() view = view.Invert() model := ui.GameObject().Transform().Matrix() */ mv.UniformMatrix4fv(false, view) mp.UniformMatrix4f(false, (*[16]float32)(camera.Projection)) mm.UniformMatrix4fv(false, model) ti.Uniform2f(1, 1) of.Uniform2f(0, 0) ui.Font.Bind() tx.Uniform1i(0) color.Uniform4f(ui.Color.R, ui.Color.G, ui.Color.B, ui.Color.A) gl.DrawArrays(gl.QUADS, 0, ui.vertexCount) }
func (m *Map) Draw() { if m.Layer < MainPlayer.Map.Layer { return } camera := engine.GetScene().SceneBase().Camera cameraPos := camera.Transform().WorldPosition() w, h := camera.ScreenSize() cameraPos.X -= w / 2 cameraPos.Y -= h / 2 //calculate max tiles on screen width := int(float32(engine.Width)/(m.TileSize-1)) + 2 height := int(float32(engine.Height)/(m.TileSize-1)) + 2 index := 0 for x := -1; x < width; x++ { for y := -1; y < height; y++ { var tilePos engine.Vector //Try to find tiles on screen tilePos.X = cameraPos.X + float32((x * int(m.TileSize-1))) tilePos.Y = cameraPos.Y + float32((y * int(m.TileSize-1))) //Get tile tileType, tx, ty := m.PositionToTile(tilePos) //Check if visible/exists if tileType.Type() != 0 { //Add to draw list m.uvs[index] = m.Sprite.UVs[tileType.Type()-1] pos, e := m.GetTilePos(tx, ty) if !e { panic("Does not exists") } m.positions[index] = pos m.rotations[index] = tileType.Angle() + m.Disco m.scales[index] = engine.NewVector2(m.TileSize+float32(int(m.Disco)%52), m.TileSize+float32(int(m.Disco)%52)) index++ //engine.DrawSprite(m.Sprite.Texture, m.Sprite.UVs[int(m.Tiles[tileIndex])], tilePos, engine.NewVector2(m.TileSize, m.TileSize), 0, engine.AlignCenter, engine.One) } if tileType.Type2() != 0 { //Add to draw list m.uvs[index] = m.Sprite.UVs[tileType.Type2()-1] pos, e := m.GetTilePos(tx, ty) if !e { panic("Does not exists") } m.positions[index] = pos m.rotations[index] = tileType.Angle2() + m.Disco m.scales[index] = engine.NewVector2(m.TileSize+float32(int(m.Disco)%52), m.TileSize+float32(int(m.Disco)%52)) index++ //engine.DrawSprite(m.Sprite.Texture, m.Sprite.UVs[int(m.Tiles[tileIndex])], tilePos, engine.NewVector2(m.TileSize, m.TileSize), 0, engine.AlignCenter, engine.One) } } } if m.EnableDisco { if m.DiscoStyle == 1 { m.Disco++ } else { m.Disco-- } if m.Disco > 50 { m.DiscoStyle = 0 } if m.Disco < 0 { m.DiscoStyle = 1 } } if index > 0 { engine.DrawSprites(m.Sprite.Texture, m.uvs[:index], m.positions[:index], m.scales[:index], m.rotations[:index], m.alings[:index], m.colors[:index]) } }
func (sp *ShipController) Update() { delta := float32(engine.DeltaTime()) r2 := sp.Transform().DirectionTransform(engine.Up) r3 := sp.Transform().DirectionTransform(engine.Left) ph := sp.GameObject().Physics rx, ry := r2.X*delta, r2.Y*delta rsx, rsy := r3.X*delta, r3.Y*delta jet := false back := false if input.KeyDown('W') { ph.Body.AddForce(sp.Speed*rx, sp.Speed*ry) jet = true } if input.KeyDown('S') { ph.Body.AddForce(-sp.Speed*rx, -sp.Speed*ry) jet = true back = true } rotSpeed := sp.RotationSpeed if input.KeyDown(input.KeyLshift) { rotSpeed = 100 } if sp.UseMouse { v := engine.GetScene().SceneBase().Camera.MouseWorldPosition() v = v.Sub(sp.Transform().WorldPosition()) v.Normalize() angle := float32(math.Atan2(float64(v.Y), float64(v.X))) * engine.DegreeConst angle = engine.LerpAngle(sp.Transform().Rotation().Z, float32(int((angle - 90))), delta*rotSpeed/50) sp.Transform().SetRotationf(angle) ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) if input.KeyDown('D') || input.KeyDown('E') { ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) ph.Body.AddForce(-sp.Speed*rsx, -sp.Speed*rsy) jet = true back = true } if input.KeyDown('A') || input.KeyDown('Q') { ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) ph.Body.AddForce(sp.Speed*rsx, sp.Speed*rsy) jet = true back = true } } else { r := sp.Transform().Rotation() if input.KeyDown('D') { ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) sp.Transform().SetRotationf(r.Z - rotSpeed*delta) jet = true back = true } if input.KeyDown('A') { ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) sp.Transform().SetRotationf(r.Z + rotSpeed*delta) jet = true back = true } if input.KeyDown('E') { ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) ph.Body.AddForce(-sp.Speed*rsx, -sp.Speed*rsy) jet = true back = true } if input.KeyDown('Q') { ph.Body.SetAngularVelocity(0) ph.Body.SetTorque(0) ph.Body.AddForce(sp.Speed*rsx, sp.Speed*rsy) jet = true back = true } } if input.MouseDown(input.MouseLeft) { if time.Now().After(sp.lastShoot) { sp.Shoot() sp.lastShoot = time.Now().Add(time.Millisecond * 200) } } if input.KeyPress('P') { engine.EnablePhysics = !engine.EnablePhysics } if input.KeyPress('T') { sp.UseMouse = !sp.UseMouse } if jet { for _, resize := range sp.JetFirePool { if back { resize.SetValues(0.1, 0.1, 0.2, 0.0, 0.2, 0.3) } else { resize.SetValues(0.2, 0.2, 0.3, 0.0, 0.6, 0.8) } } if !sp.JetFireParent.IsActive() { sp.JetFireParent.SetActive(true) for _, resize := range sp.JetFirePool { resize.State = 0 if back { resize.SetValues(0.1, 0.1, 0.2, 0.0, 0.2, 0.3) } else { resize.SetValues(0.2, 0.2, 0.3, 0.0, 0.6, 0.8) } } } } else { sp.JetFireParent.SetActive(false) } }