{"id":184,"date":"2026-07-15T16:20:53","date_gmt":"2026-07-15T07:20:53","guid":{"rendered":"https:\/\/tate.stars.ne.jp\/wpa\/?p=184"},"modified":"2026-07-15T16:20:54","modified_gmt":"2026-07-15T07:20:54","slug":"myplayer2cannon","status":"publish","type":"post","link":"https:\/\/tate.stars.ne.jp\/wpa\/myplayer2cannon.html","title":{"rendered":"myPlayer2Cannon"},"content":{"rendered":"<pre><code class=\"swift\">\nprivate canbullets!: Phaser.Physics.Arcade.Group;    \nprivate rectGroup!: Phaser.GameObjects.Group;\nprivate rect2!: Phaser.GameObjects.Rectangle;\nprivate myContainer!: Phaser.GameObjects.Container;\nprivate bulletSpeed: number = 800;\nprivate lastFired: number = 0;\nprivate fireRate: number = 2000; \/\/ \u767a\u5c04\u9593\u9694\uff08\u30df\u30ea\u79d2\u5358\u4f4d\u30021000ms = 1\u79d2\uff09\n\ncreate() {\nconst centerX = 400;\nconst centerY = 100;\n  \/\/ \u30b3\u30f3\u30c6\u30ca\u3092\u57fa\u70b9\u5ea7\u6a19\u306b\u4f5c\u6210\nthis.myContainer = this.add.container(centerX, centerY).setDepth(3);\n  \/\/ 2. 1\u3064\u76ee\u306eRectangle\u3092\u4f5c\u6210 (\u8d64\u8272)\n  \/\/ \u30b3\u30f3\u30c6\u30ca\u306e(0, 0)\u304c\u56de\u8ee2\u4e2d\u5fc3\u306b\u306a\u308b\u3088\u3046\u3001origin\u3092(0.5, 0.5)\u306b\u3059\u308b\n const rect1 = this.add.rectangle(0, 0, 100, 100, 0xff0000).setOrigin(0.5, 0.5);\n \/\/ 3. 2\u3064\u76ee\u306eRectangle\u3092\u4f5c\u6210 (\u9752\u8272)\n \/\/  rect2.setAngle(45);\n \/\/ \u30b3\u30f3\u30c6\u30ca\u306b2\u3064\u306eRectangle\u3092\u8ffd\u52a0\n  this.myContainer.add(rect1);\n \/\/const rect2 = this.add.rectangle(0, 50, 40, 40, 0x0000ff);\n const distance = 90;\n const angleRad = Phaser.Math.DegToRad(45); \/\/ 45\u5ea6\u3092\u30e9\u30b8\u30a2\u30f3\u306b\u5909\u63db\n  const x2 = Math.cos(angleRad) * distance;\n  const y2 = Math.sin(angleRad) * distance - 67;\n\n  this.rect2 = this.add.rectangle(x2, y2, 40, 30, 0x0000ff); \/\/ \u7dd1\u8272\n   this.rect2.setOrigin(0.5, 0.5);\n   \/\/ 2\u3064\u76ee\u306eRectangle\u81ea\u4f53\u308245\u5ea6\u56de\u8ee2\u3055\u305b\u3066\u304a\u304f\u3053\u3068\u3067\u3001\u5186\u306e\u63a5\u7dda\u65b9\u5411\u306b\u63c3\u3048\u308b\n  this.rect2.angle = 90;\n   this.myContainer.add(this.rect2);\n\n\/\/ 4. \u5f3e\u306e\u30b0\u30eb\u30fc\u30d7\u3092\u4f5c\u6210\uff08\u7269\u7406\u30a8\u30f3\u30b8\u30f3\u5bfe\u5fdc\uff09\n   this.canbullets = this.physics.add.group();\n}   \n   \n private fireBullet(angle: number) {\n\/\/ \u5927\u7832\u3068\u540c\u3058\u4f4d\u7f6e\u306b\u5f3e\uff08\u9ec4\u8272\u306e\u5c0f\u3055\u306a\u56db\u89d2\u5f62\uff09\u3092\u4f5c\u6210\n const bulletRect = this.add.rectangle(this.myContainer.x, this.myContainer.y, 10, 10, 0xffff00);\n\/\/ \u30b0\u30eb\u30fc\u30d7\u306b\u8ffd\u52a0\u3057\u3066\u7269\u7406\u30dc\u30c7\u30a3\u3092\u6709\u52b9\u5316\n this.canbullets.add(bulletRect);\nconst bulletBody = bulletRect.body as Phaser.Physics.Arcade.Body;\n \/\/ \u89d2\u5ea6\u304b\u3089 X\u65b9\u5411 \u3068 Y\u65b9\u5411 \u306e\u901f\u5ea6\uff08\u30d9\u30af\u30c8\u30eb\uff09\u3092\u8a08\u7b97\u3057\u3066\u5f3e\u306b\u30bb\u30c3\u30c8\n   const velocityX = Math.cos(angle) * this.bulletSpeed;\n   const velocityY = Math.sin(angle) * this.bulletSpeed;\n    bulletBody.setVelocity(velocityX, velocityY);\n }\n \nupdate(time: number, delta: number) {\n    \/\/ --- \u5927\u7832\u306e\u56de\u8ee2\u5236\u5fa1 ---\n   \/\/ \u5927\u7832\u304b\u3089\u30d7\u30ec\u30a4\u30e4\u30fc\u3078\u306e\u89d2\u5ea6\u3092\u8a08\u7b97\uff08\u30e9\u30b8\u30a2\u30f3\uff09\n  const angle = Phaser.Math.Angle.Between(this.myContainer.x, this.myContainer.y, this.player.x, this.player.y);\n  \/\/ \u5927\u7832\u306e\u898b\u305f\u76ee\u306e\u5411\u304d\u3092\u30d7\u30ec\u30a4\u30e4\u30fc\u306b\u5411\u3051\u308b\n this.myContainer.rotation = angle;\n  \/\/ --- \u5927\u7832\u306e\u767a\u5c04\u30bf\u30a4\u30de\u30fc\u5236\u5fa1 ---\n if (time > this.lastFired) {\n this.fireBullet(angle);\n  \/\/ \u4fee\u6b63\uff1a\u73fe\u5728\u6642\u523b\u306b\u9023\u5c04\u9593\u9694\uff08\u30df\u30ea\u79d2\u306a\u3069\uff09\u3092\u8db3\u3059\n    this.lastFired = time + this.fireRate;\n  }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>private canbullets!: Phaser.Ph&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-184","post","type-post","status-publish","format-standard","hentry","category-phaser4","category-typescript"],"_links":{"self":[{"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/comments?post=184"}],"version-history":[{"count":1,"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"predecessor-version":[{"id":185,"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/posts\/184\/revisions\/185"}],"wp:attachment":[{"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tate.stars.ne.jp\/wpa\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}